diff --git a/releases/bridge-native-v3/README.md b/releases/bridge-native-v3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..871670b8c9392065c13dea06cbd497af8cf38a47 --- /dev/null +++ b/releases/bridge-native-v3/README.md @@ -0,0 +1,160 @@ +# Bridge/WidowX handoff — memory assets verified + +**v3 implementation update:** `scripts/run_bridge_stage2_native.py` now exists. +See [native training instructions](code/docs/bridge_native_training.md). Its GPU training and +50/500-step acceptance remain NOT_RUN. The previously published v2 code snapshot +predates this implementation. Use v3 for the current code; the GPU readiness flag stays false. + +The v3 bundle contains the native trainer source and the verified v2 memory assets. +Use `releases/bridge-native-v3`. The earlier v1 upload was incomplete because +the Space's existing `.gitignore` silently omitted `.pt` files. It is retained +for provenance, not as a usable release. The publisher checks every remote +Git/LFS hash and preserves all pre-existing Space files and ignore rules. +Do not run `run_bridge_stage2_pilot.py`, `run_ipec_full_training.sh`, or +`run_widowx_training.sh` for this experiment: those historical paths use the old +policy contracts and/or old RoboCasa/IPEC initialization. + +## What is delivered + +- `memory/cte_30000_inference.pt`: the exact 177 model tensors of the selected + Bridge reached-state-delta CTE at step 30,000. No optimizer/RNG is exported. +- `memory/static_bank_3000/`: unchanged bank and its original manifest, selection, + support/query partition, and the shards needed to verify the original manifest. + Keys are `[3000,128]`, values `[3000,256]`, one entry per support episode. +- `memory/stage1_split.json`, `pilot_split.json`, and the separate CTE legacy and + policy native10 normalizers. +- `code/`: the actual ZeVA overlay source snapshot, including local/uncommitted + scripts, the native geometry contract helpers, tests, and handoff tools. +- `handoff_manifest.json`: per-file SHA256/size, exact upstream versions, data/VAE + provenance, CTE export-to-original tensor binding, and explicit readiness. + +The local original 30k CTE checkpoint is unchanged. Its SHA256 is +`5c94378ea87b875dd709d46cf7941cdb5ca33584df071fef254311c6bbab912e`. +It contained a Stage1 optimizer, so the downloadable inference export necessarily +has a **different file hash**. All model tensors were checked exactly equal; +the export manifest records both identities. The bank's original source-checkpoint +identity is preserved, not silently rewritten to the export hash. + +The original bank SHA256 remains +`bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb`. +Absolute paths in original provenance JSON are historical records only, not +runtime paths. Use bundle-relative paths and local CLI arguments. + +## Download and verify on another machine + +First obtain the release commit from the handoff message or publication receipt. +Replace `RELEASE_COMMIT` below with that full commit. Never substitute a moving +`main` when reproducing an experiment. + +```bash +hf download DanTim05/DynaTTT --repo-type space \ + --revision RELEASE_COMMIT --include 'releases/bridge-native-v3/*' \ + --local-dir ./zeva-transfer + +cd zeva-transfer/releases/bridge-native-v3 +python code/scripts/bridge_handoff.py verify --bundle . +``` + +That first check uses only the Python standard library. A successful memory check +does **not** imply training readiness: `training_ready` remains false. + +Install the pinned NVIDIA Cosmos Framework following its setup guide. ZeVA is an +overlay, not a stand-alone pip package. In a new dedicated workspace: + +```bash +git clone https://github.com/NVIDIA/cosmos-framework.git cosmos-framework +git -C cosmos-framework checkout --detach ee58e41467f33c49ddde08b4d0ef4923876a95ac + +# Run from the downloaded release directory; use an absolute path to the clone. +export BRIDGE_FRAMEWORK_DIR=/absolute/path/to/cosmos-framework +rsync -a --exclude=README.md ./code/ "$BRIDGE_FRAMEWORK_DIR/" +cd "$BRIDGE_FRAMEWORK_DIR" + +# Requires the CUDA/PyTorch prerequisites documented by this pinned framework. +uv sync --all-extras --group=cu128-train +source .venv/bin/activate +``` + +Run in the resulting environment, specifying the release directory: + +```bash +python -m unittest -v scripts.test_bridge_handoff scripts.test_bridge_native_contract +python -m scripts.bridge_handoff verify \ + --bundle /absolute/path/to/zeva-transfer/releases/bridge-native-v3 --deep +``` + +The export uses safe tensor/basic-type deserialization (`weights_only=True`). +It loads strictly into CTE and is frozen. Nothing here loads a policy checkpoint, +starts a training job, allocates GPUs, or stops another process. + +## Download pinned external dependencies + +```bash +python -m scripts.bridge_handoff download \ + --bundle /absolute/path/to/zeva-transfer/releases/bridge-native-v3 \ + --destination /large/disk/bridge-run --base --dataset --vae +``` + +The downloader uses: + +- `nvidia/Cosmos3-Nano@e59a53c25979a090fa8706c9acc0c254a6e89b92`, including + root configuration, transformer, vision encoder and tokenizer. A URL ending + in `/transformer` alone is not a complete training installation. +- `IPEC-COMMUNITY/bridge_orig_lerobot@0e9d76d07e9df3ea3eba257b2520d4913833fad2`. + Its metadata must match the CTE source hashes; no task strings are invented. +- The exact pinned Wan VAE revision recorded in the manifest. Expected SHA256: + `20eb789667fa5e60e7516bf509512f6cb61f01b0aa0695eadaea930c13892b36`. + +Use each machine's own HF/W&B credentials; no credentials are included here. +Before a full run, verify all expected per-episode parquet/image_0 video files, +not merely the presence of `meta/info.json`. + +## Fixed research design / release validation + +`code/configs/bridge_stage2_native_contract.json` describes the research contract. +The native launcher implements it; use the v3 source and +[training instructions](code/docs/bridge_native_training.md), alongside the included memory assets. +`verify --require-training-ready` still exits nonzero for this release +because its GPU acceptance has not passed. + +The native path must preserve: + +- Native policy `[B,32,10]` (XYZ + rot6d + gripper index 9), current absolute + proprio `[B,10]`, independent reached CTE7 (RPY, gripper index 6), runtime-verified + internal width 64 with padded channels masked. Labels come from adjacent raw + states through NVIDIA's transforms, not reached7 converted to 10D. +- Original Nano domain-7 action projections and shared action embedding. Compare + checkpoint/constructed/pre-optimizer hashes. No DROID specialist, RoboCasa, + old IPEC delta, old 7D policy, or old policy optimizer. +- Frozen shared understanding/reasoner, Wan VAE and CTE; train generation + `moe_gen/time_embedder/vae2llm/llm2vae`, domain7 action rows, and new ZeVA/proprio + modules. Never put the entire policy forward in no_grad. Use a real WAM vision + loss so llm2vae receives nonzero gradients. Other-domain rows must not change. +- A **new** trained/frozen Bridge query head (not supplied yet), pure frozen + understanding image+instruction readout 4096→1024→128, cosine top5/T=0.07. + Do not reuse a RoboCasa head or treat random queries as trained retrieval. +- Support/query separation; phase/effects from query prefixes only; one + transition per four actual controls, first completed effect at 16 controls, + last four effects only. No all-episode future context and no full-dataset cache. +- Native10 decoding must invert the tool/flange/OpenCV transforms and account + for the Simpler controller's previous target. Recompute reached7 from actual + before/after states only after env.step. +- Real runtime shape trace; 32 train/8 development 50-step engineering gate, + then 500-step fit gate, then continuous. The 8 development episodes are held + out from Stage2, not independent of CTE training. Log sampled actions, masks, + per-dimension/physical/gripper errors, BIT histogram, gradients and deltas. +- Generation/action/ZeVA LR 2e-5/1e-4/3e-5; domain tables weight_decay=0; + every 50 steps verify other-domain diff=0 and frozen hashes unchanged. +- Save resumable trainable replacements, optimizer/scheduler/RNG/data cursor + every 10k optimizer updates; never delete old checkpoints. Estimate ~91 GiB + per checkpoint with FP32-master Adam; plan disk capacity accordingly. + +50/500-step gates, full model runtime dimensions, online environment acceptance, +and continuous training are **NOT RUN**. CPU geometry/asset tests are not substitutes. + +## Licenses and provenance + +The source snapshot includes the original LICENSE/NOTICE/ATTRIBUTIONS. The +dataset, NVIDIA base and Wan VAE retain their respective upstream licenses. +The 3000-entry bank is derived from IPEC Bridge; it is not a copy of the raw videos. +No base model, raw dataset, policy optimizer, secret, or training log is redistributed. diff --git a/releases/bridge-native-v3/code/ATTRIBUTIONS.md b/releases/bridge-native-v3/code/ATTRIBUTIONS.md new file mode 100644 index 0000000000000000000000000000000000000000..756778770e6ed6668ba18ffe95f762d39c365e7f --- /dev/null +++ b/releases/bridge-native-v3/code/ATTRIBUTIONS.md @@ -0,0 +1,57534 @@ +DISTS-pytorch +MIT +https://github.com/dingkeyan93/DISTS +MIT License + +Copyright (c) 2020 Keyan Ding + +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. + + +Deprecated +MIT License +https://github.com/laurent-laporte-pro/deprecated +The MIT License (MIT) + +Copyright (c) 2017 Laurent LAPORTE + +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. + +Flask +BSD-3-Clause +https://github.com/pallets/flask/ +Copyright 2010 Pallets + +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. + + +GitPython +BSD-3-Clause +https://github.com/gitpython-developers/GitPython +Copyright (C) 2008, 2009 Michael Trier and contributors +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 the GitPython project 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. + + +ImageIO +BSD-2-Clause +https://github.com/imageio/imageio +Copyright (c) 2014-2025, imageio developers +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. + +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. + + + +Jinja2 +BSD License +https://github.com/pallets/jinja/ +Copyright 2007 Pallets + +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. + + +Markdown +BSD-3-Clause +https://Python-Markdown.github.io/ +BSD 3-Clause License + +Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +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. + + +MarkupSafe +BSD-3-Clause +https://github.com/pallets/markupsafe/ +Copyright 2010 Pallets + +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. + + +NATTEN +UNKNOWN +https://natten.org +MIT License + +Copyright (c) 2022 - 2026 Ali Hassani. + +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. + + +PyDispatcher +BSD License +https://github.com/mcfletch/pydispatcher +UNKNOWN + +PyOpenGL +BSD License +https://mcfletch.github.io/pyopengl/ +UNKNOWN + +PyYAML +MIT License +https://pyyaml.org/ +Copyright (c) 2017-2021 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +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. + + +Pygments +BSD License +https://pygments.org +Copyright (c) 2006-2022 by the respective authors (see AUTHORS file). +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. + +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. + + +SecretStorage +BSD-3-Clause +https://github.com/mitya57/secretstorage +Copyright 2012-2025 Dmitry Shachnev +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 University 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 REGENTS 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. + + +Send2Trash +BSD-3-Clause +https://github.com/arsenetar/send2trash +Copyright (c) 2017, Virgil Dupras +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 Hardcoded Software 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 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. + + +Werkzeug +BSD-3-Clause +https://github.com/pallets/werkzeug/ +Copyright 2007 Pallets + +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. + + +absl-py +Apache-2.0 +https://github.com/abseil/abseil-py + + 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. + + +accelerate +Apache Software License +https://github.com/huggingface/accelerate + 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. + + +aioboto3 +Apache Software License +https://github.com/terricain/aioboto3 +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 2015-2016 Nikolai Novik + + 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. + +aiobotocore +Apache-2.0 +https://github.com/aio-libs/aiobotocore +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 2015-2016 Nikolai Novik + + 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. + + +aiofiles +Apache Software License +https://github.com/Tinche/aiofiles +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. + + + +aiohappyeyeballs +Python Software Foundation License +https://github.com/aio-libs/aiohappyeyeballs +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. + + +aiohttp +Apache-2.0 AND MIT +https://github.com/aio-libs/aiohttp + Copyright aio-libs contributors. + + 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. + + +aiohttp-cors +Apache Software License +https://github.com/aio-libs/aiohttp-cors + 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 2015-2018 Vladimir Rutsky and aio-libs team + + 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. + + +aioitertools +MIT +https://aioitertools.omnilib.dev/en/latest/changelog.html +MIT License + +Copyright (c) 2022 Amethyst Reese + +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. + + +aiosignal +Apache Software License +https://github.com/aio-libs/aiosignal +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 2013-2019 Nikolay Kim and Andrew Svetlov + + 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. + + +annotated-doc +MIT +https://github.com/fastapi/annotated-doc +The MIT License (MIT) + +Copyright (c) 2025 Sebastián Ramírez + +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. + + +annotated-types +MIT License +https://github.com/annotated-types/annotated-types +The MIT License (MIT) + +Copyright (c) 2022 the 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. + + +antlr4-python3-runtime +BSD +http://www.antlr.org +UNKNOWN + +anyio +MIT License +https://anyio.readthedocs.io/en/stable/versionhistory.html +The MIT License (MIT) + +Copyright (c) 2018 Alex Grönholm + +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. + + +argon2-cffi +MIT +https://github.com/hynek/argon2-cffi/blob/main/CHANGELOG.md +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the argon2-cffi 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. + + +argon2-cffi-bindings +MIT +https://github.com/hynek/argon2-cffi-bindings/blob/main/CHANGELOG.md +The MIT License (MIT) + +Copyright (c) 2021 Hynek Schlawack + +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. + + +arrgh +MIT License + +Copyright (c) 2023 Nicholas Sharp + +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. + +https://github.com/nmwsharp/arrgh +MIT License + +Copyright (c) 2023 Nicholas Sharp + +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. + + +arrow +Apache Software License +https://github.com/arrow-py/arrow + 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 2023 Chris Smith + + 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. + + +asttokens +Apache 2.0 +https://github.com/gristlabs/asttokens + Apache License + Version 2.0, January 2004 + https://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 + + https://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. + + +astunparse +BSD License +https://github.com/simonpercivall/astunparse +LICENSE +======= + +Copyright (c) 2014, Simon Percivall +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 AST Unparser 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. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved" are retained +in Python alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +async-lru +MIT License +https://github.com/aio-libs/async-lru +The MIT License + +Copyright (c) 2018 aio-libs team https://github.com/aio-libs/ +Copyright (c) 2017 Ocean S. A. https://ocean.io/ +Copyright (c) 2016-2017 WikiBusiness Corporation http://wikibusiness.org/ + +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. + + +attrs +MIT +https://www.attrs.org/en/stable/changelog.html +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs 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. + + +audioop-lts +PSF-2.0 +https://github.com/AbstractUmbra/audioop +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. + + +av +BSD-3-Clause +https://pyav.basswood-io.com +Copyright retained by original committers. 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 the project 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 HOLDERS 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. + + +babel +BSD License +https://babel.pocoo.org/ +Copyright (c) 2013-2026 by the Babel Team, see AUTHORS for more information. + +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. + + +backports.zstd +PSF-2.0 +https://github.com/rogdham/backports.zstd +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" +are retained in Python alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. + + +beautifulsoup4 +MIT License +https://www.crummy.com/software/BeautifulSoup/bs4/ +Beautiful Soup is made available under the MIT license: + + Copyright (c) Leonard Richardson + + 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. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) James Graham +and other contributors + +Beautiful Soup has an optional dependency on the soupsieve library, +which is also made available under the MIT license. Copyright (c) +Isaac Muse + + +better-profanity +MIT License +https://github.com/snguyenthanh/better_profanity +Copyright (c) 2018 The Python Packaging Authority + +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. + + +bleach +Apache Software License +https://github.com/mozilla/bleach +Copyright (c) 2014-2017, Mozilla Foundation + +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. + + +blinker +MIT License +https://github.com/pallets-eco/blinker/ +Copyright 2010 Jason Kirtland + +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. + + +blobfile +Public Domain +https://github.com/blobfile/blobfile +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to + +boto3 +Apache-2.0 +https://github.com/boto/boto3 + + 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 + + +botocore +Apache-2.0 +https://github.com/boto/botocore + + 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 + + +braceexpand +MIT License +https://github.com/trendels/braceexpand +The MIT License (MIT) + +Copyright (c) 2015 Stanis Trendelenburg + +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. + + +bracex +MIT +https://github.com/facelessuser/bracex +MIT License + +Copyright (c) 2018 - 2025 Isaac Muse + +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. + + +brotli +MIT +https://github.com/google/brotli +Copyright (c) 2009, 2010, 2013-2016 by the Brotli 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. + + +cattrs +MIT License +https://catt.rs + +MIT License + +Copyright (c) 2016, Tin Tvrtković + +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. + + + +certifi +Mozilla Public License 2.0 (MPL 2.0) +https://github.com/certifi/python-certifi +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ + + +cffi +MIT +https://cffi.readthedocs.io/en/latest/whatsnew.html + +Except when otherwise stated (look for LICENSE files in directories or +information at the beginning of each file) all software and +documentation is licensed as follows: + + MIT No Attribution + + 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. + + 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. + + + +charset-normalizer +MIT +https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +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. + + +click +BSD-3-Clause +https://github.com/pallets/click/ +Copyright 2014 Pallets + +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. + + +cmake +Apache Software License; BSD License +https://cmake.org +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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. + + +colorful +MIT License +http://github.com/timofurrer/colorful +The MIT License (MIT) + +Copyright (c) 2017 Timo Furrer + +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. + + +comm +BSD License +https://github.com/ipython/comm +BSD 3-Clause License + +Copyright (c) 2022, Jupyter +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. + + +contourpy +BSD License +https://github.com/contourpy/contourpy +BSD 3-Clause License + +Copyright (c) 2021-2025, ContourPy Developers. +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. + + +cosmos3 +Apache Software License +https://research.nvidia.com/labs/dir/cosmos3 + 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. + + +coverage +Apache-2.0 +https://github.com/coveragepy/coveragepy + + 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 + + +cramjam +MIT +https://github.com/milesgranger/pyrus-cramjam +MIT License + +Copyright (c) 2020 Miles Granger + +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. + + +cryptography +Apache-2.0 OR BSD-3-Clause +https://github.com/pyca/cryptography +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made +under the terms of *both* these licenses. + + +cuda-bindings +LicenseRef-NVIDIA-SOFTWARE-LICENSE +https://github.com/NVIDIA/cuda-python +NVIDIA SOFTWARE LICENSE + +This license is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of the NVIDIA CUDA Python software and materials provided hereunder ("SOFTWARE"). + +This license can be accepted only by an adult of legal age of majority in the country in which the SOFTWARE is used. If you are under the legal age of majority, you must ask your parent or legal guardian to consent to this license. By taking delivery of the SOFTWARE, you affirm that you have reached the legal age of majority, you accept the terms of this license, and you take legal and financial responsibility for the actions of your permitted users. + +You agree to use the SOFTWARE only for purposes that are permitted by (a) this license, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions. + +1. LICENSE. Subject to the terms of this license, NVIDIA grants you a non-exclusive limited license to: (a) install and use the SOFTWARE, and (b) distribute the SOFTWARE subject to the distribution requirements described in this license. NVIDIA reserves all rights, title and interest in and to the SOFTWARE not expressly granted to you under this license. + +2. DISTRIBUTION REQUIREMENTS. These are the distribution requirements for you to exercise the distribution grant: +a. The terms under which you distribute the SOFTWARE must be consistent with the terms of this license, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA's intellectual property rights. +b. You agree to notify NVIDIA in writing of any known or suspected distribution or use of the SOFTWARE not in compliance with the requirements of this license, and to enforce the terms of your agreements with respect to distributed SOFTWARE. + +3. LIMITATIONS. Your license to use the SOFTWARE is restricted as follows: +a. The SOFTWARE is licensed for you to develop applications only for use in systems with NVIDIA GPUs. +b. You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the SOFTWARE or copies of the SOFTWARE. +c. You may not modify or create derivative works of any portion of the SOFTWARE. +d. You may not bypass, disable, or circumvent any technical measure, encryption, security, digital rights management or authentication mechanism in the SOFTWARE. +e. You may not use the SOFTWARE in any manner that would cause it to become subject to an open source software license. As examples, licenses that require as a condition of use, modification, and/or distribution that the SOFTWARE be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. +f. Unless you have an agreement with NVIDIA for this purpose, you may not use the SOFTWARE with any system or application where the use or failure of the system or application can reasonably be expected to threaten or result in personal injury, death, or catastrophic loss. Examples include use in avionics, navigation, military, medical, life support or other life critical applications. NVIDIA does not design, test or manufacture the SOFTWARE for these critical uses and NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such uses. +g. You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney's fees and costs incident to establishing the right of indemnification) arising out of or related to use of the SOFTWARE outside of the scope of this Agreement, or not in compliance with its terms. + +4. PRE-RELEASE. SOFTWARE versions identified as alpha, beta, preview, early access or otherwise as pre-release may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, availability, and reliability standards relative to commercial versions of NVIDIA software and materials. You may use a pre-release SOFTWARE version at your own risk, understanding that these versions are not intended for use in production or business-critical systems. + +5. OWNERSHIP. The SOFTWARE and the related intellectual property rights therein are and will remain the sole and exclusive property of NVIDIA or its licensors. The SOFTWARE is copyrighted and protected by the laws of the United States and other countries, and international treaty provisions. NVIDIA may make changes to the SOFTWARE, at any time without notice, but is not obligated to support or update the SOFTWARE. + +6. COMPONENTS UNDER OTHER LICENSES. The SOFTWARE may include NVIDIA or third-party components with separate legal notices or terms as may be described in proprietary notices accompanying the SOFTWARE. If and to the extent there is a conflict between the terms in this license and the license terms associated with a component, the license terms associated with the components control only to the extent necessary to resolve the conflict. + +7. FEEDBACK. You may, but don't have to, provide to NVIDIA any Feedback. "Feedback" means any suggestions, bug fixes, enhancements, modifications, feature requests or other feedback regarding the SOFTWARE. For any Feedback that you voluntarily provide, you hereby grant NVIDIA and its affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce, modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through multiple tiers of distributors) the Feedback without the payment of any royalties or fees to you. NVIDIA will use Feedback at its choice. + +8. NO WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. NVIDIA DOES NOT WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ALL ERRORS WILL BE CORRECTED. + +9. LIMITATIONS OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, PROJECT DELAYS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS LICENSE OR THE USE OR PERFORMANCE OF THE SOFTWARE, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY, EVEN IF NVIDIA HAS PREVIOUSLY BEEN ADVISED OF, OR COULD REASONABLY HAVE FORESEEN, THE POSSIBILITY OF SUCH DAMAGES. IN NO EVENT WILL NVIDIA'S AND ITS AFFILIATES TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS LICENSE EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS LIMIT. + +10. TERMINATION. Your rights under this license will terminate automatically without notice from NVIDIA if you fail to comply with any term and condition of this license or if you commence or participate in any legal proceeding against NVIDIA with respect to the SOFTWARE. NVIDIA may terminate this license with advance written notice to you if NVIDIA decides to no longer provide the SOFTWARE in a country or, in NVIDIA's sole discretion, the continued use of it is no longer commercially viable. Upon any termination of this license, you agree to promptly discontinue use of the SOFTWARE and destroy all copies in your possession or control. Your prior distributions in accordance with this license are not affected by the termination of this license. All provisions of this license will survive termination, except for the license granted to you. + +11. APPLICABLE LAW. This license will be governed in all respects by the laws of the United States and of the State of Delaware as those laws are applied to contracts entered into and performed entirely within Delaware by Delaware residents, without regard to the conflicts of laws principles. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this Agreement in the English language. The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this license. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. + +12. NO ASSIGNMENT. This license and your rights and obligations thereunder may not be assigned by you by any means or operation of law without NVIDIA's permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect. + +13. EXPORT. The SOFTWARE is subject to United States export laws and regulations. You agree that you will not ship, transfer or export the SOFTWARE into any country, or use the SOFTWARE in any manner, prohibited by the United States Bureau of Industry and Security or economic sanctions regulations administered by the U.S. Department of Treasury's Office of Foreign Assets Control (OFAC), or any applicable export laws, restrictions or regulations. These laws include restrictions on destinations, end users and end use. By accepting this license, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the SOFTWARE. + +14. GOVERNMENT USE. The SOFTWARE has been developed entirely at private expense and is "commercial items" consisting of "commercial computer software" and "commercial computer software documentation" provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions in this license pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (b)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051. + +15. ENTIRE AGREEMENT. This license is the final, complete and exclusive agreement between the parties relating to the subject matter of this license and supersedes all prior or contemporaneous understandings and agreements relating to this subject matter, whether oral or written. If any court of competent jurisdiction determines that any provision of this license is illegal, invalid or unenforceable, the remaining provisions will remain in full force and effect. This license may only be modified in a writing signed by an authorized representative of each party. + +(v. May 12, 2021) + + +cuda-pathfinder +Apache-2.0 +https://github.com/NVIDIA/cuda-python + + 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 + + +cycler +BSD License +https://matplotlib.org/cycler/ +Copyright (c) 2015, matplotlib project +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 the matplotlib project 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. + +dataclasses-json +MIT License +https://github.com/lidatong/dataclasses-json +MIT License + +Copyright (c) 2019 Charles Li and 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. + + +datasets +Apache Software License +https://github.com/huggingface/datasets + + 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. + + +debugpy +MIT License +https://aka.ms/debugpy + debugpy + + Copyright (c) Microsoft Corporation + All rights reserved. + + 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. + + + +decorator +BSD License +UNKNOWN +Copyright (c) 2005-2025, Michele Simionato +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. + +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 +HOLDERS 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. + + +deepdiff +MIT License +https://zepworks.com/deepdiff/ +The MIT License (MIT) + +Copyright (c) 2014 - 2021 Sep Dehpour (Seperman) and contributors +www.zepworks.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. + + + +defusedxml +Python Software Foundation License +https://github.com/tiran/defusedxml +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python +alone or in any derivative version, provided, however, that PSF's +License Agreement and PSF's notice of copyright, i.e., "Copyright (c) +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative +version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + + +diffusers +Apache Software License +https://github.com/huggingface/diffusers + 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. + + +dill +BSD License +https://github.com/uqfoundation/dill +Copyright (c) 2004-2016 California Institute of Technology. +Copyright (c) 2016-2025 The Uncertainty Quantification Foundation. +All rights reserved. + +This software is available subject to the conditions and terms laid +out below. By downloading and using this software you are agreeing +to the following conditions. + +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 names of the copyright holders nor the names of any of + the 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. + + + +distlib +Python Software Foundation License +https://github.com/pypa/distlib +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations (now Zope +Corporation, see http://www.zope.com). In 2001, the Python Software +Foundation (PSF, see http://www.python.org/psf/) was formed, a +non-profit organization created specifically to own Python-related +Intellectual Property. Zope Corporation is a sponsoring member of +the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.2 2.1.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2.1 2.2 2002 PSF yes + 2.2.2 2.2.1 2002 PSF yes + 2.2.3 2.2.2 2003 PSF yes + 2.3 2.2.2 2002-2003 PSF yes + 2.3.1 2.3 2002-2003 PSF yes + 2.3.2 2.3.1 2002-2003 PSF yes + 2.3.3 2.3.2 2002-2003 PSF yes + 2.3.4 2.3.3 2004 PSF yes + 2.3.5 2.3.4 2005 PSF yes + 2.4 2.3 2004 PSF yes + 2.4.1 2.4 2005 PSF yes + 2.4.2 2.4.1 2005 PSF yes + 2.4.3 2.4.2 2006 PSF yes + 2.4.4 2.4.3 2006 PSF yes + 2.5 2.4 2006 PSF yes + 2.5.1 2.5 2007 PSF yes + 2.5.2 2.5.1 2008 PSF yes + 2.5.3 2.5.2 2008 PSF yes + 2.6 2.5 2008 PSF yes + 2.6.1 2.6 2008 PSF yes + 2.6.2 2.6.1 2009 PSF yes + 2.6.3 2.6.2 2009 PSF yes + 2.6.4 2.6.3 2009 PSF yes + 2.6.5 2.6.4 2010 PSF yes + 3.0 2.6 2008 PSF yes + 3.0.1 3.0 2009 PSF yes + 3.1 3.0.1 2009 PSF yes + 3.1.1 3.1 2009 PSF yes + 3.1.2 3.1 2010 PSF yes + 3.2 3.1 2010 PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +Python Software Foundation; All Rights Reserved" are retained in Python alone or +in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + + +distro +Apache Software License +https://github.com/python-distro/distro +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. + + + +dm-tree +Apache Software License +https://github.com/deepmind/tree + + 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. + + +docstring_parser +MIT License +https://github.com/rr-/docstring_parser +The MIT License (MIT) + +Copyright (c) 2018 Marcin Kurczewski + +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. + + +donfig +MIT License +https://github.com/pytroll/donfig +Copyright (c) 2018- Donfig Developers +Copyright (c) 2014-2018, Anaconda, Inc. and 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. + + +einops +MIT License +https://github.com/arogozhnikov/einops +MIT License + +Copyright (c) 2018 Alex Rogozhnikov + +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. + + +einx +MIT +https://github.com/fferflo/einx +MIT License + +Copyright (c) 2023- Florian Fervers + +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. + + +evdev +BSD-3-Clause +https://github.com/gvalkov/python-evdev +Copyright (c) 2012-2025 Georgi Valkov. 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 author 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 AUTHORS OR +COPYRIGHT HOLDERS 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. + + +execnet +MIT +https://execnet.readthedocs.io/en/latest/ + + 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. + + +executing +MIT License +https://github.com/alexmojaki/executing +MIT License + +Copyright (c) 2019 Alex Hall + +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. + + +fastapi +MIT +https://github.com/fastapi/fastapi +The MIT License (MIT) + +Copyright (c) 2018 Sebastián Ramírez + +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. + + +fastjsonschema +BSD License +https://github.com/horejsek/python-fastjsonschema +Copyright (c) 2018, Michal Horejsek +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 the {organization} 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. + + +fastparquet +Apache Software License +https://github.com/dask/fastparquet/ + + 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 + +ffmpy +MIT +UNKNOWN +UNKNOWN + +filelock +MIT +https://github.com/tox-dev/py-filelock +MIT License + +Copyright (c) 2025 Bernát Gábor and 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. + + +flopth +UNKNOWN +UNKNOWN +MIT License + +Copyright (c) 2019 Yunfeng Wang + +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. + + +fonttools +MIT +http://github.com/fonttools/fonttools +MIT License + +Copyright (c) 2017 Just van Rossum + +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. + + +fqdn +Mozilla Public License 2.0 (MPL 2.0) +https://github.com/ypcrts/fqdn +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + + +frozendict +GNU Lesser General Public License v3 (LGPLv3) +https://github.com/Marco-Sulla/python-frozendict + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + +frozenlist +Apache-2.0 +https://github.com/aio-libs/frozenlist +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 2013-2019 Nikolay Kim and Andrew Svetlov + + 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. + + +fsspec +BSD-3-Clause +https://github.com/fsspec/filesystem_spec +BSD 3-Clause License + +Copyright (c) 2018, Martin Durant +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 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. + + +ftfy +Apache-2.0 +https://ftfy.readthedocs.io/en/latest/ +Copyright 2023 Robyn Speer + +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. + + +future +MIT License +https://python-future.org +Copyright (c) 2013-2024 Python Charmers, Australia + +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. + + +futureproof +MIT License +https://github.com/yeraydiazdiaz/futureproof +MIT License + +Copyright © 2019, Yeray Díaz Díaz + +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. + +fvcore +Apache 2.0 +https://github.com/facebookresearch/fvcore +UNKNOWN + +gast +BSD License +https://github.com/serge-sans-paille/gast/ +Copyright (c) 2016, Serge Guelton +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 HPCProject, Serge Guelton 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. + + + + +gitdb +BSD License +https://github.com/gitpython-developers/gitdb +Copyright (C) 2010, 2011 Sebastian Thiel and contributors +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 the GitDB project 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. + + +Additional Licenses +------------------- +The files at +gitdb/test/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.idx +and +gitdb/test/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack +are licensed under GNU GPL as part of the git source repository, +see http://en.wikipedia.org/wiki/Git_%28software%29 for more information. + +They are not required for the actual operation, which is why they are not found +in the distribution package. + + +glfw +MIT License +https://github.com/FlorianRhiem/pyGLFW +The MIT License (MIT) + +Copyright (c) 2013-2019 Florian Rhiem + +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. + + +google-api-core +Apache Software License +https://github.com/googleapis/google-cloud-python/tree/main/packages/google-api-core + + 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. + + +google-auth +Apache Software License +https://github.com/googleapis/google-auth-library-python + 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. + + +google-cloud-core +Apache Software License +https://github.com/googleapis/python-cloud-core + + 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. + + +google-cloud-storage +Apache Software License +https://github.com/googleapis/python-storage + + 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. + + +google-crc32c +UNKNOWN +https://github.com/googleapis/python-crc32c + + 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. + + +google-resumable-media +Apache Software License +https://github.com/googleapis/google-resumable-media-python + + 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. + + +googleapis-common-protos +Apache Software License +https://github.com/googleapis/google-cloud-python/tree/main/packages/googleapis-common-protos + + 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. + + +gradio +Apache-2.0 +https://github.com/gradio-app/gradio + 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. + + +gradio_client +Apache-2.0 +https://github.com/gradio-app/gradio +UNKNOWN + +groovy +MIT License +https://github.com/gradio-app/groovy + 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. + + +grpcio +Apache-2.0 +https://grpc.io + + 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. + +----------------------------------------------------------- + +BSD 3-Clause License + +Copyright 2016, Google Inc. + +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. + +----------------------------------------------------------- + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + + +h11 +MIT License +https://github.com/python-hyper/h11 +The MIT License (MIT) + +Copyright (c) 2016 Nathaniel J. Smith and other 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. + + +h5py +BSD-3-Clause +https://www.h5py.org/ +Copyright (c) 2008 Andrew Collette and contributors +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. + + +hatch +MIT +https://hatch.pypa.io/latest/ +MIT License + +Copyright (c) 2017-present Ofek Lev + +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. + + +hatchling +MIT +https://hatch.pypa.io/latest/ +MIT License + +Copyright (c) 2021-present Ofek Lev + +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. + + +hf-xet +Apache-2.0 +https://github.com/huggingface/xet-core + 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. + + +httpcore +BSD-3-Clause +https://www.encode.io/httpcore/ +Copyright © 2020, [Encode OSS Ltd](https://www.encode.io/). +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 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. + + +httptools +MIT +https://github.com/MagicStack/httptools +The MIT License + +Copyright (c) 2015 MagicStack Inc. http://magic.io + +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. + + +httpx +BSD-3-Clause +https://github.com/encode/httpx +Copyright © 2019, [Encode OSS Ltd](https://www.encode.io/). +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 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. + + +huggingface_hub +Apache Software License +https://github.com/huggingface/huggingface_hub + 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. + + +hvac +Apache Software License +https://github.com/hvac/hvac + 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. + + + +hydra-core +MIT License +https://github.com/facebookresearch/hydra +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +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. + + +hyperlink +MIT License +https://github.com/python-hyper/hyperlink +Copyright (c) 2017 +Glyph Lefkowitz +Itamar Turner-Trauring +Jean Paul Calderone +Adi Roiban +Amber Hawkie Brown +Mahmoud Hashemi +Wilfredo Sanchez Vega + +and others that have contributed code to the public domain. + +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. + + +idna +BSD-3-Clause +https://github.com/kjd/idna +BSD 3-Clause License + +Copyright (c) 2013-2025, Kim Davies and contributors. +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. + + +imagecodecs +BSD-3-Clause +https://www.cgohlke.com +BSD-3-Clause license + +Copyright (c) 2008-2026, Christoph Gohlke +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. + + +imageio-ffmpeg +BSD License +https://github.com/imageio/imageio-ffmpeg +BSD 2-Clause License + +Copyright (c) 2019-2025, imageio +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. + +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. + + +importlib_metadata +Apache-2.0 +https://github.com/python/importlib_metadata +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 2025 [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. + + +iniconfig +MIT +https://github.com/pytest-dev/iniconfig +The MIT License (MIT) + +Copyright (c) 2010 - 2023 Holger Krekel and others + +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. + + +iopath +MIT licensed, as found in the LICENSE file +https://github.com/facebookresearch/iopath +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +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. + + +ipycanvas +BSD License +https://github.com/jupyter-widgets-contrib/ipycanvas +Copyright (c) 2019 Martin Renou +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. + + +ipyevents +BSD License +https://github.com/mwcraig/ipyevents +Copyright (c) 2017, Matt Craig +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. + + +ipykernel +BSD-3-Clause +https://ipython.org +BSD 3-Clause License + +Copyright (c) 2015, IPython Development Team + +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. + + +ipython +BSD-3-Clause +https://ipython.org +============================= + The IPython licensing terms +============================= + +IPython is licensed under the terms of the Modified BSD License (also known as +New or Revised or 3-Clause BSD). See the LICENSE file. + + +About the IPython Development Team +---------------------------------- + +Fernando Perez began IPython in 2001 based on code from Janko Hauser + and Nathaniel Gray . Fernando is still +the project lead. + +The IPython Development Team is the set of all contributors to the IPython +project. This includes all of the IPython subprojects. + +The core team that coordinates development on GitHub can be found here: +https://github.com/ipython/. + +Our Copyright Policy +-------------------- + +IPython uses a shared copyright model. Each contributor maintains copyright +over their contributions to IPython. But, it is important to note that these +contributions are typically only changes to the repositories. Thus, the IPython +source code, in its entirety is not the copyright of any single person or +institution. Instead, it is the collective copyright of the entire IPython +Development Team. If individual contributors want to maintain a record of what +changes/contributions they have specific copyright on, they should indicate +their copyright in the commit message of the change, when they commit the +change to one of the IPython repositories. + +With this in mind, the following banner should be used in any source code file +to indicate the copyright and license terms: + +:: + + # Copyright (c) IPython Development Team. + # Distributed under the terms of the Modified BSD License. + + +ipython_pygments_lexers +BSD License +https://github.com/ipython/ipython-pygments-lexers +BSD 3-Clause License + +- Copyright (c) 2012-Present, IPython Development Team + +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 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. + + +ipywidgets +BSD License +http://jupyter.org +Copyright (c) 2015 Project Jupyter Contributors +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. + + +isoduration +ISC License (ISCL) +https://github.com/bolsote/isoduration +Copyright (c) 2020 Víctor Muñoz + +Permission to use, copy, modify, and 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. + + +itsdangerous +BSD License +https://github.com/pallets/itsdangerous/ +Copyright 2011 Pallets + +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. + + +jaraco.classes +MIT License +https://github.com/jaraco/jaraco.classes +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. + + +jaraco.context +MIT +https://github.com/jaraco/jaraco.context +MIT License + +Copyright (c) 2026 + +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. + + +jaraco.functools +MIT +https://github.com/jaraco/jaraco.functools +MIT License + +Copyright (c) 2025 + +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. + + +jedi +MIT License +https://github.com/davidhalter/jedi +All contributions towards Jedi are MIT licensed. + +------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) <2013> + +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. + + +jeepney +MIT +https://gitlab.com/takluyver/jeepney +The MIT License (MIT) + +Copyright (c) 2017 Thomas Kluyver + +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. + + +jiter +MIT License +https://github.com/pydantic/jiter/ +The MIT License (MIT) + +Copyright (c) 2022 to present Samuel Colvin + +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. + + +jmespath +MIT License +https://github.com/jmespath/jmespath.py +MIT License + +Copyright (c) 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved + +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. + + +joblib +BSD-3-Clause +https://joblib.readthedocs.io +BSD 3-Clause License + +Copyright (c) 2008-2021, The joblib developers. +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 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. + + +json5 +Apache Software License +https://github.com/dpranke/pyjson5 +Files: Everything except for the benchmarks/*.json files. + +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. + +--- + +File: benchmarks/64KB-min.json + +MIT License + +Copyright (c) Microsoft Corporation. + +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 + +--- + +File: benchmarks/bitly-usa-gov.json + +The MIT License (MIT) + +Copyright (c) 2017 Wes McKinney + +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. + +--- + +File: benchmarks/twitter.json + +The MIT License (MIT) + +Copyright (c) 2014 Milo Yip + +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. + + +jsonlines +BSD License +https://github.com/wbolster/jsonlines +*(This is the OSI approved 3-clause "New BSD License".)* + +Copyright © 2016, wouter bolsterlee + +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 the author nor the names of the 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. + + +jsonpointer +BSD License +https://github.com/stefankoegl/python-json-pointer +Copyright (c) 2011 Stefan Kögl +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. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + + +jsonschema +MIT +https://github.com/python-jsonschema/jsonschema +Copyright (c) 2013 Julian Berman + +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. + + +jsonschema-specifications +MIT +https://github.com/python-jsonschema/jsonschema-specifications +Copyright (c) 2022 Julian Berman + +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. + + +jupyter-compare-view +MIT License +UNKNOWN +MIT License + +Copyright (c) 2022 Octoframes + +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. + + +jupyter-events +BSD License +http://jupyter.org +BSD 3-Clause License + +Copyright (c) 2022-, Jupyter Development Team + +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. + + +jupyter-lsp +BSD License +https://github.com/jupyter-lsp/jupyterlab-lsp/issues +BSD 3-Clause License + +Copyright (c) 2022, jupyter-lsp contributors +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 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. + + +jupyter_client +BSD License +https://jupyter.org +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +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. + + +jupyter_core +BSD-3-Clause +https://jupyter.org +BSD 3-Clause License + +- Copyright (c) 2015-, Jupyter Development Team + +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. + + +jupyter_server +BSD License +https://jupyter-server.readthedocs.io +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +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. + + +jupyter_server_terminals +BSD License +https://jupyter.org +BSD 3-Clause License + +- Copyright (c) 2021-, Jupyter Development Team + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +All rights reserved. + +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. + + +jupyterlab +BSD License +https://jupyter.org +Copyright (c) 2015-2025 Project Jupyter Contributors +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. + +Semver File License +=================== + +The semver.py file is from https://github.com/podhmo/python-semver +which is licensed under the "MIT" license. See the semver.py file for details. + + +jupyterlab_pygments +BSD License +https://github.com/jupyterlab/jupyterlab_pygments +Copyright (c) 2015 Project Jupyter Contributors +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. + + +jupyterlab_server +BSD License +https://jupyterlab-server.readthedocs.io +Copyright (c) 2015-2017, Project Jupyter Contributors +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. + + +jupyterlab_widgets +BSD License +https://github.com/jupyter-widgets/ipywidgets +Copyright (c) 2015 Project Jupyter Contributors +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. + +------------------------------------------------------------------------------ + +This package bundles several JavaScript npm packages in the +jupyterlab_widgets/static directory. Their licenses (as packaged in their +distributions in the node_modules package installation directory) are copied +below. + +------------------------------------------------------------------------------ +From css-loader/LICENSE: + +Copyright JS Foundation and other 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. + +------------------------------------------------------------------------------ +From style-loader/LICENSE: + +Copyright JS Foundation and other 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. + +------------------------------------------------------------------------------ +From backbone/backbone.js + +// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org + +------------------------------------------------------------------------------ +From base-64/LICENSE + +The MIT License (MIT) + +Copyright (c) 2014 Jameson Little + +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. + +------------------------------------------------------------------------------ +From lodash/LICENSE + +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +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. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +------------------------------------------------------------------------------ +From d3-format/LICENSE: + +Copyright 2010-2015 Mike Bostock +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 the author nor the names of 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. + +------------------------------------------------------------------------------ +From noUISlider/LICENSE.md (https://github.com/leongersen/noUiSlider/blob/eca62f9e56aaf02f0841b36e7993adf8db3721d5/LICENSE.md) + +MIT License + +Copyright (c) 2019 Léon Gersen + +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. + +------------------------------------------------------------------ +From jquery/LICENSE.txt + +Copyright JS Foundation and other contributors, https://js.foundation/ + +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. + +------------------------------------------------------------------ +From semver/LICENSE: + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + +------------------------------------------------------------------ +From underscore/LICENSE + +Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +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. + + +keyring +MIT +https://github.com/jaraco/keyring +MIT License + +Copyright (c) 2025 + +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. + + +kiwisolver +BSD License +https://github.com/nucleic/kiwi +========================= + The Kiwi licensing terms +========================= +Kiwi is licensed under the terms of the Modified BSD License (also known as +New or Revised BSD), as follows: + +Copyright (c) 2013-2025, Nucleic Development Team + +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 the Nucleic Development Team 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. + +About Kiwi +---------- +Chris Colbert began the Kiwi project in December 2013 in an effort to +create a blisteringly fast UI constraint solver. Chris is still the +project lead. + +The Nucleic Development Team is the set of all contributors to the Nucleic +project and its subprojects. + +The core team that coordinates development on GitHub can be found here: +http://github.com/nucleic. The current team consists of: + +* Chris Colbert + +Our Copyright Policy +-------------------- +Nucleic uses a shared copyright model. Each contributor maintains copyright +over their contributions to Nucleic. But, it is important to note that these +contributions are typically only changes to the repositories. Thus, the Nucleic +source code, in its entirety is not the copyright of any single person or +institution. Instead, it is the collective copyright of the entire Nucleic +Development Team. If individual contributors want to maintain a record of what +changes/contributions they have specific copyright on, they should indicate +their copyright in the commit message of the change, when they commit the +change to one of the Nucleic repositories. + +With this in mind, the following banner should be used in any source code file +to indicate the copyright and license terms: + +#------------------------------------------------------------------------------ +# Copyright (c) 2013-2025, Nucleic Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file LICENSE, distributed with this software. +#------------------------------------------------------------------------------ + + +kornia +Apache Software License +https://kornia.github.io/ + 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 + + +kornia_rs +Apache Software License +http://kornia.org + 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. + + +lark +MIT License +https://github.com/lark-parser/lark +Copyright © 2017 Erez Shinan + +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. + + +lazy_loader +BSD License +https://github.com/scientific-python/lazy_loader +BSD 3-Clause License + +Copyright (c) 2022--2023, Scientific Python project +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. + + +lerobot +Apache Software License +https://huggingface.co/lerobot +Copyright 2024 The Hugging Face team. All rights reserved. + + 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. + + +## Some of lerobot's code is derived from Diffusion Policy, which is subject to the following copyright notice: + +MIT License + +Copyright (c) 2023 Columbia Artificial Intelligence and Robotics Lab + +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. + + +## Some of lerobot's code is derived from FOWM, which is subject to the following copyright notice: + +MIT License + +Copyright (c) 2023 Yunhai Feng + +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. + + +## Some of lerobot's code is derived from simxarm, which is subject to the following copyright notice: + +MIT License + +Copyright (c) 2023 Nicklas Hansen & Yanjie Ze + +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. + + +## Some of lerobot's code is derived from ALOHA, which is subject to the following copyright notice: + +MIT License + +Copyright (c) 2023 Tony Z. Zhao + +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. + +## Some of lerobot's code is derived from DETR, which is subject to the following copyright notice: + + 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 2020 - present, Facebook, Inc + + 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. + + +lightning +Apache Software License +https://github.com/Lightning-AI/lightning + 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 2018-2021 William Falcon + + 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. + + +lightning-utilities +Apache-2.0 +https://github.com/Lightning-AI/utilities + 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 2018-2021 William Falcon + + 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. + + +loguru +MIT License +https://github.com/Delgan/loguru +UNKNOWN + +lpips +BSD License +https://github.com/richzhang/PerceptualSimilarity +Copyright (c) 2018, Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman, Oliver Wang +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. + +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. + + + +lxml +BSD-3-Clause +https://lxml.de/ +BSD 3-Clause License + +Copyright (c) 2004 Infrae. 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 Infrae 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 INFRAE 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. + + +lz4 +BSD License +https://github.com/python-lz4/python-lz4 +Copyright (c) 2012-2013, Steeve Morin +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 Steeve Morin 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. + + +makefun +BSD License +https://github.com/smarie/python-makefun +BSD 3-Clause License + +Copyright (c) 2019-2022, Sylvain Marié, Schneider Electric Industries +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 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. + + +markdown-it-py +MIT License +https://github.com/executablebooks/markdown-it-py +MIT License + +Copyright (c) 2020 ExecutableBookProject + +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. + + +marshmallow +MIT License +https://github.com/marshmallow-code/marshmallow +Copyright Steven Loria and 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. + + +matplotlib +Python Software Foundation License +https://matplotlib.org +License agreement for matplotlib versions 1.3.0 and later +========================================================= + +1. This LICENSE AGREEMENT is between the Matplotlib Development Team +("MDT"), and the Individual or Organization ("Licensee") accessing and +otherwise using matplotlib software in source or binary form and its +associated documentation. + +2. Subject to the terms and conditions of this License Agreement, MDT +hereby grants Licensee a nonexclusive, royalty-free, world-wide license +to reproduce, analyze, test, perform and/or display publicly, prepare +derivative works, distribute, and otherwise use matplotlib +alone or in any derivative version, provided, however, that MDT's +License Agreement and MDT's notice of copyright, i.e., "Copyright (c) +2012- Matplotlib Development Team; All Rights Reserved" are retained in +matplotlib alone or in any derivative version prepared by +Licensee. + +3. In the event Licensee prepares a derivative work that is based on or +incorporates matplotlib or any part thereof, and wants to +make the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to matplotlib . + +4. MDT is making matplotlib available to Licensee on an "AS +IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR +LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING +MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF +THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between MDT and +Licensee. This License Agreement does not grant permission to use MDT +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using matplotlib , +Licensee agrees to be bound by the terms and conditions of this License +Agreement. + +License agreement for matplotlib versions prior to 1.3.0 +======================================================== + +1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the +Individual or Organization ("Licensee") accessing and otherwise using +matplotlib software in source or binary form and its associated +documentation. + +2. Subject to the terms and conditions of this License Agreement, JDH +hereby grants Licensee a nonexclusive, royalty-free, world-wide license +to reproduce, analyze, test, perform and/or display publicly, prepare +derivative works, distribute, and otherwise use matplotlib +alone or in any derivative version, provided, however, that JDH's +License Agreement and JDH's notice of copyright, i.e., "Copyright (c) +2002-2011 John D. Hunter; All Rights Reserved" are retained in +matplotlib alone or in any derivative version prepared by +Licensee. + +3. In the event Licensee prepares a derivative work that is based on or +incorporates matplotlib or any part thereof, and wants to +make the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to matplotlib. + +4. JDH is making matplotlib available to Licensee on an "AS +IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR +LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING +MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF +THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between JDH and +Licensee. This License Agreement does not grant permission to use JDH +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using matplotlib, +Licensee agrees to be bound by the terms and conditions of this License +Agreement. +---- + +This binary distrubution of Matplotlib can also bundle the following software +(depending on the build): + +Name: AMS Fonts +Files: matplotlib/tests/cmr10.pfb +Description: Type-1 version of one of Knuth's Computer Modern fonts +License: OFL-1.1 + The cmr10.pfb file is a Type-1 version of one of Knuth's Computer Modern fonts. + It is included here as test data only, but the following license applies. + + Copyright (c) 1997, 2009, American Mathematical Society (http://www.ams.org). + All Rights Reserved. + + "cmb10" is a Reserved Font Name for this Font Software. + "cmbsy10" is a Reserved Font Name for this Font Software. + "cmbsy5" is a Reserved Font Name for this Font Software. + "cmbsy6" is a Reserved Font Name for this Font Software. + "cmbsy7" is a Reserved Font Name for this Font Software. + "cmbsy8" is a Reserved Font Name for this Font Software. + "cmbsy9" is a Reserved Font Name for this Font Software. + "cmbx10" is a Reserved Font Name for this Font Software. + "cmbx12" is a Reserved Font Name for this Font Software. + "cmbx5" is a Reserved Font Name for this Font Software. + "cmbx6" is a Reserved Font Name for this Font Software. + "cmbx7" is a Reserved Font Name for this Font Software. + "cmbx8" is a Reserved Font Name for this Font Software. + "cmbx9" is a Reserved Font Name for this Font Software. + "cmbxsl10" is a Reserved Font Name for this Font Software. + "cmbxti10" is a Reserved Font Name for this Font Software. + "cmcsc10" is a Reserved Font Name for this Font Software. + "cmcsc8" is a Reserved Font Name for this Font Software. + "cmcsc9" is a Reserved Font Name for this Font Software. + "cmdunh10" is a Reserved Font Name for this Font Software. + "cmex10" is a Reserved Font Name for this Font Software. + "cmex7" is a Reserved Font Name for this Font Software. + "cmex8" is a Reserved Font Name for this Font Software. + "cmex9" is a Reserved Font Name for this Font Software. + "cmff10" is a Reserved Font Name for this Font Software. + "cmfi10" is a Reserved Font Name for this Font Software. + "cmfib8" is a Reserved Font Name for this Font Software. + "cminch" is a Reserved Font Name for this Font Software. + "cmitt10" is a Reserved Font Name for this Font Software. + "cmmi10" is a Reserved Font Name for this Font Software. + "cmmi12" is a Reserved Font Name for this Font Software. + "cmmi5" is a Reserved Font Name for this Font Software. + "cmmi6" is a Reserved Font Name for this Font Software. + "cmmi7" is a Reserved Font Name for this Font Software. + "cmmi8" is a Reserved Font Name for this Font Software. + "cmmi9" is a Reserved Font Name for this Font Software. + "cmmib10" is a Reserved Font Name for this Font Software. + "cmmib5" is a Reserved Font Name for this Font Software. + "cmmib6" is a Reserved Font Name for this Font Software. + "cmmib7" is a Reserved Font Name for this Font Software. + "cmmib8" is a Reserved Font Name for this Font Software. + "cmmib9" is a Reserved Font Name for this Font Software. + "cmr10" is a Reserved Font Name for this Font Software. + "cmr12" is a Reserved Font Name for this Font Software. + "cmr17" is a Reserved Font Name for this Font Software. + "cmr5" is a Reserved Font Name for this Font Software. + "cmr6" is a Reserved Font Name for this Font Software. + "cmr7" is a Reserved Font Name for this Font Software. + "cmr8" is a Reserved Font Name for this Font Software. + "cmr9" is a Reserved Font Name for this Font Software. + "cmsl10" is a Reserved Font Name for this Font Software. + "cmsl12" is a Reserved Font Name for this Font Software. + "cmsl8" is a Reserved Font Name for this Font Software. + "cmsl9" is a Reserved Font Name for this Font Software. + "cmsltt10" is a Reserved Font Name for this Font Software. + "cmss10" is a Reserved Font Name for this Font Software. + "cmss12" is a Reserved Font Name for this Font Software. + "cmss17" is a Reserved Font Name for this Font Software. + "cmss8" is a Reserved Font Name for this Font Software. + "cmss9" is a Reserved Font Name for this Font Software. + "cmssbx10" is a Reserved Font Name for this Font Software. + "cmssdc10" is a Reserved Font Name for this Font Software. + "cmssi10" is a Reserved Font Name for this Font Software. + "cmssi12" is a Reserved Font Name for this Font Software. + "cmssi17" is a Reserved Font Name for this Font Software. + "cmssi8" is a Reserved Font Name for this Font Software. + "cmssi9" is a Reserved Font Name for this Font Software. + "cmssq8" is a Reserved Font Name for this Font Software. + "cmssqi8" is a Reserved Font Name for this Font Software. + "cmsy10" is a Reserved Font Name for this Font Software. + "cmsy5" is a Reserved Font Name for this Font Software. + "cmsy6" is a Reserved Font Name for this Font Software. + "cmsy7" is a Reserved Font Name for this Font Software. + "cmsy8" is a Reserved Font Name for this Font Software. + "cmsy9" is a Reserved Font Name for this Font Software. + "cmtcsc10" is a Reserved Font Name for this Font Software. + "cmtex10" is a Reserved Font Name for this Font Software. + "cmtex8" is a Reserved Font Name for this Font Software. + "cmtex9" is a Reserved Font Name for this Font Software. + "cmti10" is a Reserved Font Name for this Font Software. + "cmti12" is a Reserved Font Name for this Font Software. + "cmti7" is a Reserved Font Name for this Font Software. + "cmti8" is a Reserved Font Name for this Font Software. + "cmti9" is a Reserved Font Name for this Font Software. + "cmtt10" is a Reserved Font Name for this Font Software. + "cmtt12" is a Reserved Font Name for this Font Software. + "cmtt8" is a Reserved Font Name for this Font Software. + "cmtt9" is a Reserved Font Name for this Font Software. + "cmu10" is a Reserved Font Name for this Font Software. + "cmvtt10" is a Reserved Font Name for this Font Software. + "euex10" is a Reserved Font Name for this Font Software. + "euex7" is a Reserved Font Name for this Font Software. + "euex8" is a Reserved Font Name for this Font Software. + "euex9" is a Reserved Font Name for this Font Software. + "eufb10" is a Reserved Font Name for this Font Software. + "eufb5" is a Reserved Font Name for this Font Software. + "eufb7" is a Reserved Font Name for this Font Software. + "eufm10" is a Reserved Font Name for this Font Software. + "eufm5" is a Reserved Font Name for this Font Software. + "eufm7" is a Reserved Font Name for this Font Software. + "eurb10" is a Reserved Font Name for this Font Software. + "eurb5" is a Reserved Font Name for this Font Software. + "eurb7" is a Reserved Font Name for this Font Software. + "eurm10" is a Reserved Font Name for this Font Software. + "eurm5" is a Reserved Font Name for this Font Software. + "eurm7" is a Reserved Font Name for this Font Software. + "eusb10" is a Reserved Font Name for this Font Software. + "eusb5" is a Reserved Font Name for this Font Software. + "eusb7" is a Reserved Font Name for this Font Software. + "eusm10" is a Reserved Font Name for this Font Software. + "eusm5" is a Reserved Font Name for this Font Software. + "eusm7" is a Reserved Font Name for this Font Software. + "lasy10" is a Reserved Font Name for this Font Software. + "lasy5" is a Reserved Font Name for this Font Software. + "lasy6" is a Reserved Font Name for this Font Software. + "lasy7" is a Reserved Font Name for this Font Software. + "lasy8" is a Reserved Font Name for this Font Software. + "lasy9" is a Reserved Font Name for this Font Software. + "lasyb10" is a Reserved Font Name for this Font Software. + "lcircle1" is a Reserved Font Name for this Font Software. + "lcirclew" is a Reserved Font Name for this Font Software. + "lcmss8" is a Reserved Font Name for this Font Software. + "lcmssb8" is a Reserved Font Name for this Font Software. + "lcmssi8" is a Reserved Font Name for this Font Software. + "line10" is a Reserved Font Name for this Font Software. + "linew10" is a Reserved Font Name for this Font Software. + "msam10" is a Reserved Font Name for this Font Software. + "msam5" is a Reserved Font Name for this Font Software. + "msam6" is a Reserved Font Name for this Font Software. + "msam7" is a Reserved Font Name for this Font Software. + "msam8" is a Reserved Font Name for this Font Software. + "msam9" is a Reserved Font Name for this Font Software. + "msbm10" is a Reserved Font Name for this Font Software. + "msbm5" is a Reserved Font Name for this Font Software. + "msbm6" is a Reserved Font Name for this Font Software. + "msbm7" is a Reserved Font Name for this Font Software. + "msbm8" is a Reserved Font Name for this Font Software. + "msbm9" is a Reserved Font Name for this Font Software. + "wncyb10" is a Reserved Font Name for this Font Software. + "wncyi10" is a Reserved Font Name for this Font Software. + "wncyr10" is a Reserved Font Name for this Font Software. + "wncysc10" is a Reserved Font Name for this Font Software. + "wncyss10" is a Reserved Font Name for this Font Software. + + This Font Software is licensed under the SIL Open Font License, Version 1.1. + This license is copied below, and is also available with a FAQ at: + http://scripts.sil.org/OFL + + ----------------------------------------------------------- + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + ----------------------------------------------------------- + + PREAMBLE + The goals of the Open Font License (OFL) are to stimulate worldwide + development of collaborative font projects, to support the font creation + efforts of academic and linguistic communities, and to provide a free and + open framework in which fonts may be shared and improved in partnership + with others. + + The OFL allows the licensed fonts to be used, studied, modified and + redistributed freely as long as they are not sold by themselves. The + fonts, including any derivative works, can be bundled, embedded, + redistributed and/or sold with any software provided that any reserved + names are not used by derivative works. The fonts and derivatives, + however, cannot be released under any other type of license. The + requirement for fonts to remain under this license does not apply + to any document created using the fonts or their derivatives. + + DEFINITIONS + "Font Software" refers to the set of files released by the Copyright + Holder(s) under this license and clearly marked as such. This may + include source files, build scripts and documentation. + + "Reserved Font Name" refers to any names specified as such after the + copyright statement(s). + + "Original Version" refers to the collection of Font Software components as + distributed by the Copyright Holder(s). + + "Modified Version" refers to any derivative made by adding to, deleting, + or substituting -- in part or in whole -- any of the components of the + Original Version, by changing formats or by porting the Font Software to a + new environment. + + "Author" refers to any designer, engineer, programmer, technical + writer or other person who contributed to the Font Software. + + PERMISSION & CONDITIONS + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Font Software, to use, study, copy, merge, embed, modify, + redistribute, and sell modified and unmodified copies of the Font + Software, subject to the following conditions: + + 1) Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + + 2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + + 3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + + 5) The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + + TERMINATION + This license becomes null and void if any of the above conditions are + not met. + + DISCLAIMER + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + OTHER DEALINGS IN THE FONT SOFTWARE. + + + +Name: BaKoMa Fonts +Files: matplotlib/mpl-data/fonts/ttf/cm*.ttf matplotlib/mpl-data/fonts/afm/cm*.afm +Description: Computer Modern Fonts in PostScript Type 1 and TrueType font formats. +License: BaKoMa Fonts Licence + BaKoMa Fonts Licence + -------------------- + + This licence covers two font packs (known as BaKoMa Fonts Collection, + which is available at `CTAN:fonts/cm/ps-type1/bakoma/'): + + 1) BaKoMa-CM (1.1/12-Nov-94) + Computer Modern Fonts in PostScript Type 1 and TrueType font formats. + + 2) BaKoMa-AMS (1.2/19-Jan-95) + AMS TeX fonts in PostScript Type 1 and TrueType font formats. + + Copyright (C) 1994, 1995, Basil K. Malyshev. All Rights Reserved. + + Permission to copy and distribute these fonts for any purpose is + hereby granted without fee, provided that the above copyright notice, + author statement and this permission notice appear in all copies of + these fonts and related documentation. + + Permission to modify and distribute modified fonts for any purpose is + hereby granted without fee, provided that the copyright notice, + author statement, this permission notice and location of original + fonts (http://www.ctan.org/tex-archive/fonts/cm/ps-type1/bakoma) + appear in all copies of modified fonts and related documentation. + + Permission to use these fonts (embedding into PostScript, PDF, SVG + and printing by using any software) is hereby granted without fee. + It is not required to provide any notices about using these fonts. + + Basil K. Malyshev + INSTITUTE FOR HIGH ENERGY PHYSICS + IHEP, OMVT + Moscow Region + 142281 PROTVINO + RUSSIA + + E-Mail: bakoma@mail.ru + or malyshev@mail.ihep.ru + + + + +Name: ColorBrewer Color Schemes +Files: lib/matplotlib/_cm.py +Description: Color schemes from ColorBrewer +License: Apache-2.0 + Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes + + Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University. + + 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. + + +Name: Courier 10 +Files: matplotlib/tests/Courier10PitchBT-Bold.pfb +Description: Courier 10 font, used in tests. +License: Bitstream-Charter + The Courier10PitchBT-Bold.pfb file is a Type-1 version of + Courier 10 Pitch BT Bold by Bitstream, obtained from + . It is included + here as test data only, but the following license applies. + + + (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. + + You are hereby granted permission under all Bitstream propriety rights + to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream + Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts + for any purpose and without restriction; provided, that this notice is + left intact on all copies of such fonts and that Bitstream's trademark + is acknowledged as shown below on all unmodified copies of the 4 Charter + Type 1 fonts. + + BITSTREAM CHARTER is a registered trademark of Bitstream Inc. + + + +Name: JSXTools resize observer +Files: +Description: Minimal polyfill for the ResizeObserver API +License: CC0-1.0 + # CC0 1.0 Universal + + ## Statement of Purpose + + The laws of most jurisdictions throughout the world automatically confer + exclusive Copyright and Related Rights (defined below) upon the creator and + subsequent owner(s) (each and all, an “owner”) of an original work of + authorship and/or a database (each, a “Work”). + + Certain owners wish to permanently relinquish those rights to a Work for the + purpose of contributing to a commons of creative, cultural and scientific works + (“Commons”) that the public can reliably and without fear of later claims of + infringement build upon, modify, incorporate in other works, reuse and + redistribute as freely as possible in any form whatsoever and for any purposes, + including without limitation commercial purposes. These owners may contribute + to the Commons to promote the ideal of a free culture and the further + production of creative, cultural and scientific works, or to gain reputation or + greater distribution for their Work in part through the use and efforts of + others. + + For these and/or other purposes and motivations, and without any expectation of + additional consideration or compensation, the person associating CC0 with a + Work (the “Affirmer”), to the extent that he or she is an owner of Copyright + and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and + publicly distribute the Work under its terms, with knowledge of his or her + Copyright and Related Rights in the Work and the meaning and intended legal + effect of CC0 on those rights. + + 1. Copyright and Related Rights. A Work made available under CC0 may be + protected by copyright and related or neighboring rights (“Copyright and + Related Rights”). Copyright and Related Rights include, but are not limited + to, the following: + 1. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + 2. moral rights retained by the original author(s) and/or performer(s); + 3. publicity and privacy rights pertaining to a person’s image or likeness + depicted in a Work; + 4. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(i), below; + 5. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + 6. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + 7. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations + thereof. + + 2. Waiver. To the greatest extent permitted by, but not in contravention of, + applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and + unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright + and Related Rights and associated claims and causes of action, whether now + known or unknown (including existing as well as future claims and causes of + action), in the Work (i) in all territories worldwide, (ii) for the maximum + duration provided by applicable law or treaty (including future time + extensions), (iii) in any current or future medium and for any number of + copies, and (iv) for any purpose whatsoever, including without limitation + commercial, advertising or promotional purposes (the “Waiver”). Affirmer + makes the Waiver for the benefit of each member of the public at large and + to the detriment of Affirmer’s heirs and successors, fully intending that + such Waiver shall not be subject to revocation, rescission, cancellation, + termination, or any other legal or equitable action to disrupt the quiet + enjoyment of the Work by the public as contemplated by Affirmer’s express + Statement of Purpose. + + 3. Public License Fallback. Should any part of the Waiver for any reason be + judged legally invalid or ineffective under applicable law, then the Waiver + shall be preserved to the maximum extent permitted taking into account + Affirmer’s express Statement of Purpose. In addition, to the extent the + Waiver is so judged Affirmer hereby grants to each affected person a + royalty-free, non transferable, non sublicensable, non exclusive, + irrevocable and unconditional license to exercise Affirmer’s Copyright and + Related Rights in the Work (i) in all territories worldwide, (ii) for the + maximum duration provided by applicable law or treaty (including future time + extensions), (iii) in any current or future medium and for any number of + copies, and (iv) for any purpose whatsoever, including without limitation + commercial, advertising or promotional purposes (the “License”). The License + shall be deemed effective as of the date CC0 was applied by Affirmer to the + Work. Should any part of the License for any reason be judged legally + invalid or ineffective under applicable law, such partial invalidity or + ineffectiveness shall not invalidate the remainder of the License, and in + such case Affirmer hereby affirms that he or she will not (i) exercise any + of his or her remaining Copyright and Related Rights in the Work or (ii) + assert any associated claims and causes of action with respect to the Work, + in either case contrary to Affirmer’s express Statement of Purpose. + + 4. Limitations and Disclaimers. + 1. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + 2. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or + otherwise, including without limitation warranties of title, + merchantability, fitness for a particular purpose, non infringement, or + the absence of latent or other defects, accuracy, or the present or + absence of errors, whether or not discoverable, all to the greatest + extent permissible under applicable law. + 3. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person’s Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the Work. + 4. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + + For more information, please see + http://creativecommons.org/publicdomain/zero/1.0/. + + +Name: QHull +Files: matplotlib/_qhull.*.so +Description: Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection +License: Qhull + Qhull, Copyright (c) 1993-2020 + + C.B. Barber + Arlington, MA + + and + + The National Science and Technology Research Center for + Computation and Visualization of Geometric Structures + (The Geometry Center) + University of Minnesota + + email: qhull@qhull.org + + This software includes Qhull from C.B. Barber and The Geometry Center. + Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The + remaining files are copyrighted by C.B. Barber. Qhull is free software + and may be obtained via http from www.qhull.org. It may be freely copied, + modified, and redistributed under the following conditions: + + 1. All copyright notices must remain intact in all files. + + 2. A copy of this text file must be distributed along with any copies + of Qhull that you redistribute; this includes copies that you have + modified, or copies of programs or other software products that + include Qhull. + + 3. If you modify Qhull, you must include a notice giving the + name of the person performing the modification, the date of + modification, and the reason for such modification. + + 4. When distributing modified versions of Qhull, or other software + products that include Qhull, you must provide notice that the original + source code may be obtained as noted above. + + 5. There is no warranty or other guarantee of fitness for Qhull, it is + provided solely "as is". Bug reports or fixes may be sent to + qhull_bug@qhull.org; the authors may or may not act on them as + they desire. + + +Name: Qt4 Editor +Files: matplotlib/backends/qt_editor +Description: Module creating PyQt4 form dialogs/layouts to edit various type of parameters +License: MIT + Module creating PyQt4 form dialogs/layouts to edit various type of parameters + + + formlayout License Agreement (MIT License) + ------------------------------------------ + + Copyright (c) 2009 Pierre Raybaut + + 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. + """ + + +Name: Solarized +Files: matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle +Description: Solarized color scheme/style +License: MIT + https://github.com/altercation/solarized/blob/master/LICENSE + Copyright (c) 2011 Ethan Schoonover + + 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. + + +Name: Stix fonts +Files: matplotlib/mpl-data/fonts/ttf/STIX*.ttf +Description: STIX fonts +License: + TERMS AND CONDITIONS + + 1. Permission is hereby granted, free of charge, to any person + obtaining a copy of the STIX Fonts-TM set accompanying this license + (collectively, the "Fonts") and the associated documentation files + (collectively with the Fonts, the "Font Software"), to reproduce and + distribute the Font Software, including the rights to use, copy, merge + and publish copies of the Font Software, and to permit persons to whom + the Font Software is furnished to do so same, subject to the following + terms and conditions (the "License"). + + 2. The following copyright and trademark notice and these Terms and + Conditions shall be included in all copies of one or more of the Font + typefaces and any derivative work created as permitted under this + License: + + Copyright (c) 2001-2005 by the STI Pub Companies, consisting of + the American Institute of Physics, the American Chemical Society, the + American Mathematical Society, the American Physical Society, Elsevier, + Inc., and The Institute of Electrical and Electronic Engineers, Inc. + Portions copyright (c) 1998-2003 by MicroPress, Inc. Portions copyright + (c) 1990 by Elsevier, Inc. All rights reserved. STIX Fonts-TM is a + trademark of The Institute of Electrical and Electronics Engineers, Inc. + + 3. You may (a) convert the Fonts from one format to another (e.g., + from TrueType to PostScript), in which case the normal and reasonable + distortion that occurs during such conversion shall be permitted and (b) + embed or include a subset of the Fonts in a document for the purposes of + allowing users to read text in the document that utilizes the Fonts. In + each case, you may use the STIX Fonts-TM mark to designate the resulting + Fonts or subset of the Fonts. + + 4. You may also (a) add glyphs or characters to the Fonts, or modify + the shape of existing glyphs, so long as the base set of glyphs is not + removed and (b) delete glyphs or characters from the Fonts, provided + that the resulting font set is distributed with the following + disclaimer: "This [name] font does not include all the Unicode points + covered in the STIX Fonts-TM set but may include others." In each case, + the name used to denote the resulting font set shall not include the + term "STIX" or any similar term. + + 5. You may charge a fee in connection with the distribution of the + Font Software, provided that no copy of one or more of the individual + Font typefaces that form the STIX Fonts-TM set may be sold by itself. + + 6. THE FONT SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK OR OTHER RIGHT. IN NO EVENT SHALL + MICROPRESS OR ANY OF THE STI PUB COMPANIES BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, INCLUDING, BUT NOT LIMITED TO, ANY GENERAL, + SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM OR OUT OF THE USE OR + INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT + SOFTWARE. + + 7. Except as contained in the notice set forth in Section 2, the + names MicroPress Inc. and STI Pub Companies, as well as the names of the + companies/organizations that compose the STI Pub Companies, shall not be + used in advertising or otherwise to promote the sale, use or other + dealings in the Font Software without the prior written consent of the + respective company or organization. + + 8. This License shall become null and void in the event of any + material breach of the Terms and Conditions herein by licensee. + + 9. A substantial portion of the STIX Fonts set was developed by + MicroPress Inc. for the STI Pub Companies. To obtain additional + mathematical fonts, please contact MicroPress, Inc., 68-30 Harrow + Street, Forest Hills, NY 11375, USA - Phone: (718) 575-1816. + + +Name: Yorick Colormaps +Files: lib/matplotlib/_cm.py +Description: Gist/Yorick colormaps +License: + BSD-style license for gist/yorick colormaps. + + Copyright: + + Copyright (c) 1996. The Regents of the University of California. + All rights reserved. + + Permission to use, copy, modify, and distribute this software for any + purpose without fee is hereby granted, provided that this entire + notice is included in all copies of any software which is or includes + a copy or modification of this software and in all copies of the + supporting documentation for such software. + + This work was produced at the University of California, Lawrence + Livermore National Laboratory under contract no. W-7405-ENG-48 between + the U.S. Department of Energy and The Regents of the University of + California for the operation of UC LLNL. + + + DISCLAIMER + + This software was prepared as an account of work sponsored by an + agency of the United States Government. Neither the United States + Government nor the University of California nor any of their + employees, makes any warranty, express or implied, or assumes any + liability or responsibility for the accuracy, completeness, or + usefulness of any information, apparatus, product, or process + disclosed, or represents that its use would not infringe + privately-owned rights. Reference herein to any specific commercial + products, process, or service by trade name, trademark, manufacturer, + or otherwise, does not necessarily constitute or imply its + endorsement, recommendation, or favoring by the United States + Government or the University of California. The views and opinions of + authors expressed herein do not necessarily state or reflect those of + the United States Government or the University of California, and + shall not be used for advertising or product endorsement purposes. + + + AUTHOR + + David H. Munro wrote Yorick and Gist. Berkeley Yacc (byacc) generated + the Yorick parser. The routines in Math are from LAPACK and FFTPACK; + MathC contains C translations by David H. Munro. The algorithms for + Yorick's random number generator and several special functions in + Yorick/include were taken from Numerical Recipes by Press, et. al., + although the Yorick implementations are unrelated to those in + Numerical Recipes. A small amount of code in Gist was adapted from + the X11R4 release, copyright M.I.T. -- the complete copyright notice + may be found in the (unused) file Gist/host.c. + + +matplotlib-inline +UNKNOWN +https://github.com/ipython/matplotlib-inline +BSD 3-Clause License + +Copyright (c) 2019-2022, IPython Development Team. +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. + + +mdurl +MIT License +https://github.com/executablebooks/mdurl +Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. +Copyright (c) 2021 Taneli Hukkinen + +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. + +-------------------------------------------------------------------------------- + +.parse() is based on Joyent's node.js `url` code: + +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +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. + + +mediapy +Apache Software License +https://github.com/google/mediapy + + 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. + + +megatron-core +BSD License +https://github.com/NVIDIA/Megatron-LM/megatron/core +The following applies to all files unless otherwise noted: + +# Copyright (c) 2019-2025, NVIDIA CORPORATION. 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 NVIDIA CORPORATION 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 ``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. + +-- + +This repository also contains code from Hugging Face Inc., Google Research, +Facebook (from their Fairseq, Dino, and ParlAI projects), Microsoft (from their +Swin-Transformer project), Philip Popien, the Mamba project (Tri Dao and +Albert Gu), and the Triton language and compiler project (Philippe Tillet and +OpenAI). Files from these organizations have notices at the top of each file. +Below are licenses used in those files, as indicated. + + +-------------------------------------------------------------------------------------- +-- LICENSE FOR Facebook, huggingface, Google Research, LLaVA, Mamba, TinyZero and vLLM code -- + + + 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 FOR +Facebook, Inc. and its affiliates, +Meta Platforms, Inc. and its affiliates, +Microsoft Corporation, +OpenGVLab/InternVL, +Triton language and compiler, +and DeepSeek. + +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. + +-------------------------------------------------------------------------------- +LICENSE FOR Thinking Machines Lab + +MIT License + +Copyright 2025 Thinking Machines Lab + +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 FOR +Meta Platforms, Inc. and affiliates. + +BSD License + +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 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. + + +mistune +BSD License +https://github.com/lepture/mistune +Copyright (c) 2014, Hsiaoming Yang + +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 the creator 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. + + +ml_dtypes +Apache-2.0 +https://github.com/jax-ml/ml_dtypes + + 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. + + +more-itertools +MIT +https://github.com/more-itertools/more-itertools +Copyright (c) 2012 Erik Rose + +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. + + +moviepy +MIT License +UNKNOWN +The MIT License (MIT) + +Copyright (c) 2015 Zulko + +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. + +mpmath +BSD License +http://mpmath.org/ +Copyright (c) 2005-2021 Fredrik Johansson and mpmath contributors + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b. 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. + c. 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 REGENTS 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. + + +msgpack +Apache-2.0 +https://msgpack.org/ +Copyright (C) 2008-2011 INADA Naoki + + 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. + + + +multi-storage-client +Apache-2.0 +https://github.com/NVIDIA/multi-storage-client +UNKNOWN + +multidict +Apache License 2.0 +https://github.com/aio-libs/multidict + Copyright 2016 Andrew Svetlov and aio-libs contributors + + 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. + + +multiprocess +BSD License +https://github.com/uqfoundation/multiprocess +Copyright (c) 2006-2008, R Oudkerk + +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 author nor the names of any contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + + +mypy_extensions +MIT +https://github.com/python/mypy_extensions +Mypy extensions are licensed under the terms of the MIT license, reproduced below. + += = = = = + +The MIT License + +Copyright (c) 2016-2017 Jukka Lehtosalo and 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. + += = = = = + + +nbclient +BSD License +https://jupyter.org +BSD 3-Clause License + +Copyright (c) 2020-, Jupyter Development Team + +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. + + +nbconvert +BSD License +https://jupyter.org +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +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. + + +nbformat +BSD License +https://jupyter.org +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +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. + + +nest-asyncio +BSD License +https://github.com/erdewit/nest_asyncio +BSD 2-Clause License + +Copyright (c) 2018-2020, Ewald de Wit +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. + +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. + + +networkx +BSD-3-Clause +https://networkx.org/ +NetworkX is distributed with the 3-clause BSD license. + +:: + + Copyright (c) 2004-2025, NetworkX Developers + Aric Hagberg + Dan Schult + Pieter Swart + 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 the NetworkX Developers 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. + + +ninja +Apache Software License; BSD License +http://ninja-build.org/ +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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. + + +nltk +Apache Software License +https://www.nltk.org/ + + 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. + + +notebook_shim +BSD License +UNKNOWN +BSD 3-Clause License + +Copyright (c) 2022 Project Jupyter Contributors +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. + + +numcodecs +MIT +https://github.com/zarr-developers/numcodecs +The MIT License (MIT) + +Copyright (c) 2015-2018 Zarr Developers + +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. + + +numpy +BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0 +https://numpy.org +Copyright (c) 2005-2025, NumPy Developers. +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 the NumPy Developers nor the names of any + 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. + +---- + + +---- + +This binary distribution of NumPy also bundles the following software: + + +Name: OpenBLAS +Files: numpy.libs/libscipy_openblas*.so +Description: bundled as a dynamically linked library +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause + Copyright (c) 2011-2014, The OpenBLAS Project + 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 OpenBLAS project 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. + + +Name: LAPACK +Files: numpy.libs/libscipy_openblas*.so +Description: bundled in OpenBLAS +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause-Open-MPI + Copyright (c) 1992-2013 The University of Tennessee and The University + of Tennessee Research Foundation. All rights + reserved. + Copyright (c) 2000-2013 The University of California Berkeley. All + rights reserved. + Copyright (c) 2006-2013 The University of Colorado Denver. All rights + reserved. + + $COPYRIGHT$ + + Additional copyrights may follow + + $HEADER$ + + 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 listed + in this license in the documentation and/or other materials + provided with the distribution. + + - Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + The copyright holders provide no reassurances that the source code + provided does not infringe any patent, copyright, or any other + intellectual property rights of third parties. The copyright holders + disclaim any liability to any recipient for claims brought against + recipient by any third party for infringement of that parties + intellectual property rights. + + 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. + + +Name: GCC runtime library +Files: numpy.libs/libgfortran*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libgfortran +License: GPL-3.0-or-later WITH GCC-exception-3.1 + Copyright (C) 2002-2017 Free Software Foundation, Inc. + + Libgfortran is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Libgfortran is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . + +---- + +Full text of license texts referred to above follows (that they are +listed below does not necessarily imply the conditions apply to the +present binary release): + +---- + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + +---- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +Name: libquadmath +Files: numpy.libs/libquadmath*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath +License: LGPL-2.1-or-later + + GCC Quad-Precision Math Library + Copyright (C) 2010-2019 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + + This file is part of the libquadmath library. + Libquadmath is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + Libquadmath is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +nvdlfw_inspect +Apache2 +https://github.com/NVIDIA/nvidia-dlfw-inspect + 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. + + +nvidia-cublas +LicenseRef-NVIDIA-Proprietary +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cuda-cupti +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cuda-nvrtc +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cuda-runtime +LicenseRef-NVIDIA-Proprietary +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cudnn-cu13 +LicenseRef-NVIDIA-Proprietary +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cudnn-frontend +NVIDIA Proprietary Software +https://github.com/nvidia/cudnn-frontend +MIT License + +Copyright (c) 2013-2022 Niels Lohmann + +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. + + +nvidia-cufft +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cufile +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-curand +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cusolver +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cusparse +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-cusparselt-cu13 +NVIDIA Proprietary Software +https://developer.nvidia.com/cusparselt +LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + +This license agreement, including exhibits attached ("Agreement”) is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of a NVIDIA software development kit (“SDK”). + +Each SDK has its own set of software and materials, but here is a description of the types of items that may be included in a SDK: source code, header files, APIs, data sets and assets (examples include images, textures, models, scenes, videos, native API input/output files), binary software, sample code, libraries, utility programs, programming code and documentation. + +This Agreement can be accepted only by an adult of legal age of majority in the country in which the SDK is used. + +If you are entering into this Agreement on behalf of a company or other legal entity, you represent that you have the legal authority to bind the entity to this Agreement, in which case “you” will mean the entity you represent. + +If you don’t have the required age or authority to accept this Agreement, or if you don’t accept all the terms and conditions of this Agreement, do not download, install or use the SDK. + +You agree to use the SDK only for purposes that are permitted by (a) this Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions. + +1. License. + +1.1 Grant + +Subject to the terms of this Agreement, NVIDIA hereby grants you a non-exclusive, non-transferable license, without the right to sublicense (except as expressly provided in this Agreement) to: + +(i) Install and use the SDK, + +(ii) Modify and create derivative works of sample source code delivered in the SDK, and + +(iii) Distribute those portions of the SDK that are identified in this Agreement as distributable, as incorporated in object code format into a software application that meets the distribution requirements indicated in this Agreement. + +1.2 Distribution Requirements + +These are the distribution requirements for you to exercise the distribution grant: + +(i) Your application must have material additional functionality, beyond the included portions of the SDK. + +(ii) The distributable portions of the SDK shall only be accessed by your application. + +(iii) The following notice shall be included in modifications and derivative works of sample source code distributed: “This software contains source code provided by NVIDIA Corporation.” + +(iv) Unless a developer tool is identified in this Agreement as distributable, it is delivered for your internal use only. + +(v) The terms under which you distribute your application must be consistent with the terms of this Agreement, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA’s intellectual property rights. Additionally, you agree that you will protect the privacy, security and legal rights of your application users. + +(vi) You agree to notify NVIDIA in writing of any known or suspected distribution or use of the SDK not in compliance with the requirements of this Agreement, and to enforce the terms of your agreements with respect to distributed SDK. + +1.3 Authorized Users + +You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the SDK from your secure network to perform work on your behalf. + +If you are an academic institution you may allow users enrolled or employed by the academic institution to access and use the SDK from your secure network. + +You are responsible for the compliance with the terms of this Agreement by your authorized users. If you become aware that your authorized users didn’t follow the terms of this Agreement, you agree to take reasonable steps to resolve the non-compliance and prevent new occurrences. + +1.4 Pre-Release SDK +The SDK versions identified as alpha, beta, preview or otherwise as pre-release, may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercial versions of NVIDIA software and materials. Use of a pre-release SDK may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. +You may use a pre-release SDK at your own risk, understanding that pre-release SDKs are not intended for use in production or business-critical systems. +NVIDIA may choose not to make available a commercial version of any pre-release SDK. NVIDIA may also choose to abandon development and terminate the availability of a pre-release SDK at any time without liability. +1.5 Updates + +NVIDIA may, at its option, make available patches, workarounds or other updates to this SDK. Unless the updates are provided with their separate governing terms, they are deemed part of the SDK licensed to you as provided in this Agreement. + +You agree that the form and content of the SDK that NVIDIA provides may change without prior notice to you. While NVIDIA generally maintains compatibility between versions, NVIDIA may in some cases make changes that introduce incompatibilities in future versions of the SDK. + +1.6 Third Party Licenses + +The SDK may come bundled with, or otherwise include or be distributed with, third-party software licensed by a NVIDIA supplier and/or open source software provided under an open source license. Use of third-party software is subject to the third-party license terms, or in the absence of third-party terms, the terms of this Agreement. Copyright to third party software is held by the copyright holders indicated in the third-party software or license. + +1.7 Reservation of Rights + +NVIDIA reserves all rights, title and interest in and to the SDK not expressly granted to you under this Agreement. + +2. Limitations. + +The following license limitations apply to your use of the SDK: + +2.1 You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the SDK or copies of the SDK. + +2.2 Except as expressly provided in this Agreement, you may not copy, sell, rent, sublicense, transfer, distribute, modify, or create derivative works of any portion of the SDK. For clarity, you may not distribute or sublicense the SDK as a stand-alone product. + +2.3 Unless you have an agreement with NVIDIA for this purpose, you may not indicate that an application created with the SDK is sponsored or endorsed by NVIDIA. + +2.4 You may not bypass, disable, or circumvent any encryption, security, digital rights management or authentication mechanism in the SDK. + +2.5 You may not use the SDK in any manner that would cause it to become subject to an open source software license. As examples, licenses that require as a condition of use, modification, and/or distribution that the SDK be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. + +2.6 Unless you have an agreement with NVIDIA for this purpose, you may not use the SDK with any system or application where the use or failure of the system or application can reasonably be expected to threaten or result in personal injury, death, or catastrophic loss. Examples include use in avionics, navigation, military, medical, life support or other life critical applications. NVIDIA does not design, test or manufacture the SDK for these critical uses and NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such uses. + +2.7 You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney’s fees and costs incident to establishing the right of indemnification) arising out of or related to your use of the SDK outside of the scope of this Agreement, or not in compliance with its terms. + +3. Ownership. + +3.1 NVIDIA or its licensors hold all rights, title and interest in and to the SDK and its modifications and derivative works, including their respective intellectual property rights, subject to your rights under Section 3.2. This SDK may include software and materials from NVIDIA’s licensors, and these licensors are intended third party beneficiaries that may enforce this Agreement with respect to their intellectual property rights. + +3.2 You hold all rights, title and interest in and to your applications and your derivative works of the sample source code delivered in the SDK, including their respective intellectual property rights, subject to NVIDIA’s rights under section 3.1. + +3.3 You may, but don’t have to, provide to NVIDIA suggestions, feature requests or other feedback regarding the SDK, including possible enhancements or modifications to the SDK. For any feedback that you voluntarily provide, you hereby grant NVIDIA and its affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce, modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through multiple tiers of distributors) it without the payment of any royalties or fees to you. NVIDIA will use feedback at its choice. NVIDIA is constantly looking for ways to improve its products, so you may send feedback to NVIDIA through the developer portal at https://developer.nvidia.com. + +4. No Warranties. + +THE SDK IS PROVIDED BY NVIDIA “AS IS” AND “WITH ALL FAULTS.” TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. + +5. Limitations of Liability. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA’S AND ITS AFFILIATES TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS LIMIT. + +These exclusions and limitations of liability shall apply regardless if NVIDIA or its affiliates have been advised of the possibility of such damages, and regardless of whether a remedy fails its essential purpose. These exclusions and limitations of liability form an essential basis of the bargain between the parties, and, absent any of these exclusions or limitations of liability, the provisions of this Agreement, including, without limitation, the economic terms, would be substantially different. + +6. Termination. + +6.1 This Agreement will continue to apply until terminated by either you or NVIDIA as described below. + +6.2 If you want to terminate this Agreement, you may do so by stopping to use the SDK. + +6.3 NVIDIA may, at any time, terminate this Agreement if: (i) you fail to comply with any term of this Agreement and the non-compliance is not fixed within thirty (30) days following notice from NVIDIA (or immediately if you violate NVIDIA’s intellectual property rights); (ii) you commence or participate in any legal proceeding against NVIDIA with respect to the SDK; or (iii) NVIDIA decides to no longer provide the SDK in a country or, in NVIDIA’s sole discretion, the continued use of it is no longer commercially viable. + +6.4 Upon any termination of this Agreement, you agree to promptly discontinue use of the SDK and destroy all copies in your possession or control. Your prior distributions in accordance with this Agreement are not affected by the termination of this Agreement. Upon written request, you will certify in writing that you have complied with your commitments under this section. Upon any termination of this Agreement all provisions survive except for the licenses granted to you. + +7. General. + +If you wish to assign this Agreement or your rights and obligations, including by merger, consolidation, dissolution or operation of law, contact NVIDIA to ask for permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect. NVIDIA may assign, delegate or transfer this Agreement and its rights and obligations, and if to a non-affiliate you will be notified. + +You agree to cooperate with NVIDIA and provide reasonably requested information to verify your compliance with this Agreement. + +This Agreement will be governed in all respects by the laws of the United States and of the State of Delaware as those laws are applied to contracts entered into and performed entirely within Delaware by Delaware residents, without regard to the conflicts of laws principles. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this Agreement in the English language. + +The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this Agreement. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. + +If any court of competent jurisdiction determines that any provision of this Agreement is illegal, invalid or unenforceable, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law and the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. + +Each party acknowledges and agrees that the other is an independent contractor in the performance of this Agreement. + +The SDK has been developed entirely at private expense and is “commercial items” consisting of “commercial computer software” and “commercial computer software documentation” provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions in this Agreement pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (b)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051. + +The SDK is subject to United States export laws and regulations. You agree that you will not ship, transfer or export the SDK into any country, or use the SDK in any manner, prohibited by the United States Bureau of Industry and Security or economic sanctions regulations administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC), or any applicable export laws, restrictions or regulations. These laws include restrictions on destinations, end users and end use. By accepting this Agreement, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the SDK. + +Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email or fax. You agree that any notices that NVIDIA sends you electronically will satisfy any legal communication requirements. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department. + +This Agreement and any exhibits incorporated into this Agreement constitute the entire agreement of the parties with respect to the subject matter of this Agreement and supersede all prior negotiations or documentation exchanged between the parties relating to this subject matter. Any additional and/or conflicting terms on documents issued by you are null, void, and invalid. Any amendment or waiver under this Agreement shall be in writing and signed by representatives of both parties. + +(v. October 12, 2020) + + + + + + + + + + + + + + + +cuSPARSELt SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + +The terms in this supplement govern your use of the NVIDIA cuSPARSELt SDK under the terms of your license agreement (“Agreement”) as modified by this supplement. Capitalized terms used but not defined below have the meaning assigned to them in the Agreement. + +This supplement is an exhibit to the Agreement and is incorporated as an integral part of the Agreement. In the event of conflict between the terms in this supplement and the terms in the Agreement, the terms in this supplement govern. + +1. License Scope. The SDK is licensed for you to develop applications only for use in systems with NVIDIA GPUs. + +2. Distribution. The following portions of the SDK are distributable under the Agreement: the runtimes files ending with .so and .h as part of your application. + +3. Licensing. If the distribution terms in this Agreement are not suitable for your organization, or for any questions regarding this Agreement, please contact NVIDIA at nvidia-compute-license-questions@nvidia.com + +(v. October 12, 2020) + + +nvidia-dali-cuda120 +Apache License 2.0 +https://github.com/NVIDIA/dali + 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. + + + +nvidia-libnvcomp-cu12 +LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS +https://developer.nvidia.com/nvcomp +LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + +This license agreement("Agreement") is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of the NVIDIA nvCOMP software development kit as available at NVIDIA's discretion (each, a "SDK"). + +Each SDK has its own set of software and materials, but here is a description of the types of items that may be included in a SDK: source code, header files, APIs, data sets and assets (examples include images, textures, models, scenes, videos, native API input/output files), binary software, sample code, libraries, utility programs, programming code and documentation. + +This Agreement can be accepted only by an adult of legal age of majority in the country in which the SDK is used. + +If you are entering into this Agreement on behalf of a company or other legal entity, you represent that you have the legal authority to bind the entity to this Agreement, in which case "you" will mean the entity you represent. + +If you don't have the required age or authority to accept this Agreement, or if you don't accept all the terms and conditions of this Agreement, do not download, install or use the SDK. + +You agree to use the SDK only for purposes that are permitted by (a) this Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions. + +1. License. + +1.1 Grant + +Subject to the terms of this Agreement, NVIDIA hereby grants you a non-exclusive, non-transferable license, without the right to sublicense (except as expressly provided in this Agreement) to: + +(i) Install and use the SDK, + +(ii) Modify and create derivative works of sample source code delivered in the SDK, and + +(ii) Distribute the binary files, files identified as samples, and headers as incorporated into a software application that meets the distribution requirements indicated in this Agreement. + +1.2 Distribution Requirements + +These are the distribution requirements for you to exercise the distribution grant: + +(i) Your application must have material additional functionality, beyond the included portions of the SDK. + +(ii) The distributable portions of the SDK shall only be accessed by your application. + +(iii) The following notice shall be included in modifications and derivative works of sample source code distributed: "This software contains source code provided by NVIDIA Corporation." + +(iv) Unless a developer tool is identified in this Agreement as distributable, it is delivered for your internal use only. + +(v) The terms under which you distribute your application must be consistent with the terms of this Agreement, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA's intellectual property rights. Additionally, you agree that you will protect the privacy, security and legal rights of your application users. + +(vi) You agree to notify NVIDIA in writing of any known or suspected distribution or use of the SDK not in compliance with the requirements of this Agreement, and to enforce the terms of your agreements with respect to distributed SDK. + +1.3 Authorized Users + +You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the SDK from your secure network to perform work on your behalf. + +If you are an academic institution you may allow users enrolled or employed by the academic institution to access and use the SDK from your secure network. + +You are responsible for the compliance with the terms of this Agreement by your authorized users. If you become aware that your authorized users didn't follow the terms of this Agreement, you agree to take reasonable steps to resolve the non-compliance and prevent new occurrences. + +1.4 Pre-Release SDK + +The SDK versions identified as alpha, beta, preview or otherwise as pre-release, may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercial versions of NVIDIA software and materials. Use of a pre-release SDK may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. + +You may use a pre-release SDK at your own risk, understanding that pre-release SDKs are not intended for use in production or business-critical systems. + +NVIDIA may choose not to make available a commercial version of any pre-release SDK. NVIDIA may also choose to abandon development and terminate the availability of a pre-release SDK at any time without liability. + +1.5 Updates + +NVIDIA may, at its option, make available patches, workarounds or other updates to this SDK. Unless the updates are provided with their separate governing terms, they are deemed part of the SDK licensed to you as provided in this Agreement. + +You agree that the form and content of the SDK that NVIDIA provides may change without prior notice to you. While NVIDIA generally maintains compatibility between versions, NVIDIA may in some cases make changes that introduce incompatibilities in future versions of the SDK. + +1.6 Components Under Other Licenses. + +The SDK may include NVIDIA or third-party components with separate legal notices or terms as may be described in proprietary notices accompanying the SDK, such as components governed by open source software licenses. If and to the extent there is a conflict between the terms in this license and the license terms associated with a component, the license terms associated with the components control only to the extent necessary to resolve the conflict. + +1.7 Reservation of Rights + +NVIDIA reserves all rights, title and interest in and to the SDK not expressly granted to you under this Agreement. + +2. Limitations. + +The following license limitations apply to your use of the SDK: + +2.1 The SDK is licensed for you to develop applications only for use in systems with NVIDIA GPUs. + +2.2 You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the SDK or copies of the SDK. + +2.3 Except as expressly provided in this Agreement, you may not copy, sell, rent, sublicense, transfer, distribute, modify, or create derivative works of any portion of the SDK. + +2.4 Unless you have an agreement with NVIDIA for this purpose, you may not indicate that an application created with the SDK is sponsored or endorsed by NVIDIA. + +2.5 You may not bypass, disable, or circumvent any encryption, security, digital rights management or authentication mechanism in the SDK. + +2.6 You may not use the SDK in any manner that would cause it to become subject to an open source software license. As examples, licenses that require as a condition of use, modification, and/or distribution that the SDK be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. + +2.7 You acknowledge that the SDK as delivered is not tested or certified by NVIDIA for use in connection with the design, construction, maintenance, and/or operation of any system where the use or failure of such system could result in a situation that threatens the safety of human life or results in catastrophic damages (each, a "Critical Application"). Examples of Critical Applications include use in avionics, navigation, autonomous vehicle applications, ai solutions for automotive products, military, medical, life support or other life critical applications. NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such uses. You are solely responsible for ensuring that any product or service developed with the SDK as a whole includes sufficient features to comply with all applicable legal and regulatory standards and requirements. + +2.8 You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney's fees and costs incident to establishing the right of indemnification) arising out of or related to products or services that use the SDK in or for Critical Applications, and for use of the SDK outside of the scope of this Agreement, or not in compliance with its terms. + +3. Ownership. + +3.1 NVIDIA or its licensors hold all rights, title and interest in and to the SDK and its modifications and derivative works, including their respective intellectual property rights, subject to your rights under Section 3.2. This SDK may include software and materials from NVIDIA's licensors, and these licensors are intended third party beneficiaries that may enforce this Agreement with respect to their intellectual property rights. + +3.2 You hold all rights, title and interest in and to your applications and your derivative works of the sample source code delivered in the SDK, including their respective intellectual property rights, subject to NVIDIA's rights under section 3.1. + +3.3 You may, but don't have to, provide to NVIDIA suggestions, feature requests or other feedback regarding the SDK, including possible enhancements or modifications to the SDK. For any feedback that you voluntarily provide, you hereby grant NVIDIA and its affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce, modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through multiple tiers of distributors) it without the payment of any royalties or fees to you. NVIDIA will use feedback at its choice. + +4. No Warranties. + +THE SDK IS PROVIDED BY NVIDIA "AS IS" AND "WITH ALL FAULTS." TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. + +5. Limitations of Liability. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA'S AND ITS AFFILIATES TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS LIMIT. + +These exclusions and limitations of liability shall apply regardless if NVIDIA or its affiliates have been advised of the possibility of such damages, and regardless of whether a remedy fails its essential purpose. These exclusions and limitations of liability form an essential basis of the bargain between the parties, and, absent any of these exclusions or limitations of liability, the provisions of this Agreement, including, without limitation, the economic terms, would be substantially different. + +6. Termination. + +6.1 This Agreement will continue to apply until terminated by either you or NVIDIA as described below. + +6.2 If you want to terminate this Agreement, you may do so by stopping to use the SDK. + +6.3 NVIDIA may, at any time, terminate this Agreement if: (i) you fail to comply with any term of this Agreement and the non-compliance is not fixed within thirty (30) days following notice from NVIDIA (or immediately if you violate NVIDIA's intellectual property rights); (ii) you commence or participate in any legal proceeding against NVIDIA with respect to the SDK; or (iii) NVIDIA decides to no longer provide the SDK in a country or, in NVIDIA's sole discretion, the continued use of it is no longer commercially viable. + +6.4 Upon any termination of this Agreement, you agree to promptly discontinue use of the SDK and destroy all copies in your possession or control. Your prior distributions in accordance with this Agreement are not affected by the termination of this Agreement. Upon written request, you will certify in writing that you have complied with your commitments under this section. Upon any termination of this Agreement all provisions survive except for the licenses granted to you. + +7. General. + +If you wish to assign this Agreement or your rights and obligations, including by merger, consolidation, dissolution or operation of law, contact NVIDIA to ask for permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect. NVIDIA may assign, delegate or transfer this Agreement and its rights and obligations. + +You agree to cooperate with NVIDIA and provide reasonably requested information to verify your compliance with this Agreement. + +This Agreement will be governed in all respects by the laws of the United States and of the State of Delaware as those laws are applied to contracts entered into and performed entirely within Delaware, without regard to the conflicts of laws principles. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this Agreement in the English language. + +The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this Agreement. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. + +If any court of competent jurisdiction determines that any provision of this Agreement is illegal, invalid or unenforceable, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law and the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. + +Each party acknowledges and agrees that the other is an independent contractor in the performance of this Agreement. + +The SDK has been developed entirely at private expense and is "commercial items" consisting of "commercial computer software" and "commercial computer software documentation" provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions in this Agreement pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (b)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051. + +The SDK is subject to United States export laws and regulations. You agree that you will not ship, transfer or export the SDK into any country, or use the SDK in any manner, prohibited by the United States Bureau of Industry and Security or economic sanctions regulations administered by the U.S. Department of Treasury's Office of Foreign Assets Control (OFAC), or any applicable export laws, restrictions or regulations. These laws include restrictions on destinations, end users and end use. By accepting this Agreement, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the SDK. + +Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email or fax. You agree that any notices that NVIDIA sends you electronically will satisfy any legal communication requirements. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department. + +This Agreement constitutes the entire agreement of the parties with respect to the subject matter of this Agreement and supersedes all prior negotiations or documentation exchanged between the parties relating to this subject matter. Any additional and/or conflicting terms on documents issued by you are null, void, and invalid. Any amendment or waiver under this Agreement shall be in writing and signed by representatives of both parties. + +If the distribution terms in this Agreement are not suitable for your organization, or for any questions regarding this Agreement, please contact NVIDIA at nvidia-compute-license-questions@nvidia.com. + +(v. April 26, 2022) + + +nvidia-ml-py +BSD License +https://forums.developer.nvidia.com +UNKNOWN + +nvidia-nccl-cu13 +LicenseRef-NVIDIA-Proprietary +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-nvimgcodec-cu12 +Apache License 2.0 +https://github.com/NVIDIA/nvImageCodec +NVIDIA Software License Agreement + +IMPORTANT NOTICE – PLEASE READ AND AGREE BEFORE USING THE SOFTWARE. + +This license agreement (“Agreement”) is a legal agreement between you, whether an individual or entity (“you”) and NVIDIA Corporation (“NVIDIA”) and governs the use of the NVIDIA Image Codec and any additional software and materials provided under this Agreement (“Software”). + +This Agreement can be accepted only by an adult of legal age of majority in the country in which the Software is used. + +If you don’t have the required age or authority to accept this Agreement, or if you don’t accept all the terms and conditions of this Agreement, do not use the Software. + +You agree to use the Software only for purposes that are permitted by this Agreement and any applicable law or regulation in the relevant jurisdictions. + +1. License Grant. Subject to the terms of this Agreement, NVIDIA grants you a non-exclusive, revocable, non-transferable, non-sublicensable (except as expressly granted in this Agreement), license to: + +1.1 install and use copies of the Software, + +1.2 modify and create derivative works of sample or example Software provided by NVIDIA in source code format, and + +1.3 distribute the Software in binary format as incorporated into a software application subject to the following distribution requirements: + +(a) Your application must have material additional functionality, beyond the included portions of the Software. + +(b) The distributable portions of the Software shall only be accessed by your application. + +(c) The following notice shall be included in modifications and derivative works of sample source code distributed: “This software contains source code provided by NVIDIA Corporation.” + +(d) Unless a developer tool is identified in this Agreement as distributable, it is delivered for your internal use only. + +(e) The terms under which you distribute your application must be consistent with the terms of this Agreement, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA’s intellectual property rights. Additionally, you agree that you will protect the privacy, security and legal rights of your application users. + +(f) You agree to notify NVIDIA in writing of any known or suspected distribution or use of the Software not in compliance with the requirements of this Agreement, and to enforce the terms of your agreements with respect to distributed Software. + +2. Limitations. Your license to use the Software is restricted as follows: + +2.1 The Software is licensed for you to develop applications only for use in systems with NVIDIA GPUs and NVIDIA CPUs (if and when available). + +2.2 You may not reverse engineer, decompile or disassemble the Software components provided in binary form, nor attempt in any other manner to obtain source code of the Software. + +2.3 You may not change or remove copyright or other proprietary notices in the Software. + +2.4 Except as expressly granted in this Agreement, you may not copy, sell, rent, sublicense, transfer, distribute, modify or create derivative works of the Software, or make its functionality available to others. + +2.5 You may not bypass, disable or circumvent any technical limitation, encryption, security, digital rights management or authentication mechanism in the Software. + +2.6 You may not use the Software in any manner that would cause it to become subject to an open source software license; subject to the terms in the “Components Under Other Licenses” section below . + +2.7 You may not use the Software for the purpose of developing competing products or technologies or assist a third party in such activities. + +2.8 You may not indicate that a product or service developed with the Software is sponsored or endorsed by NVIDIA. + +2.9 You may not replace any NVIDIA software components in the Software that are governed by this Agreement with other software that implements NVIDIA APIs. + +2.10 You may not reverse engineer, decompile or disassemble any portion of the output generated using Software elements for the purpose of translating such output artifacts to target a non-NVIDIA platform. + +2.11 You may not distribute or disclose to third parties the output of the Software where the output reveals functionality or performance data pertinent to NVIDIA hardware or software products, results of benchmarking, competitive analysis, or regression or performance data relating to the Software or NVIDIA GPUs without the prior written permission from NVIDIA. + +2.12 You acknowledge that the Software provided under this Agreement is not designed or tested by NVIDIA for use in any system or application where the use or failure of such system or application developed with NVIDIA’s Software could result in injury, death or catastrophic damage (each, a “Mission Critical Application”). Examples of Mission Critical Applications include use in avionics, navigation, autonomous vehicle applications, AI solutions for automotive products, military, medical, life support or other mission-critical or life-critical applications. NVIDIA will not be liable to you or any third party, in whole or in part, for any claims or damages arising from these uses. You are solely responsible for ensuring that systems and applications developed with the Software include sufficient safety and redundancy features and comply with all applicable legal and regulatory standards and requirements. + +2.13 You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney’s fees and costs incident to establishing the right of indemnification) arising out of or related to (i) products or services that have been developed or deployed with or use the Software, or claims that they violate laws, or infringe, violate, or misappropriate any third party right; or (ii) a violation of the terms and conditions of this Agreement. + +3. Authorized Users. You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the Software from your secure network to perform the work authorized by this Agreement on your behalf. If you are an academic institution, you may allow users enrolled or employed by the academic institution to access and use the Software as authorized by this Agreement from your secure network. You are responsible for the compliance with the terms of this Agreement by your authorized users. Any act or omission that if committed by you would constitute a breach of this Agreement will be deemed to constitute a breach of this Agreement if committed by your authorized users. + +4. Pre-Release Versions. Software versions or specific features identified as alpha, beta, preview, early access or otherwise as pre-release may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, availability and reliability standards relative to commercial versions of NVIDIA offerings. You may use pre-release Software at your own risk, understanding that such versions are not intended for use in production or business-critical systems. NVIDIA may choose not to make available a commercial version of any pre-release Software. NVIDIA may also choose to abandon development and terminate the availability of pre-release Software at any time without liability. + +5. Updates. NVIDIA may, at its option, make available patches, workarounds or other updates to the Software. Unless the updates are provided with their separate governing terms, they are deemed part of the Software licensed to you as provided in this Agreement. + +6. Components Under Other Licenses. The Software may include or be distributed with components provided with separate legal notices or terms that accompany the components, such as open source software licenses and other license. The components are subject to the applicable other licenses, including any proprietary notices, disclaimers, requirements and extended use rights; except that this Agreement will prevail regarding the use of third-party open source software, unless a third-party open source software license requires its license terms to prevail. Open source software license means any software, data or documentation subject to any license identified as an open source license by the Open Source Initiative (http://opensource.org), Free Software Foundation (http://www.fsf.org) or other similar open source organization or listed by the Software Package Data Exchange (SPDX) Workgroup under the Linux Foundation (http://www.spdx.org). + +7. Termination . This Agreement will automatically terminate without notice from NVIDIA if you fail to comply with any of the terms in this Agreement or if you commence or participate in any legal proceeding against NVIDIA with respect to the Software. Additionally, NVIDIA may terminate this Agreement with prior written notice to you if, in NVIDIA’s sole discretion, the continued use of the Software is no longer commercially viable or creates liabilities for NVIDIA. You agree to cooperate with NVIDIA and provide reasonably requested information to verify your compliance with this Agreement. Upon any termination, you must stop using and destroy all copies of the Software. Upon written request, you will certify in writing that you have complied with your commitments under this section. All provisions will survive termination, except for the licenses granted to you. + +8. Ownership. + +8.1 NVIDIA Ownership. The Software, including all intellectual property rights, is and will remain the sole and exclusive property of NVIDIA or its licensors. Except as expressly granted in this Agreement, (i) NVIDIA reserves all rights, interests and remedies in connection with the Software and (ii) no other license or right is granted to you by implication, estoppel or otherwise. + +8.2 Your Ownership. Subject to the rights of NVIDIA and its suppliers in the Software, you hold all rights, title and interest in and to your services, applications and derivative works of samples or examples you develop as permitted in this Agreement including their respective intellectual property rights. + +8.3 Non-Assert. You agree that you will not, and will not assist or enable any other party to, assert or threaten to assert any intellectual property rights against NVIDIA or its affiliates with respect to new software samples or examples that NVIDIA or its affiliates may develop and make available in the future. + +9. Feedback. You may, but are not obligated to, provide suggestions, requests, fixes, modifications, enhancements or other feedback regarding or in connection with your use of the Software (collectively, “Feedback”). Feedback, even if designated as confidential by you, will not create any confidentiality obligation for NVIDIA or its affiliates. If you provide Feedback, you hereby grant NVIDIA, its affiliates and its designees a non-exclusive, perpetual, irrevocable, sublicensable, worldwide, royalty-free, fully paid-up and transferable license, under your intellectual property rights, to publicly perform, publicly display, reproduce, use, make, have made, sell, offer for sale, distribute (through multiple tiers of distribution), import, create derivative works of and otherwise commercialize and exploit the Feedback at NVIDIA’s discretion. You will not give Feedback (i) that you have reason to believe is subject to any restriction that impairs the exercise of the grant stated in this section, such as third-party intellectual property rights or (ii) subject to license terms which seek to require any product incorporating or developed using such Feedback, or other intellectual property of NVIDIA or its affiliates, to be licensed to or otherwise shared with any third party. + +10. Disclaimer of Warranties. THE SOFTWARE IS PROVIDED BY NVIDIA AS-IS AND WITH ALL FAULTS. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA DISCLAIMS ALL WARRANTIES AND REPRESENTATIONS OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, RELATING TO OR ARISING UNDER THIS AGREEMENT, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF TITLE, NONINFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, USAGE OF TRADE AND COURSE OF DEALING. WITHOUT LIMITING THE FOREGOING, NVIDIA DOES NOT WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT ANY DEFECTS OR ERRORS WILL BE CORRECTED; THAT ANY CERTAIN CONTENT WILL BE AVAILABLE; OR THAT THE SOFTWARE IS FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS. NO INFORMATION OR ADVICE GIVEN BY NVIDIA WILL IN ANY WAY INCREASE THE SCOPE OF ANY WARRANTY EXPRESSLY PROVIDED IN THIS AGREEMENT. NVIDIA does not warrant or assume responsibility for the accuracy or completeness of any third-party information, text, graphics or links contained in the Software. + +11. Limitations of Liability. + +11.1 DISCLAIMERS. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY (I) INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, OR (II) DAMAGES FOR THE (A) COST OF PROCURING SUBSTITUTE GOODS OR (B) LOSS OF PROFITS, REVENUES, USE, DATA OR GOODWILL ARISING OUT OF OR RELATED TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, OR OTHERWISE, AND EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF A PARTY’S REMEDIES FAIL THEIR ESSENTIAL PURPOSE. + +11.2 DAMAGES CAP. ADDITIONALLY, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA’S TOTAL CUMULATIVE AGGREGATE LIABILITY FOR ANY AND ALL LIABILITIES, OBLIGATIONS OR CLAIMS ARISING OUT OF OR RELATED TO THIS AGREEMENT WILL NOT EXCEED FIVE U.S. DOLLARS (US$5). + +12. Governing Law and Jurisdiction. This Agreement will be governed in all respects by the laws of the United States and the laws of the State of Delaware, without regard to conflict of laws principles or the United Nations Convention on Contracts for the International Sale of Goods. The state and federal courts residing in Santa Clara County, California will have exclusive jurisdiction over any dispute or claim arising out of or related to this Agreement, and the parties irrevocably consent to personal jurisdiction and venue in those courts; except that either party may apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. + +13. General. + +13.1 No Assignment. NVIDIA may assign, delegate or transfer its rights or obligations under this Agreement by any means or operation of law. You may not, without NVIDIA’s prior written consent, assign, delegate or transfer any of your rights or obligations under this Agreement by any means or operation of law, and any attempt to do so is null and void. + +13.2 No Waiver. No waiver of any term of the Agreement will be deemed a further or continuing waiver of such term or any other term, and NVIDIA’s failure to assert any right or provision under the Agreement will not constitute a waiver of such right or provision. + +13.3 Trade and Compliance. You agree to comply with all applicable export, import, trade and economic sanctions laws and regulations, including U.S. Export Administration Regulations and Office of Foreign Assets Control regulations. You confirm that you will not export or reexport any products or technology, directly or indirectly, without first obtaining any required license or other approval from appropriate authorities, (i) to any countries that are subject to any U.S. or local export restrictions (currently including, but not necessarily limited to, Cuba, Iran, North Korea, Syria, the Region of Crimea, Donetsk People’s Republic Region and Luhansk People’s Republic Region); (ii) to any end user who you know or have reason to know will utilize them in the design, development or production of nuclear, chemical or biological weapons, missiles, rocket systems, unmanned air vehicles, or any weapons of mass destruction; (iii) to any end-user who has been prohibited from participating in the U.S. or local export transactions by any governing authority; or (iv) to any known military or military-intelligence end-user or for any known military or military-intelligence end-use in accordance with U.S. trade compliance laws and regulations. Use of the Software under this Agreement must be consistent with NVIDIA’s HumanRightsPolicy.pdf (nvidia.com). + +13.4 Government Rights. The Software, documentation and technology (“Protected Items”) are “Commercial products” as this term is defined at 48 C.F.R. 2.101, consisting of “commercial computer software” and “commercial computer software documentation” as such terms are used in, respectively, 48 C.F.R. 12.212 and 48 C.F.R. 227.7202 & 252.227-7014(a)(1). Before any Protected Items are supplied to the U.S. Government, you will (i) inform the U.S. Government in writing that the Protected Items are and must be treated as commercial computer software and commercial computer software documentation developed at private expense; (ii) inform the U.S. Government that the Protected Items are provided subject to the terms of the Agreement; and (iii) mark the Protected Items as commercial computer software and commercial computer software documentation developed at private expense. In no event will you permit the U.S. Government to acquire rights in Protected Items beyond those specified in 48 C.F.R. 52.227-19(b)(1)-(2) or 252.227-7013(c) except as expressly approved by NVIDIA in writing. + +13.5 Notices. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department, with a copy emailed to legalnotices@nvidia.com. If NVIDIA needs to contact you about the Software, you consent to receive the notices by email and agree that such notices will satisfy any legal communication requirements. + +13.6 Force Majeure. Neither party will be liable during any period where an event or circumstance prevents or delays that party from performing its obligations under this Agreement and that event or circumstance: (i) is not within the reasonable control of that party and is not the result of that party’s negligence, and (ii) cannot be overcome or avoided by that party using reasonably diligent efforts. + +13.7 Severability and Amendment. If a court of competent jurisdiction rules that a provision of this Agreement is unenforceable, that provision will be deemed modified to the extent necessary to make it enforceable and the remainder of this Agreement will continue in full force and effect. Any amendment to this Agreement must be in writing and signed by authorized representatives of both parties. + +13.8 Construction. The headings in the Agreement are included solely for convenience and are not intended to affect the meaning or interpretation of the Agreement. As required by the context of the Agreement, the singular of a term includes the plural and vice versa. + +13.9 Entire Agreement. Regarding the subject matter of this Agreement, the parties agree that (i) this Agreement constitutes the entire and exclusive agreement between the parties and supersedes all prior and contemporaneous communications and (ii) any additional or different terms or conditions, whether contained in purchase orders, order acknowledgments, invoices or otherwise, will not be binding and are null and void. + + + +(v. November 28, 2023) + + + + + +nvidia-nvjitlink +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-nvjpeg-cu12 +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-nvjpeg2k-cu12 +Other/Proprietary License +https://developer.nvidia.com/nvjpeg +LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + +This license agreement, including exhibits attached ("Agreement”) is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of a NVIDIA software development kit (“SDK”). + +Each SDK has its own set of software and materials, but here is a description of the types of items that may be included in a SDK: source code, header files, APIs, data sets and assets (examples include images, textures, models, scenes, videos, native API input/output files), binary software, sample code, libraries, utility programs, programming code and documentation. + +This Agreement can be accepted only by an adult of legal age of majority in the country in which the SDK is used. + +If you are entering into this Agreement on behalf of a company or other legal entity, you represent that you have the legal authority to bind the entity to this Agreement, in which case “you” will mean the entity you represent. + +If you don’t have the required age or authority to accept this Agreement, or if you don’t accept all the terms and conditions of this Agreement, do not download, install or use the SDK. + +You agree to use the SDK only for purposes that are permitted by (a) this Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions. + +1. License. + +1.1 Grant + +Subject to the terms of this Agreement, NVIDIA hereby grants you a non-exclusive, non-transferable license, without the right to sublicense (except as expressly provided in this Agreement) to: + +(i) Install and use the SDK, + +(ii) Modify and create derivative works of sample source code delivered in the SDK, and + +(iii) Distribute those portions of the SDK that are identified in this Agreement as distributable, as incorporated in object code format into a software application that meets the distribution requirements indicated in this Agreement. + +1.2 Distribution Requirements + +These are the distribution requirements for you to exercise the distribution grant: + +(i) Your application must have material additional functionality, beyond the included portions of the SDK. + +(ii) The distributable portions of the SDK shall only be accessed by your application. + +(iii) The following notice shall be included in modifications and derivative works of sample source code distributed: “This software contains source code provided by NVIDIA Corporation.” + +(iv) Unless a developer tool is identified in this Agreement as distributable, it is delivered for your internal use only. + +(v) The terms under which you distribute your application must be consistent with the terms of this Agreement, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA’s intellectual property rights. Additionally, you agree that you will protect the privacy, security and legal rights of your application users. + +(vi) You agree to notify NVIDIA in writing of any known or suspected distribution or use of the SDK not in compliance with the requirements of this Agreement, and to enforce the terms of your agreements with respect to distributed SDK. + +1.3 Authorized Users + +You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the SDK from your secure network to perform work on your behalf. + +If you are an academic institution you may allow users enrolled or employed by the academic institution to access and use the SDK from your secure network. + +You are responsible for the compliance with the terms of this Agreement by your authorized users. If you become aware that your authorized users didn’t follow the terms of this Agreement, you agree to take reasonable steps to resolve the non-compliance and prevent new occurrences. + +1.4 Pre-Release SDK +The SDK versions identified as alpha, beta, preview or otherwise as pre-release, may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercial versions of NVIDIA software and materials. Use of a pre-release SDK may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. +You may use a pre-release SDK at your own risk, understanding that pre-release SDKs are not intended for use in production or business-critical systems. +NVIDIA may choose not to make available a commercial version of any pre-release SDK. NVIDIA may also choose to abandon development and terminate the availability of a pre-release SDK at any time without liability. +1.5 Updates + +NVIDIA may, at its option, make available patches, workarounds or other updates to this SDK. Unless the updates are provided with their separate governing terms, they are deemed part of the SDK licensed to you as provided in this Agreement. + +You agree that the form and content of the SDK that NVIDIA provides may change without prior notice to you. While NVIDIA generally maintains compatibility between versions, NVIDIA may in some cases make changes that introduce incompatibilities in future versions of the SDK. + +1.6 Third Party Licenses + +The SDK may come bundled with, or otherwise include or be distributed with, third party software licensed by a NVIDIA supplier and/or open source software provided under an open source license. Use of third party software is subject to the third-party license terms, or in the absence of third party terms, the terms of this Agreement. Copyright to third party software is held by the copyright holders indicated in the third-party software or license. + +1.7 Reservation of Rights + +NVIDIA reserves all rights, title and interest in and to the SDK not expressly granted to you under this Agreement. + +2. Limitations. + +The following license limitations apply to your use of the SDK: + +2.1 You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the SDK or copies of the SDK. + +2.2 Except as expressly provided in this Agreement, you may not copy, sell, rent, sublicense, transfer, distribute, modify, or create derivative works of any portion of the SDK. + +2.3 Unless you have an agreement with NVIDIA for this purpose, you may not indicate that an application created with the SDK is sponsored or endorsed by NVIDIA. + +2.4 You may not bypass, disable, or circumvent any encryption, security, digital rights management or authentication mechanism in the SDK. + +2.5 You may not use the SDK in any manner that would cause it to become subject to an open source software license. As examples, licenses that require as a condition of use, modification, and/or distribution that the SDK be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. + +2.6 Unless you have an agreement with NVIDIA for this purpose, you may not use the SDK with any system or application where the use or failure of the system or application can reasonably be expected to threaten or result in personal injury, death, or catastrophic loss. Examples include use in avionics, navigation, military, medical, life support or other life critical applications. NVIDIA does not design, test or manufacture the SDK for these critical uses and NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such uses. + +2.7 You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney’s fees and costs incident to establishing the right of indemnification) arising out of or related to your use of the SDK outside of the scope of this Agreement, or not in compliance with its terms. + +3. Ownership. + +3.1 NVIDIA or its licensors hold all rights, title and interest in and to the SDK and its modifications and derivative works, including their respective intellectual property rights, subject to your rights under Section 3.2. This SDK may include software and materials from NVIDIA’s licensors, and these licensors are intended third party beneficiaries that may enforce this Agreement with respect to their intellectual property rights. + +3.2 You hold all rights, title and interest in and to your applications and your derivative works of the sample source code delivered in the SDK, including their respective intellectual property rights, subject to NVIDIA’s rights under section 3.1. + +3.3 You may, but don’t have to, provide to NVIDIA suggestions, feature requests or other feedback regarding the SDK, including possible enhancements or modifications to the SDK. For any feedback that you voluntarily provide, you hereby grant NVIDIA and its affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce, modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through multiple tiers of distributors) it without the payment of any royalties or fees to you. NVIDIA will use feedback at its choice. NVIDIA is constantly looking for ways to improve its products, so you may send feedback to NVIDIA through the developer portal at https://developer.nvidia.com. + +4. No Warranties. + +THE SDK IS PROVIDED BY NVIDIA “AS IS” AND “WITH ALL FAULTS.” TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. + +5. Limitations of Liability. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA’S AND ITS AFFILIATES TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS LIMIT. + +These exclusions and limitations of liability shall apply regardless if NVIDIA or its affiliates have been advised of the possibility of such damages, and regardless of whether a remedy fails its essential purpose. These exclusions and limitations of liability form an essential basis of the bargain between the parties, and, absent any of these exclusions or limitations of liability, the provisions of this Agreement, including, without limitation, the economic terms, would be substantially different. + +6. Termination. + +6.1 This Agreement will continue to apply until terminated by either you or NVIDIA as described below. + +6.2 If you want to terminate this Agreement, you may do so by stopping to use the SDK. + +6.3 NVIDIA may, at any time, terminate this Agreement if: (i) you fail to comply with any term of this Agreement and the non-compliance is not fixed within thirty (30) days following notice from NVIDIA (or immediately if you violate NVIDIA’s intellectual property rights); (ii) you commence or participate in any legal proceeding against NVIDIA with respect to the SDK; or (iii) NVIDIA decides to no longer provide the SDK in a country or, in NVIDIA’s sole discretion, the continued use of it is no longer commercially viable. + +6.4 Upon any termination of this Agreement, you agree to promptly discontinue use of the SDK and destroy all copies in your possession or control. Your prior distributions in accordance with this Agreement are not affected by the termination of this Agreement. Upon written request, you will certify in writing that you have complied with your commitments under this section. Upon any termination of this Agreement all provisions survive except for the licenses granted to you. + +7. General. + +If you wish to assign this Agreement or your rights and obligations, including by merger, consolidation, dissolution or operation of law, contact NVIDIA to ask for permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect. NVIDIA may assign, delegate or transfer this Agreement and its rights and obligations, and if to a non-affiliate you will be notified. + +You agree to cooperate with NVIDIA and provide reasonably requested information to verify your compliance with this Agreement. + +This Agreement will be governed in all respects by the laws of the United States and of the State of Delaware as those laws are applied to contracts entered into and performed entirely within Delaware by Delaware residents, without regard to the conflicts of laws principles. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this Agreement in the English language. + +The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this Agreement. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. + +If any court of competent jurisdiction determines that any provision of this Agreement is illegal, invalid or unenforceable, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law and the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. + +Each party acknowledges and agrees that the other is an independent contractor in the performance of this Agreement. + +The SDK has been developed entirely at private expense and is “commercial items” consisting of “commercial computer software” and “commercial computer software documentation” provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government or a U.S. Government subcontractor is subject to the restrictions in this Agreement pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (b)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051. + +The SDK is subject to United States export laws and regulations. You agree that you will not ship, transfer or export the SDK into any country, or use the SDK in any manner, prohibited by the United States Bureau of Industry and Security or economic sanctions regulations administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC), or any applicable export laws, restrictions or regulations. These laws include restrictions on destinations, end users and end use. By accepting this Agreement, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the SDK. + +Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email or fax. You agree that any notices that NVIDIA sends you electronically will satisfy any legal communication requirements. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department. + +This Agreement and any exhibits incorporated into this Agreement constitute the entire agreement of the parties with respect to the subject matter of this Agreement and supersede all prior negotiations or documentation exchanged between the parties relating to this SDK license. Any additional and/or conflicting terms on documents issued by you are null, void, and invalid. Any amendment or waiver under this Agreement shall be in writing and signed by representatives of both parties. + +(v. January 28, 2020) + + + + + + + + + + + + + + + +nvJPEG2K SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + +The terms in this supplement govern your use of the NVIDIA nvJPEG2K SDK under the terms of your license agreement (“Agreement”) as modified by this supplement. Capitalized terms used but not defined below have the meaning assigned to them in the Agreement. + +This supplement is an exhibit to the Agreement and is incorporated as an integral part of the Agreement. In the event of conflict between the terms in this supplement and the terms in the Agreement, the terms in this supplement govern. + +4.1 License Scope. The SDK is licensed for you to develop applications only for use in systems with NVIDIA GPUs. + +2. Distribution. The following portions of the SDK are distributable under the Agreement: the runtime files .so and .h, nvjpeg2k_0.dll, nvjpeg2k.lib and libnvjpeg2k_static.a. + +3. Licensing. If the distribution terms in this Agreement are not suitable for your organization, or for any questions regarding this Agreement, please contact NVIDIA at nvidia-compute-license-questions@nvidia.com. + (v. November 14, 2020) + + +OpenJPEG LICENSE + +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * 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. + * + * 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. + */ + + + + + + +nvidia-nvshmem-cu13 +LicenseRef-NVIDIA-Proprietary +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvidia-nvtiff-cu12 +Other/Proprietary License +https://developer.nvidia.com/nvtiff +NVIDIA nvTIFF +Software License Agreement | NVIDIA Docs + +Table of Contents +LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS iii +Chapter 1. License. 1 +1.1. Grant 1 +1.2. Distribution Requirements 1 +1.3. Authorized Users 2 +1.4. Pre-Release SDK 2 +1.5. Updates 2 +1.6. Third Party Licenses 2 +1.7. Reservation of Rights 3 +Chapter 2. Limitations. 4 +Chapter 3. Ownership. 5 +Chapter 4. No Warranties. 6 +Chapter 5. Limitations of Liability. 7 +Chapter 6. Termination. 8 +Chapter 7. General. 9 + + + +LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + + + +This license agreement, including exhibits attached ("Agreement") is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of a NVIDIA software development kit ("SDK"). +Each SDK has its own set of software and materials, but here is a description of the types of items that may be included in a SDK: source code, header files, APIs, data sets and assets (examples include images, textures, models, scenes, videos, native API input/output files), binary software, sample code, libraries, utility programs, programming code and documentation. +This Agreement can be accepted only by an adult of legal age of majority in the country in which the SDK is used. +If you are entering into this Agreement on behalf of a company or other legal entity, you represent that you have the legal authority to bind the entity to this Agreement, in which case "you" will mean the entity you represent. +If you don't have the required age or authority to accept this Agreement, or if you don't accept all the terms and conditions of this Agreement, do not download, install or use the SDK. +You agree to use the SDK only for purposes that are permitted by (a) this Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions. + +Chapter 1. License. + +1.1. Grant +Subject to the terms of this Agreement, NVIDIA hereby grants you a non-exclusive, non- transferable license, without the right to sublicense (except as expressly provided in this Agreement) to: +1. Install and use the SDK, +2. Modify and create derivative works of sample source code delivered in the SDK, and +3. Distribute those portions of the SDK that are identified in this Agreement as distributable, as incorporated in object code format into a software application that meets the distribution requirements indicated in this Agreement. + +1.2. Distribution Requirements +These are the distribution requirements for you to exercise the distribution grant: +1. Your application must have material additional functionality, beyond the included portions of the SDK. +2. The distributable portions of the SDK shall only be accessed by your application. +3. The following notice shall be included in modifications and derivative works of sample source code distributed: "This software contains source code provided by NVIDIA Corporation." +4. Unless a developer tool is identified in this Agreement as distributable, it is delivered for your internal use only. +5. The terms under which you distribute your application must be consistent with the terms of this Agreement, including (without limitation) terms relating to the license grant and license restrictions and protection of NVIDIA's intellectual property rights. Additionally, you agree that you will protect the privacy, security and legal rights of your application users. +6. You agree to notify NVIDIA in writing of any known or suspected distribution or use of the SDK not in compliance with the requirements of this Agreement, and to enforce the terms of your agreements with respect to distributed SDK. + + +1.3. Authorized Users +You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the SDK from your secure network to perform work on your behalf. +If you are an academic institution you may allow users enrolled or employed by the academic institution to access and use the SDK from your secure network. +You are responsible for the compliance with the terms of this Agreement by your authorized users. If you become aware that your authorized users didn't follow the terms of this Agreement, you agree to take reasonable steps to resolve the non-compliance and prevent new occurrences. + +1.4. Pre-Release SDK +The SDK versions identified as alpha, beta, preview or otherwise as pre-release, may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, accessibility, availability, and reliability standards relative to commercial +versions of NVIDIA software and materials. Use of a pre-release SDK may result in unexpected results, loss of data, project delays or other unpredictable damage or loss. +You may use a pre-release SDK at your own risk, understanding that pre-release SDKs are not intended for use in production or business-critical systems. +NVIDIA may choose not to make available a commercial version of any pre-release SDK. NVIDIA may also choose to abandon development and terminate the availability of a pre- release SDK at any time without liability. + +1.5. Updates +NVIDIA may, at its option, make available patches, workarounds or other updates to this SDK. Unless the updates are provided with their separate governing terms, they are deemed part of the SDK licensed to you as provided in this Agreement. +You agree that the form and content of the SDK that NVIDIA provides may change without prior notice to you. While NVIDIA generally maintains compatibility between versions, NVIDIA may in some cases make changes that introduce incompatibilities in future versions of the SDK. + +1.6. Components Under Other Licenses +The SDK may come bundled with, or otherwise include or be distributed with, NVIDIA or third party software licensed with separate legal notices or terms as may be described in proprietary notices accompanying the SDK. If and to the extent there is a conflict between the terms in this Agreement and the license terms associated with the component, the license terms associated with the components control only to the extent necessary to resolve the conflict. + +1.7. Reservation of Rights +NVIDIA reserves all rights, title and interest in and to the SDK not expressly granted to you under this Agreement. + + +Chapter 2. Limitations. + +The following license limitations apply to your use of the SDK: +2.1 You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the SDK or copies of the SDK. +2.2 Except as expressly provided in this Agreement, you may not copy, sell, rent, sublicense, transfer, distribute, modify, or create derivative works of any portion of the SDK. +2.3 Unless you have an agreement with NVIDIA for this purpose, you may not indicate that an application created with the SDK is sponsored or endorsed by NVIDIA. +2.4 You may not bypass, disable, or circumvent any encryption, security, digital rights management or authentication mechanism in the SDK. +2.5 You may not use the SDK in any manner that would cause it to become subject to an open source software license. As examples, licenses that require as a condition of use, modification, and/or distribution that the SDK be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. +2.6 You acknowledge that the SDK as delivered is not tested or certified by NVIDIA for use in connection with the design, construction, maintenance, and/or operation of any system where the use or failure of such system could result in a situation that threatens the safety of human life or results in catastrophic damages (each, a "Critical Application"). Examples of Critical Applications include use in avionics, navigation, autonomous vehicle applications, ai solutions for automotive products, military, medical, life support or other life critical applications. NVIDIA shall not be liable to you or any third party, in whole or in part, for any claims or damages arising from such uses. You are solely responsible for ensuring that any product +or service developed with the SDK as a whole includes sufficient features to comply with all applicable legal and regulatory standards and requirements. +2.7 You agree to defend, indemnify and hold harmless NVIDIA and its affiliates, and their respective employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, fines, restitutions and expenses (including but not limited to attorney's fees and costs incident to establishing the right of indemnification) arising out of or related to products or services that use the SDK in or for Critical Applications, and for use of the SDK outside of the scope of this Agreement or not in compliance with its terms. + + +Chapter 3. Ownership. + +3.1 NVIDIA or its licensors hold all rights, title and interest in and to the SDK and its modifications and derivative works, including their respective intellectual property rights, subject to your rights under Section 3.2. This SDK may include software and materials from NVIDIA's licensors, and these licensors are intended third party beneficiaries that may enforce this Agreement with respect to their intellectual property rights. +3.2 You hold all rights, title and interest in and to your applications and your derivative works of the sample source code delivered in the SDK, including their respective intellectual property rights, subject to NVIDIA's rights under section 3.1. +3.3 You may, but don't have to, provide to NVIDIA suggestions, feature requests or other feedback regarding the SDK, including possible enhancements or modifications to the SDK. For any feedback that you voluntarily provide, you hereby grant NVIDIA and its affiliates a perpetual, non-exclusive, worldwide, irrevocable license to use, reproduce, modify, license, sublicense (through multiple tiers of sublicensees), and distribute (through multiple tiers of distributors) it without the payment of any royalties or fees to you. NVIDIA will use feedback at its choice. NVIDIA is constantly looking for ways to improve its products, so you may send feedback to NVIDIA through the developer portal at https://developer.nvidia.com. + + +Chapter 4. No Warranties. + + +THE SDK IS PROVIDED BY NVIDIA "AS IS" AND "WITH ALL FAULTS." TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND OR NATURE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, OR THE ABSENCE OF ANY DEFECTS THEREIN, WHETHER LATENT OR PATENT. NO WARRANTY IS MADE ON THE BASIS OF TRADE USAGE, COURSE OF DEALING OR COURSE OF TRADE. + + +Chapter 5. Limitations of Liability. + + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, NVIDIA AND ITS AFFILIATES SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR ANY LOST PROFITS, LOSS OF USE, LOSS OF DATA OR LOSS OF GOODWILL, OR THE COSTS OF PROCURING SUBSTITUTE PRODUCTS, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR THE USE OR PERFORMANCE OF THE SDK, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED UPON BREACH OF CONTRACT, BREACH OF WARRANTY, +TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR ANY OTHER CAUSE OF ACTION OR THEORY OF LIABILITY. IN NO EVENT WILL NVIDIA'S AND ITS AFFILIATES TOTAL CUMULATIVE LIABILITY UNDER OR ARISING OUT OF THIS AGREEMENT EXCEED US$10.00. THE NATURE OF THE LIABILITY OR THE NUMBER OF CLAIMS OR SUITS SHALL NOT ENLARGE OR EXTEND THIS LIMIT. +These exclusions and limitations of liability shall apply regardless if NVIDIA or its affiliates have been advised of the possibility of such damages, and regardless of whether a remedy fails its essential purpose. These exclusions and limitations of liability form an essential basis of the bargain between the parties, and, absent any of these exclusions or limitations of liability, the provisions of this Agreement, including, without limitation, the economic terms, would be substantially different. + + +Chapter 6. Termination. + + + +6.1 This Agreement will continue to apply until terminated by either you or NVIDIA as described below. +6.2 If you want to terminate this Agreement, you may do so by stopping to use the SDK. +6.3 NVIDIA may, at any time, terminate this Agreement if: (i) you fail to comply with any term of this Agreement and the non-compliance is not fixed within thirty (30) days following notice from NVIDIA (or immediately if you violate NVIDIA's intellectual property rights); (ii) you commence or participate in any legal proceeding against NVIDIA with respect to the SDK; or +(iii) NVIDIA decides to no longer provide the SDK in a country or, in NVIDIA's sole discretion, the continued use of it is no longer commercially viable. +6.4 Upon any termination of this Agreement, you agree to promptly discontinue use of the SDK and destroy all copies in your possession or control. Your prior distributions in accordance with this Agreement are not affected by the termination of this Agreement. Upon written request, you will certify in writing that you have complied with your commitments under this section. Upon any termination of this Agreement all provisions survive except for the licenses granted to you. + + +Chapter 7. General. + + +If you wish to assign this Agreement or your rights and obligations, including by merger, consolidation, dissolution or operation of law, contact NVIDIA to ask for permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect. NVIDIA may assign, delegate or transfer this Agreement and its rights and obligations, and if to a non- affiliate you will be notified. +You agree to cooperate with NVIDIA and provide reasonably requested information to verify your compliance with this Agreement. +This Agreement will be governed in all respects by the laws of the United States and of the State of Delaware as those laws are applied to contracts entered into and performed entirely within Delaware by Delaware residents, without regard to the conflicts of laws principles. +The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this Agreement in the English language. +The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this Agreement. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction. +If any court of competent jurisdiction determines that any provision of this Agreement is illegal, invalid or unenforceable, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law and the remaining provisions will remain in full force and effect. Unless otherwise specified, remedies are cumulative. +Each party acknowledges and agrees that the other is an independent contractor in the performance of this Agreement. +The SDK has been developed entirely at private expense and is "commercial items" consisting of "commercial computer software" and "commercial computer software documentation" provided with RESTRICTED RIGHTS. Use, duplication or disclosure by the U.S. Government +or a U.S. Government subcontractor is subject to the restrictions in this Agreement pursuant to DFARS 227.7202-3(a) or as set forth in subparagraphs (b)(1) and (2) of the Commercial Computer Software - Restricted Rights clause at FAR 52.227-19, as applicable. Contractor/ manufacturer is NVIDIA, 2788 San Tomas Expressway, Santa Clara, CA 95051. +The SDK is subject to United States export laws and regulations. You agree that you will not ship, transfer or export the SDK into any country, or use the SDK in any manner, prohibited by the United States Bureau of Industry and Security or economic sanctions regulations administered by the U.S. Department of Treasury's Office of Foreign Assets Control (OFAC), + + + + +or any applicable export laws, restrictions or regulations. These laws include restrictions on destinations, end users and end use. By accepting this Agreement, you confirm that you are not a resident or citizen of any country currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the SDK. +Any notice delivered by NVIDIA to you under this Agreement will be delivered via mail, email or fax. You agree that any notices that NVIDIA sends you electronically will satisfy any legal communication requirements. Please direct your legal notices or other correspondence to +NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department. +This Agreement and any exhibits incorporated into this Agreement constitute the entire agreement of the parties with respect to the subject matter of this Agreement and supersede all prior negotiations or documentation exchanged between the parties relating to this SDK license. Any additional and/or conflicting terms on documents issued by you are null, void, and invalid. Any amendment or waiver under this Agreement shall be in writing and signed by representatives of both parties. +(v. March 31, 2022) + + +Chapter 8. nvTIFF SUPPLEMENT +TO SOFTWARE LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS + + +The terms in this supplement govern your use of the NVIDIA nvTIFF SDK under the terms of your license agreement ("Agreement") as modified by this supplement. Capitalized terms used but not defined below have the meaning assigned to them in the Agreement. +This supplement is an exhibit to the Agreement and is incorporated as an integral part of the Agreement. In the event of conflict between the terms in this supplement and the terms in the Agreement, the terms in this supplement govern. +1. License Scope. The SDK is licensed for you to develop applications only for use in systems with NVIDIA GPUs. +2. Distribution. The following portions of the SDK are distributable under the Agreement: the runtime files .so and .h, nvTIFF_0.dll, nvTIFF.lib and libnvTIFF_static.a. +3. Licensing. If the distribution terms in this Agreement are not suitable for your organization, or for any questions regarding this Agreement, please contact NVIDIA at nvidia-compute- license-questions@nvidia.com +(v. March 31, 2022) + + + + + + + + + + + +nvidia-nvtx +Other/Proprietary License +https://developer.nvidia.com/cuda-zone +UNKNOWN + +nvtx +Apache Software License +https://github.com/NVIDIA/NVTX +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +obstore +MIT License +https://developmentseed.org/obstore +UNKNOWN + +omegaconf +BSD License +https://github.com/omry/omegaconf +BSD 3-Clause License + +Copyright (c) 2018, Omry Yadan +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. + + +onnx +Apache-2.0 +https://onnx.ai/ + + 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. + + +onnx-ir +Apache-2.0 +https://onnx.ai/ir-py + + 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. + + +onnxscript +MIT License +https://microsoft.github.io/onnxscript/ +MIT License + +Copyright (c) Microsoft Corporation + +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. + + +open_clip_torch +MIT License +https://github.com/mlfoundations/open_clip +Copyright (c) 2012-2021 Gabriel Ilharco, Mitchell Wortsman, +Nicholas Carlini, Rohan Taori, Achal Dave, Vaishaal Shankar, +John Miller, Hongseok Namkoong, Hannaneh Hajishirzi, Ali Farhadi, +Ludwig Schmidt + +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. + + +openai +Apache Software License +https://github.com/openai/openai-python + 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 2026 OpenAI + + 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. + + +opencensus +Apache Software License +https://github.com/census-instrumentation/opencensus-python + 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. + + +opencensus-context +Apache Software License +https://github.com/census-instrumentation/opencensus-python/tree/master/context/opencensus-context +UNKNOWN + +opencv-contrib-python +Apache Software License +https://github.com/opencv/opencv-python +OpenCV library is redistributed within opencv-python package. +This license applies to OpenCV binary in the directory cv2/. + + + 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. + +------------------------------------------------------------------------------ +libvpx is redistributed within all opencv-python Linux packages. +This license applies to libvpx binary in the directory cv2/. + +Copyright (c) 2010, The WebM Project 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, nor the WebM Project, 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. + +------------------------------------------------------------------------------ +FFmpeg is redistributed within all opencv-python packages. + +Libbluray, libgnutls, libnettle, libhogweed, libintl, libmp3lame, libp11, +librtmp, libsoxr and libtasn1 are redistributed within all opencv-python macOS packages. + +This license applies to the above library binaries in the directory cv2/. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + +------------------------------------------------------------------------------ +Qt 5 is redistributed within non-headless opencv-python Linux and macOS packages. +libgmp is redistributed within opencv-python macOS packages. +libidn2 is redistributed within opencv-python macOS packages. +libunistring is redistributed within opencv-python macOS packages. +This license applies to the above binaries in the directory cv2/. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +------------------------------------------------------------------------------ +bzip2 is redistributed within all opencv-python Linux packages. +This license applies to libbz2 binary in the directory cv2/. + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2010 Julian R Seward. 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. 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. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +Julian Seward, jseward@bzip.org +bzip2/libbzip2 version 1.0.6 of 6 September 2010 + +------------------------------------------------------------------------------ +libcrypto and libssl are redistributed within all opencv-python Linux and macOS packages. +libopencore-amrnb and libopencore-amrwb are redistributed within all opencv-python Linux and macOS packages. +This license applies to above binaries in the directory cv2/. + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. 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. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are adhered to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * 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 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the routines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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 licence and distribution terms for any publicly available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +------------------------------------------------------------------------------ +libfontconfig is redistributed within all opencv-python macOS packages. +This license applies to libfontconfig binary in the directory cv2/. + +Copyright © 2000,2001,2002,2003,2004,2006,2007 Keith Packard +Copyright © 2005 Patrick Lam +Copyright © 2009 Roozbeh Pournader +Copyright © 2008,2009 Red Hat, Inc. +Copyright © 2008 Danilo Šegan +Copyright © 2012 Google, Inc. + + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of the author(s) not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. The authors make no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE AUTHOR(S) BE LIABLE FOR 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 THIS SOFTWARE. + +------------------------------------------------------------------------------ +libfreetype is redistributed within opencv-python Linux and macOS packages. +This license applies to libfreetype binary in the directory cv2/. + + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + +------------------------------------------------------------------------------ +libpng is redistributed within all opencv-python Linux and macOS packages. +This license applies to libpng binary in the directory cv2/. + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2019 The PNG Reference Library Authors. + * Copyright (c) 2018-2019 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +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 Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + +------------------------------------------------------------------------------ +libz is redistributed within all opencv-python Linux packages. +This license applies to libz binary in the directory cv2/. + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +------------------------------------------------------------------------------ +libdav1d is redistributed within opencv-python macOS packages. +This license applies to libdav1d binary in the directory cv2/. + +Copyright © 2018-2019, VideoLAN and dav1d 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: + +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. + +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. + +------------------------------------------------------------------------------ +libffi is redistributed within opencv-python macOS packages. +This license applies to libffi binary in the directory cv2/. + +libffi - Copyright (c) 1996-2020 Anthony Green, Red Hat, Inc and others. +See source files for details. + +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. + +------------------------------------------------------------------------------ +libogg is redistributed within opencv-python macOS packages. +This license applies to libogg binary in the directory cv2/. + +Copyright (c) 2002, Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +libopenjp2 is redistributed within opencv-python macOS packages. +This license applies to libopenjp2 binary in the directory cv2/. + +The copyright in this software is being made available under the 2-clauses +BSD License, included below. This software may be subject to other third +party and contributor rights, including patent rights, and no such rights +are granted under this license. + +Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium +Copyright (c) 2002-2014, Professor Benoit Macq +Copyright (c) 2003-2014, Antonin Descampe +Copyright (c) 2003-2009, Francois-Olivier Devaux +Copyright (c) 2005, Herve Drolon, FreeImage Team +Copyright (c) 2002-2003, Yannick Verschueren +Copyright (c) 2001-2003, David Janssens +Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France +Copyright (c) 2012, CS Systemes d'Information, France + +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. + +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. + +------------------------------------------------------------------------------ +libopus is redistributed within opencv-python macOS packages. +This license applies to libopus binary in the directory cv2/. + +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +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 Internet Society, IETF or IETF Trust, nor the +names of specific 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. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ + +------------------------------------------------------------------------------ +librav1e is redistributed within opencv-python macOS packages. +This license applies to librav1e binary in the directory cv2/. + +BSD 2-Clause License + +Copyright (c) 2017-2020, the rav1e contributors +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. + +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. + +------------------------------------------------------------------------------ +libsnappy is redistributed within opencv-python macOS packages. +This license applies to libsnappy binary in the directory cv2/. + +Copyright 2011, 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. + +------------------------------------------------------------------------------ +libspeex is redistributed within opencv-python macOS packages. +This license applies to libspeex binary in the directory cv2/. + +Copyright 2002-2008 Xiph.org Foundation +Copyright 2002-2008 Jean-Marc Valin +Copyright 2005-2007 Analog Devices Inc. +Copyright 2005-2008 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) +Copyright 1993, 2002, 2006 David Rowe +Copyright 2003 EpicGames +Copyright 1992-1994 Jutta Degener, Carsten Bormann + +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 the Xiph.org Foundation 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 FOUNDATION 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. + +------------------------------------------------------------------------------ +libsrt is redistributed within opencv-python macOS packages. +This license applies to libsrt binary in the directory cv2/. + +/* + * + * Copyright (c) 2001-2017 Cisco Systems, 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 the Cisco Systems, 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 HOLDERS 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. + * + */ + + + Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +------------------------------------------------------------------------------ +libtheoradec and libtheoraenc are redistributed within opencv-python macOS packages. +This license applies to libtheoradec and libtheoraenc binaries in the directory cv2/. + + Copyright (C) 2002-2009 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +libwebp and libwebpmux are redistributed within all opencv-python packages. +This license applies to libwebp and libwebpmux binaries in the directory cv2/. + +Copyright (c) 2010, 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 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. + +------------------------------------------------------------------------------ +libvorbis and libvorbisenc are redistributed within opencv-python macOS packages. +This license applies to libvorbis and libvorbisenc binaries in the directory cv2/. + +Copyright (c) 2002-2020 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +Libxcb utility libraries are redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb related binaries in the directory cv2/. + +Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett. +All Rights Reserved. + +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 +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. + +Except as contained in this notice, the names of the authors +or their institutions shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this +Software without prior written authorization from the +authors. + +------------------------------------------------------------------------------ +Libxcb-image is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-image binary in the directory cv2/. + +Copyright © 2007-2008 Bart Massey +Copyright © 2008 Julien Danjou +Copyright © 2008 Keith Packard + +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 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. + +Except as contained in this notice, the names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-util is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-util binary in the directory cv2/. + +Copyright © 2008 Bart Massey +Copyright © 2008 Ian Osgood +Copyright © 2008 Jamey Sharp +Copyright © 2008 Josh Triplett +Copyright © 2008-2009 Julien Danjou + +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 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. + +Except as contained in this notice, the names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-render-util is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-render-util binary in the directory cv2/. + +Copyright © 2000 Keith Packard + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL KEITH PACKARD BE LIABLE FOR 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 THIS SOFTWARE. + +Copyright © 2006 Jamey Sharp. + +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 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. + +Except as contained in this notice, the names of the authors or their +institutions shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization from the authors. + +Copyright © 2006 Ian Osgood + +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 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. + +Except as contained in this notice, the names of the authors or their +institutions shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-icccm is redistributed within opencv-python non-headless Linux packages. +This license applies to Libxcb-icccm binary in the directory cv2/. + +Copyright © 2008-2011 Arnaud Fontaine +Copyright © 2007-2008 Vincent Torri + +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 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. + +Except as contained in this notice, the names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +libXau is redistributed within opencv-python non-headless Linux packages. +This license applies to libXau binary in the directory cv2/. + +Copyright 1988, 1993, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +------------------------------------------------------------------------------ +Vulkan headers are redistributed within all opencv-python packages. +This license applies to Vulkan headers in the directory 3rdparty/include/vulkan. + +Copyright (c) 2015-2018 The Khronos Group Inc. + +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. + +------------------------------------------------------------------------------ +Libjpeg-turbo is redistributed within all opencv-python packages as build option. + +libjpeg-turbo Licenses +====================== + +libjpeg-turbo is covered by three compatible BSD-style open source licenses: + +- The IJG (Independent JPEG Group) License, which is listed in + [README.ijg](README.ijg) + + This license applies to the libjpeg API library and associated programs + (any code inherited from libjpeg, and any modifications to that code.) + +- The Modified (3-clause) BSD License, which is listed below + + This license covers the TurboJPEG API library and associated programs, as + well as the build system. + +- The [zlib License](https://opensource.org/licenses/Zlib) + + This license is a subset of the other two, and it covers the libjpeg-turbo + SIMD extensions. + + +Complying with the libjpeg-turbo Licenses +========================================= + +This section provides a roll-up of the libjpeg-turbo licensing terms, to the +best of our understanding. + +1. If you are distributing a modified version of the libjpeg-turbo source, + then: + + 1. You cannot alter or remove any existing copyright or license notices + from the source. + + **Origin** + - Clause 1 of the IJG License + - Clause 1 of the Modified BSD License + - Clauses 1 and 3 of the zlib License + + 2. You must add your own copyright notice to the header of each source + file you modified, so others can tell that you modified that file (if + there is not an existing copyright header in that file, then you can + simply add a notice stating that you modified the file.) + + **Origin** + - Clause 1 of the IJG License + - Clause 2 of the zlib License + + 3. You must include the IJG README file, and you must not alter any of the + copyright or license text in that file. + + **Origin** + - Clause 1 of the IJG License + +2. If you are distributing only libjpeg-turbo binaries without the source, or + if you are distributing an application that statically links with + libjpeg-turbo, then: + + 1. Your product documentation must include a message stating: + + This software is based in part on the work of the Independent JPEG + Group. + + **Origin** + - Clause 2 of the IJG license + + 2. If your binary distribution includes or uses the TurboJPEG API, then + your product documentation must include the text of the Modified BSD + License (see below.) + + **Origin** + - Clause 2 of the Modified BSD License + +3. You cannot use the name of the IJG or The libjpeg-turbo Project or the + contributors thereof in advertising, publicity, etc. + + **Origin** + - IJG License + - Clause 3 of the Modified BSD License + +4. The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be + free of defects, nor do we accept any liability for undesirable + consequences resulting from your use of the software. + + **Origin** + - IJG License + - Modified BSD License + - zlib License + + +The Modified (3-clause) BSD License +=================================== + +Copyright (C)2009-2022 D. R. Commander. All Rights Reserved.
+Copyright (C)2015 Viktor Szathmáry. 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 the libjpeg-turbo Project 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 HOLDERS 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. + + +Why Three Licenses? +=================== + +The zlib License could have been used instead of the Modified (3-clause) BSD +License, and since the IJG License effectively subsumes the distribution +conditions of the zlib License, this would have effectively placed +libjpeg-turbo binary distributions under the IJG License. However, the IJG +License specifically refers to the Independent JPEG Group and does not extend +attribution and endorsement protections to other entities. Thus, it was +desirable to choose a license that granted us the same protections for new code +that were granted to the IJG for code derived from their software. + +------------------------------------------------------------------------------ +Libspng is redistributed within all opencv-python packages as build option. + +BSD 2-Clause License + +Copyright (c) 2018-2022, Randy +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. + +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. + +------------------------------------------------------------------------------ +QUIRC library is redistributed within all opencv-python packages. + +quirc -- QR-code recognition library +Copyright (C) 2010-2012 Daniel Beer + +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. + +------------------------------------------------------------------------------ +Flatbuffers library is redistributed within all opencv-python packages. + + 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. + +------------------------------------------------------------------------------ +Protobuf library is redistributed within all opencv-python packages. + +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. + +------------------------------------------------------------------------------ +OpenJPEG library is redistributed within all opencv-python packages. + +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * 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. + * + * 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. + */ + +------------------------------------------------------------------------------ +TIFF library is redistributed within all opencv-python packages. + +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. + +------------------------------------------------------------------------------ +OpenEXR library is redistributed within all opencv-python packages. + +Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +Entertainment Company Ltd. Portions contributed and copyright held by +others as indicated. 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 Industrial Light & Magic nor the names of + any other contributors to this software 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. + +------------------------------------------------------------------------------ +Intel(R) IPP ICV library statically linked within x86 and x86_64 opencv-python packages. + +Intel(R) Integrated Performance Primitives 2021 Update 10 + +Intel Simplified Software License (Version October 2022) + +Intel(R) Integrated Performance Primitives (Intel(R) IPP) : Copyright (C) 1997 Intel Corporation + +Use and Redistribution. You may use and redistribute the software, which is +provided in binary form only, (the "Software"), without modification, +provided the following conditions are met: + +* Redistributions must reproduce the above copyright notice and these + terms of use in the Software and in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel nor the names of its suppliers may be used to + endorse or promote products derived from this Software without specific + prior written permission. +* No reverse engineering, decompilation, or disassembly of the Software is + permitted, nor any modification or alteration of the Software or its operation + at any time, including during execution. + +No other licenses. Except as provided in the preceding section, Intel grants no +licenses or other rights by implication, estoppel or otherwise to, patent, +copyright, trademark, trade name, service mark or other intellectual property +licenses or rights of Intel. + +Third party software. "Third Party Software" means the files (if any) listed +in the "third-party-software.txt" or other similarly-named text file that may +be included with the Software. Third Party Software, even if included with the +distribution of the Software, may be governed by separate license terms, including +without limitation, third party license terms, open source software notices and +terms, and/or other Intel software license terms. These separate license terms +solely govern Your use of the Third Party Software. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE +DISCLAIMED. THIS SOFTWARE IS NOT INTENDED FOR USE IN SYSTEMS OR APPLICATIONS +WHERE FAILURE OF THE SOFTWARE MAY CAUSE PERSONAL INJURY OR DEATH AND YOU AGREE +THAT YOU ARE FULLY RESPONSIBLE FOR ANY CLAIMS, COSTS, DAMAGES, EXPENSES, AND +ATTORNEYS' FEES ARISING OUT OF ANY SUCH USE, EVEN IF ANY CLAIM ALLEGES THAT +INTEL WAS NEGLIGENT REGARDING THE DESIGN OR MANUFACTURE OF THE SOFTWARE. + +LIMITATION OF LIABILITY. IN NO EVENT WILL INTEL 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. + +No support. Intel may make changes to the Software, at any time without notice, +and is not obligated to support, update or provide training for the Software. + +Termination. Your right to use the Software is terminated in the event of your +breach of this license. + +Feedback. Should you provide Intel with comments, modifications, corrections, +enhancements or other input ("Feedback") related to the Software, Intel will be +free to use, disclose, reproduce, license or otherwise distribute or exploit the +Feedback in its sole discretion without any obligations or restrictions of any +kind, including without limitation, intellectual property rights or licensing +obligations. + +Compliance with laws. You agree to comply with all relevant laws and regulations +governing your use, transfer, import or export (or prohibition thereof) of the +Software. + +Governing law. All disputes will be governed by the laws of the United States of +America and the State of Delaware without reference to conflict of law +principles and subject to the exclusive jurisdiction of the state or federal +courts sitting in the State of Delaware, and each party agrees that it submits +to the personal jurisdiction and venue of those courts and waives any +objections. THE UNITED NATIONS CONVENTION ON CONTRACTS FOR THE INTERNATIONAL +SALE OF GOODS (1980) IS SPECIFICALLY EXCLUDED AND WILL NOT APPLY TO THE SOFTWARE. + +------------------------------------------------------------------------------ +Orbbec SDK distributed with arm64 MacOS packages. + +MIT License + +Copyright (c) 2023 OrbbecDeveloper + +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. + +------------------------------------------------------------------------------ + +libavif library and it's dependnecies are redistributed within all opencv-python packages. + +Copyright 2019 Joe Drago. 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. + +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. + +------------------------------------------------------------------------------ + +Files: src/obu.c + +Copyright © 2018-2019, VideoLAN and dav1d 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: + +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. + +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. + +------------------------------------------------------------------------------ + +Files: third_party/iccjpeg/* + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +------------------------------------------------------------------------------ + +Files: contrib/gdk-pixbuf/* + +Copyright 2020 Emmanuel Gil Peyrot. 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. + +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. + +------------------------------------------------------------------------------ + +Files: android_jni/gradlew* + + + 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. + +------------------------------------------------------------------------------ + +Files: third_party/libyuv/* + +Copyright 2011 The LibYuv Project 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 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. + +------------------------------------------------------------------------------ + +aom library and it's dependnecies are redistributed within all opencv-python packages. + +Copyright (c) 2016, Alliance for Open Media. 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. + +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. + +------------------------------------------------------------------------------ + +KAZE Features library is redistributed within all opencv-python packages. + +Copyright (c) 2012, Pablo Fernández Alcantarilla +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 the copyright holders 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. + +------------------------------------------------------------------------------ + +AKAZE Features library is redistributed within all opencv-python packages. + +Copyright (c) 2014, Pablo Fernandez Alcantarilla, Jesus Nuevo +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 the copyright holders 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. + + +opencv-python +Apache Software License +https://github.com/opencv/opencv-python +OpenCV library is redistributed within opencv-python package. +This license applies to OpenCV binary in the directory cv2/. + + + 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. + +------------------------------------------------------------------------------ +libvpx is redistributed within all opencv-python Linux packages. +This license applies to libvpx binary in the directory cv2/. + +Copyright (c) 2010, The WebM Project 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, nor the WebM Project, 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. + +------------------------------------------------------------------------------ +FFmpeg is redistributed within all opencv-python packages. + +Libbluray, libgnutls, libnettle, libhogweed, libintl, libmp3lame, libp11, +librtmp, libsoxr and libtasn1 are redistributed within all opencv-python macOS packages. + +This license applies to the above library binaries in the directory cv2/. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + +------------------------------------------------------------------------------ +Qt 5 is redistributed within non-headless opencv-python Linux and macOS packages. +libgmp is redistributed within opencv-python macOS packages. +libidn2 is redistributed within opencv-python macOS packages. +libunistring is redistributed within opencv-python macOS packages. +This license applies to the above binaries in the directory cv2/. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +------------------------------------------------------------------------------ +bzip2 is redistributed within all opencv-python Linux packages. +This license applies to libbz2 binary in the directory cv2/. + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2010 Julian R Seward. 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. 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. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +Julian Seward, jseward@bzip.org +bzip2/libbzip2 version 1.0.6 of 6 September 2010 + +------------------------------------------------------------------------------ +libcrypto and libssl are redistributed within all opencv-python Linux and macOS packages. +libopencore-amrnb and libopencore-amrwb are redistributed within all opencv-python Linux and macOS packages. +This license applies to above binaries in the directory cv2/. + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. 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. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are adhered to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * 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 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the routines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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 licence and distribution terms for any publicly available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +------------------------------------------------------------------------------ +libfontconfig is redistributed within all opencv-python macOS packages. +This license applies to libfontconfig binary in the directory cv2/. + +Copyright © 2000,2001,2002,2003,2004,2006,2007 Keith Packard +Copyright © 2005 Patrick Lam +Copyright © 2009 Roozbeh Pournader +Copyright © 2008,2009 Red Hat, Inc. +Copyright © 2008 Danilo Šegan +Copyright © 2012 Google, Inc. + + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of the author(s) not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. The authors make no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE AUTHOR(S) BE LIABLE FOR 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 THIS SOFTWARE. + +------------------------------------------------------------------------------ +libfreetype is redistributed within opencv-python Linux and macOS packages. +This license applies to libfreetype binary in the directory cv2/. + + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + +------------------------------------------------------------------------------ +libpng is redistributed within all opencv-python Linux and macOS packages. +This license applies to libpng binary in the directory cv2/. + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2019 The PNG Reference Library Authors. + * Copyright (c) 2018-2019 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +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 Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + +------------------------------------------------------------------------------ +libz is redistributed within all opencv-python Linux packages. +This license applies to libz binary in the directory cv2/. + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +------------------------------------------------------------------------------ +libdav1d is redistributed within opencv-python macOS packages. +This license applies to libdav1d binary in the directory cv2/. + +Copyright © 2018-2019, VideoLAN and dav1d 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: + +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. + +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. + +------------------------------------------------------------------------------ +libffi is redistributed within opencv-python macOS packages. +This license applies to libffi binary in the directory cv2/. + +libffi - Copyright (c) 1996-2020 Anthony Green, Red Hat, Inc and others. +See source files for details. + +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. + +------------------------------------------------------------------------------ +libogg is redistributed within opencv-python macOS packages. +This license applies to libogg binary in the directory cv2/. + +Copyright (c) 2002, Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +libopenjp2 is redistributed within opencv-python macOS packages. +This license applies to libopenjp2 binary in the directory cv2/. + +The copyright in this software is being made available under the 2-clauses +BSD License, included below. This software may be subject to other third +party and contributor rights, including patent rights, and no such rights +are granted under this license. + +Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium +Copyright (c) 2002-2014, Professor Benoit Macq +Copyright (c) 2003-2014, Antonin Descampe +Copyright (c) 2003-2009, Francois-Olivier Devaux +Copyright (c) 2005, Herve Drolon, FreeImage Team +Copyright (c) 2002-2003, Yannick Verschueren +Copyright (c) 2001-2003, David Janssens +Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France +Copyright (c) 2012, CS Systemes d'Information, France + +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. + +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. + +------------------------------------------------------------------------------ +libopus is redistributed within opencv-python macOS packages. +This license applies to libopus binary in the directory cv2/. + +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +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 Internet Society, IETF or IETF Trust, nor the +names of specific 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. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ + +------------------------------------------------------------------------------ +librav1e is redistributed within opencv-python macOS packages. +This license applies to librav1e binary in the directory cv2/. + +BSD 2-Clause License + +Copyright (c) 2017-2020, the rav1e contributors +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. + +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. + +------------------------------------------------------------------------------ +libsnappy is redistributed within opencv-python macOS packages. +This license applies to libsnappy binary in the directory cv2/. + +Copyright 2011, 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. + +------------------------------------------------------------------------------ +libspeex is redistributed within opencv-python macOS packages. +This license applies to libspeex binary in the directory cv2/. + +Copyright 2002-2008 Xiph.org Foundation +Copyright 2002-2008 Jean-Marc Valin +Copyright 2005-2007 Analog Devices Inc. +Copyright 2005-2008 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) +Copyright 1993, 2002, 2006 David Rowe +Copyright 2003 EpicGames +Copyright 1992-1994 Jutta Degener, Carsten Bormann + +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 the Xiph.org Foundation 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 FOUNDATION 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. + +------------------------------------------------------------------------------ +libsrt is redistributed within opencv-python macOS packages. +This license applies to libsrt binary in the directory cv2/. + +/* + * + * Copyright (c) 2001-2017 Cisco Systems, 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 the Cisco Systems, 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 HOLDERS 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. + * + */ + + + Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +------------------------------------------------------------------------------ +libtheoradec and libtheoraenc are redistributed within opencv-python macOS packages. +This license applies to libtheoradec and libtheoraenc binaries in the directory cv2/. + + Copyright (C) 2002-2009 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +libwebp and libwebpmux are redistributed within all opencv-python packages. +This license applies to libwebp and libwebpmux binaries in the directory cv2/. + +Copyright (c) 2010, 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 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. + +------------------------------------------------------------------------------ +libvorbis and libvorbisenc are redistributed within opencv-python macOS packages. +This license applies to libvorbis and libvorbisenc binaries in the directory cv2/. + +Copyright (c) 2002-2020 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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. + +------------------------------------------------------------------------------ +Libxcb utility libraries are redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb related binaries in the directory cv2/. + +Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett. +All Rights Reserved. + +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 +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. + +Except as contained in this notice, the names of the authors +or their institutions shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this +Software without prior written authorization from the +authors. + +------------------------------------------------------------------------------ +Libxcb-image is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-image binary in the directory cv2/. + +Copyright © 2007-2008 Bart Massey +Copyright © 2008 Julien Danjou +Copyright © 2008 Keith Packard + +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 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. + +Except as contained in this notice, the names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-util is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-util binary in the directory cv2/. + +Copyright © 2008 Bart Massey +Copyright © 2008 Ian Osgood +Copyright © 2008 Jamey Sharp +Copyright © 2008 Josh Triplett +Copyright © 2008-2009 Julien Danjou + +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 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. + +Except as contained in this notice, the names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-render-util is redistributed within opencv-python non-headless Linux packages. +This license applies to libxcb-render-util binary in the directory cv2/. + +Copyright © 2000 Keith Packard + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL KEITH PACKARD BE LIABLE FOR 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 THIS SOFTWARE. + +Copyright © 2006 Jamey Sharp. + +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 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. + +Except as contained in this notice, the names of the authors or their +institutions shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization from the authors. + +Copyright © 2006 Ian Osgood + +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 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. + +Except as contained in this notice, the names of the authors or their +institutions shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization from the authors. + +------------------------------------------------------------------------------ +Libxcb-icccm is redistributed within opencv-python non-headless Linux packages. +This license applies to Libxcb-icccm binary in the directory cv2/. + +Copyright © 2008-2011 Arnaud Fontaine +Copyright © 2007-2008 Vincent Torri + +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 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. + +Except as contained in this notice, the names of the authors or +their institutions shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Software without +prior written authorization from the authors. + +------------------------------------------------------------------------------ +libXau is redistributed within opencv-python non-headless Linux packages. +This license applies to libXau binary in the directory cv2/. + +Copyright 1988, 1993, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +------------------------------------------------------------------------------ +Vulkan headers are redistributed within all opencv-python packages. +This license applies to Vulkan headers in the directory 3rdparty/include/vulkan. + +Copyright (c) 2015-2018 The Khronos Group Inc. + +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. + +------------------------------------------------------------------------------ +Libjpeg-turbo is redistributed within all opencv-python packages as build option. + +libjpeg-turbo Licenses +====================== + +libjpeg-turbo is covered by three compatible BSD-style open source licenses: + +- The IJG (Independent JPEG Group) License, which is listed in + [README.ijg](README.ijg) + + This license applies to the libjpeg API library and associated programs + (any code inherited from libjpeg, and any modifications to that code.) + +- The Modified (3-clause) BSD License, which is listed below + + This license covers the TurboJPEG API library and associated programs, as + well as the build system. + +- The [zlib License](https://opensource.org/licenses/Zlib) + + This license is a subset of the other two, and it covers the libjpeg-turbo + SIMD extensions. + + +Complying with the libjpeg-turbo Licenses +========================================= + +This section provides a roll-up of the libjpeg-turbo licensing terms, to the +best of our understanding. + +1. If you are distributing a modified version of the libjpeg-turbo source, + then: + + 1. You cannot alter or remove any existing copyright or license notices + from the source. + + **Origin** + - Clause 1 of the IJG License + - Clause 1 of the Modified BSD License + - Clauses 1 and 3 of the zlib License + + 2. You must add your own copyright notice to the header of each source + file you modified, so others can tell that you modified that file (if + there is not an existing copyright header in that file, then you can + simply add a notice stating that you modified the file.) + + **Origin** + - Clause 1 of the IJG License + - Clause 2 of the zlib License + + 3. You must include the IJG README file, and you must not alter any of the + copyright or license text in that file. + + **Origin** + - Clause 1 of the IJG License + +2. If you are distributing only libjpeg-turbo binaries without the source, or + if you are distributing an application that statically links with + libjpeg-turbo, then: + + 1. Your product documentation must include a message stating: + + This software is based in part on the work of the Independent JPEG + Group. + + **Origin** + - Clause 2 of the IJG license + + 2. If your binary distribution includes or uses the TurboJPEG API, then + your product documentation must include the text of the Modified BSD + License (see below.) + + **Origin** + - Clause 2 of the Modified BSD License + +3. You cannot use the name of the IJG or The libjpeg-turbo Project or the + contributors thereof in advertising, publicity, etc. + + **Origin** + - IJG License + - Clause 3 of the Modified BSD License + +4. The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be + free of defects, nor do we accept any liability for undesirable + consequences resulting from your use of the software. + + **Origin** + - IJG License + - Modified BSD License + - zlib License + + +The Modified (3-clause) BSD License +=================================== + +Copyright (C)2009-2022 D. R. Commander. All Rights Reserved.
+Copyright (C)2015 Viktor Szathmáry. 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 the libjpeg-turbo Project 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 HOLDERS 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. + + +Why Three Licenses? +=================== + +The zlib License could have been used instead of the Modified (3-clause) BSD +License, and since the IJG License effectively subsumes the distribution +conditions of the zlib License, this would have effectively placed +libjpeg-turbo binary distributions under the IJG License. However, the IJG +License specifically refers to the Independent JPEG Group and does not extend +attribution and endorsement protections to other entities. Thus, it was +desirable to choose a license that granted us the same protections for new code +that were granted to the IJG for code derived from their software. + +------------------------------------------------------------------------------ +Libspng is redistributed within all opencv-python packages as build option. + +BSD 2-Clause License + +Copyright (c) 2018-2022, Randy +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. + +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. + +------------------------------------------------------------------------------ +QUIRC library is redistributed within all opencv-python packages. + +quirc -- QR-code recognition library +Copyright (C) 2010-2012 Daniel Beer + +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. + +------------------------------------------------------------------------------ +Flatbuffers library is redistributed within all opencv-python packages. + + 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. + +------------------------------------------------------------------------------ +Protobuf library is redistributed within all opencv-python packages. + +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. + +------------------------------------------------------------------------------ +OpenJPEG library is redistributed within all opencv-python packages. + +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * 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. + * + * 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. + */ + +------------------------------------------------------------------------------ +TIFF library is redistributed within all opencv-python packages. + +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. + +------------------------------------------------------------------------------ +OpenEXR library is redistributed within all opencv-python packages. + +Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +Entertainment Company Ltd. Portions contributed and copyright held by +others as indicated. 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 Industrial Light & Magic nor the names of + any other contributors to this software 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. + +------------------------------------------------------------------------------ +Intel(R) IPP ICV library statically linked within x86 and x86_64 opencv-python packages. + +Intel(R) Integrated Performance Primitives 2021 Update 10 + +Intel Simplified Software License (Version October 2022) + +Intel(R) Integrated Performance Primitives (Intel(R) IPP) : Copyright (C) 1997 Intel Corporation + +Use and Redistribution. You may use and redistribute the software, which is +provided in binary form only, (the "Software"), without modification, +provided the following conditions are met: + +* Redistributions must reproduce the above copyright notice and these + terms of use in the Software and in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel nor the names of its suppliers may be used to + endorse or promote products derived from this Software without specific + prior written permission. +* No reverse engineering, decompilation, or disassembly of the Software is + permitted, nor any modification or alteration of the Software or its operation + at any time, including during execution. + +No other licenses. Except as provided in the preceding section, Intel grants no +licenses or other rights by implication, estoppel or otherwise to, patent, +copyright, trademark, trade name, service mark or other intellectual property +licenses or rights of Intel. + +Third party software. "Third Party Software" means the files (if any) listed +in the "third-party-software.txt" or other similarly-named text file that may +be included with the Software. Third Party Software, even if included with the +distribution of the Software, may be governed by separate license terms, including +without limitation, third party license terms, open source software notices and +terms, and/or other Intel software license terms. These separate license terms +solely govern Your use of the Third Party Software. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE +DISCLAIMED. THIS SOFTWARE IS NOT INTENDED FOR USE IN SYSTEMS OR APPLICATIONS +WHERE FAILURE OF THE SOFTWARE MAY CAUSE PERSONAL INJURY OR DEATH AND YOU AGREE +THAT YOU ARE FULLY RESPONSIBLE FOR ANY CLAIMS, COSTS, DAMAGES, EXPENSES, AND +ATTORNEYS' FEES ARISING OUT OF ANY SUCH USE, EVEN IF ANY CLAIM ALLEGES THAT +INTEL WAS NEGLIGENT REGARDING THE DESIGN OR MANUFACTURE OF THE SOFTWARE. + +LIMITATION OF LIABILITY. IN NO EVENT WILL INTEL 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. + +No support. Intel may make changes to the Software, at any time without notice, +and is not obligated to support, update or provide training for the Software. + +Termination. Your right to use the Software is terminated in the event of your +breach of this license. + +Feedback. Should you provide Intel with comments, modifications, corrections, +enhancements or other input ("Feedback") related to the Software, Intel will be +free to use, disclose, reproduce, license or otherwise distribute or exploit the +Feedback in its sole discretion without any obligations or restrictions of any +kind, including without limitation, intellectual property rights or licensing +obligations. + +Compliance with laws. You agree to comply with all relevant laws and regulations +governing your use, transfer, import or export (or prohibition thereof) of the +Software. + +Governing law. All disputes will be governed by the laws of the United States of +America and the State of Delaware without reference to conflict of law +principles and subject to the exclusive jurisdiction of the state or federal +courts sitting in the State of Delaware, and each party agrees that it submits +to the personal jurisdiction and venue of those courts and waives any +objections. THE UNITED NATIONS CONVENTION ON CONTRACTS FOR THE INTERNATIONAL +SALE OF GOODS (1980) IS SPECIFICALLY EXCLUDED AND WILL NOT APPLY TO THE SOFTWARE. + +------------------------------------------------------------------------------ +Orbbec SDK distributed with arm64 MacOS packages. + +MIT License + +Copyright (c) 2023 OrbbecDeveloper + +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. + +------------------------------------------------------------------------------ + +libavif library and it's dependnecies are redistributed within all opencv-python packages. + +Copyright 2019 Joe Drago. 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. + +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. + +------------------------------------------------------------------------------ + +Files: src/obu.c + +Copyright © 2018-2019, VideoLAN and dav1d 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: + +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. + +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. + +------------------------------------------------------------------------------ + +Files: third_party/iccjpeg/* + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +------------------------------------------------------------------------------ + +Files: contrib/gdk-pixbuf/* + +Copyright 2020 Emmanuel Gil Peyrot. 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. + +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. + +------------------------------------------------------------------------------ + +Files: android_jni/gradlew* + + + 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. + +------------------------------------------------------------------------------ + +Files: third_party/libyuv/* + +Copyright 2011 The LibYuv Project 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 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. + +------------------------------------------------------------------------------ + +aom library and it's dependnecies are redistributed within all opencv-python packages. + +Copyright (c) 2016, Alliance for Open Media. 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. + +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. + +------------------------------------------------------------------------------ + +KAZE Features library is redistributed within all opencv-python packages. + +Copyright (c) 2012, Pablo Fernández Alcantarilla +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 the copyright holders 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. + +------------------------------------------------------------------------------ + +AKAZE Features library is redistributed within all opencv-python packages. + +Copyright (c) 2014, Pablo Fernandez Alcantarilla, Jesus Nuevo +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 the copyright holders 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. + + +opentelemetry-api +Apache-2.0 +https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api + 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. + + +opentelemetry-exporter-otlp-proto-common +Apache-2.0 +https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-common + 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. + + +opentelemetry-exporter-otlp-proto-http +Apache-2.0 +https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-http + 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. + + +opentelemetry-proto +Apache-2.0 +https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-proto + 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. + + +opentelemetry-sdk +Apache-2.0 +https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk + 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. + + +opentelemetry-semantic-conventions +Apache-2.0 +https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-semantic-conventions + 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. + + +orderly-set +MIT License +https://github.com/seperman/orderly-set +UNKNOWN + +orjson +MPL-2.0 AND (Apache-2.0 OR MIT) +https://github.com/ijl/orjson + 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. + + +packaging +Apache Software License; BSD License +https://github.com/pypa/packaging +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made +under the terms of *both* these licenses. + + +pandas +BSD License +https://pandas.pydata.org +BSD 3-Clause License + +Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team +All rights reserved. + +Copyright (c) 2011-2023, Open source contributors. + +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 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. +Copyright (c) 2010-2019 Keith Goodman +Copyright (c) 2019 Bottleneck Developers +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. + +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.Copyright 2017- Paul Ganssle +Copyright 2017- dateutil contributors (see 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 above license applies to all contributions after 2017-12-01, as well as +all contributions that have been re-licensed (see AUTHORS file for the list of +contributors who have re-licensed their code). +-------------------------------------------------------------------------------- +dateutil - Extensions to the standard Python datetime module. + +Copyright (c) 2003-2011 - Gustavo Niemeyer +Copyright (c) 2012-2014 - Tomi Pieviläinen +Copyright (c) 2014-2016 - Yaron de Leeuw +Copyright (c) 2015- - Paul Ganssle +Copyright (c) 2015- - dateutil contributors (see AUTHORS file) + +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 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 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. + +The above BSD License Applies to all code, even that also covered by Apache 2.0.# MIT License + +Copyright (c) 2019 Hadley Wickham; RStudio; and Evan Miller + +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. +Based on http://opensource.org/licenses/MIT + +This is a template. Complete and ship as file LICENSE the following 2 +lines (only) + +YEAR: +COPYRIGHT HOLDER: + +and specify as + +License: MIT + file LICENSE + +Copyright (c) , + +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 MIT License + +Copyright (c) 2008- Attractive Chaos + +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.musl as a whole is licensed under the following standard MIT license: + +---------------------------------------------------------------------- +Copyright © 2005-2020 Rich Felker, et al. + +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. +---------------------------------------------------------------------- + +Authors/contributors include: + +A. Wilcox +Ada Worcester +Alex Dowad +Alex Suykov +Alexander Monakov +Andre McCurdy +Andrew Kelley +Anthony G. Basile +Aric Belsito +Arvid Picciani +Bartosz Brachaczek +Benjamin Peterson +Bobby Bingham +Boris Brezillon +Brent Cook +Chris Spiegel +Clément Vasseur +Daniel Micay +Daniel Sabogal +Daurnimator +David Carlier +David Edelsohn +Denys Vlasenko +Dmitry Ivanov +Dmitry V. Levin +Drew DeVault +Emil Renner Berthing +Fangrui Song +Felix Fietkau +Felix Janda +Gianluca Anzolin +Hauke Mehrtens +He X +Hiltjo Posthuma +Isaac Dunham +Jaydeep Patil +Jens Gustedt +Jeremy Huntwork +Jo-Philipp Wich +Joakim Sindholt +John Spencer +Julien Ramseier +Justin Cormack +Kaarle Ritvanen +Khem Raj +Kylie McClain +Leah Neukirchen +Luca Barbato +Luka Perkov +M Farkas-Dyck (Strake) +Mahesh Bodapati +Markus Wichmann +Masanori Ogino +Michael Clark +Michael Forney +Mikhail Kremnyov +Natanael Copa +Nicholas J. Kain +orc +Pascal Cuoq +Patrick Oppenlander +Petr Hosek +Petr Skocik +Pierre Carrier +Reini Urban +Rich Felker +Richard Pennington +Ryan Fairfax +Samuel Holland +Segev Finer +Shiz +sin +Solar Designer +Stefan Kristiansson +Stefan O'Rear +Szabolcs Nagy +Timo Teräs +Trutz Behn +Valentin Ochs +Will Dietz +William Haddon +William Pitcock + +Portions of this software are derived from third-party works licensed +under terms compatible with the above MIT license: + +The TRE regular expression implementation (src/regex/reg* and +src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed +under a 2-clause BSD license (license text in the source files). The +included version has been heavily modified by Rich Felker in 2012, in +the interests of size, simplicity, and namespace cleanliness. + +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. + +The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008 +The Android Open Source Project and is licensed under a two-clause BSD +license. It was taken from Bionic libc, used on Android. + +The AArch64 memcpy and memset code (src/string/aarch64/*) are +Copyright © 1999-2019, Arm Limited. + +The implementation of DES for crypt (src/crypt/crypt_des.c) is +Copyright © 1994 David Burren. It is licensed under a BSD license. + +The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was +originally written by Solar Designer and placed into the public +domain. The code also comes with a fallback permissive license for use +in jurisdictions that may not recognize the public domain. + +The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 +Valentin Ochs and is licensed under an MIT-style license. + +The x86_64 port was written by Nicholas J. Kain and is licensed under +the standard MIT terms. + +The mips and microblaze ports were originally written by Richard +Pennington for use in the ellcc project. The original code was adapted +by Rich Felker for build system and code conventions during upstream +integration. It is licensed under the standard MIT terms. + +The mips64 port was contributed by Imagination Technologies and is +licensed under the standard MIT terms. + +The powerpc port was also originally written by Richard Pennington, +and later supplemented and integrated by John Spencer. It is licensed +under the standard MIT terms. + +All other files which have no copyright comments are original works +produced specifically for use as part of this library, written either +by Rich Felker, the main author of the library, or by one or more +contibutors listed above. Details on authorship of individual files +can be found in the git version control history of the project. The +omission of copyright and license comments in each file is in the +interest of source tree size. + +In addition, permission is hereby granted for all public header files +(include/* and arch/*/bits/*) and crt files intended to be linked into +applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit +the copyright notice and permission notice otherwise required by the +license, and to use these files without any requirement of +attribution. These files include substantial contributions from: + +Bobby Bingham +John Spencer +Nicholas J. Kain +Rich Felker +Richard Pennington +Stefan Kristiansson +Szabolcs Nagy + +all of whom have explicitly granted such permission. + +This file previously contained text expressing a belief that most of +the files covered by the above exception were sufficiently trivial not +to be subject to copyright, resulting in confusion over whether it +negated the permissions granted in the license. In the spirit of +permissive licensing, and of not having licensing issues being an +obstacle to adoption, that text has been removed.Copyright (c) 2005-2023, NumPy Developers. +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 the NumPy Developers nor the names of any + 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. + 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 + + +Copyright (c) Donald Stufft and individual contributors. +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. + +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.A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. +Copyright (c) 2014, Al Sweigart +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 the {organization} 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.Copyright (c) 2017 Anthony Sottile + +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.Copyright (c) 2015-2019 Jared Hobbs + +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.Developed by ESN, an Electronic Arts Inc. studio. +Copyright (c) 2014, Electronic Arts 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 ESN, Electronic Arts 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 ELECTRONIC ARTS INC. 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. + +---- + +Portions of code from MODP_ASCII - Ascii transformations (upper/lower, etc) +https://github.com/client9/stringencoders + + Copyright 2005, 2006, 2007 + Nick Galbreath -- nickg [at] modp [dot] com + 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 the modp.com 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. + + This is the standard "new" BSD license: + http://www.opensource.org/licenses/bsd-license.php + +https://github.com/client9/stringencoders/blob/cfd5c1507325ae497ea9bacdacba12c0ffd79d30/COPYING + +---- + +Numeric decoder derived from from TCL library +https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms + * Copyright (c) 1988-1993 The Regents of the University of California. + * Copyright (c) 1994 Sun Microsystems, Inc. + + This software is copyrighted by the Regents of the University of + California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState + Corporation and other parties. The following terms apply to all files + associated with the software unless explicitly disclaimed in + individual files. + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. + + IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY + FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY + DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE + IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE + NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. + + GOVERNMENT USE: If you are acquiring this software on behalf of the + U.S. government, the Government shall have only "Restricted Rights" + in the software and related documentation as defined in the Federal + Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you + are acquiring the software on behalf of the Department of Defense, the + software shall be classified as "Commercial Computer Software" and the + Government shall have only "Restricted Rights" as defined in Clause + 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the + authors grant the U.S. Government and others acting in its behalf + permission to use and distribute the software in accordance with the + terms specified in this 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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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. + +pandocfilters +BSD License +http://github.com/jgm/pandocfilters +Copyright (c) 2013, John MacFarlane +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 John Macfarlane 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. + + +parse +MIT +https://github.com/r1chardj0n3s/parse +Copyright (c) 2012-2019 Richard Jones + +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. + + +parso +MIT License +https://github.com/davidhalter/parso +All contributions towards parso are MIT licensed. + +Some Python files have been taken from the standard library and are therefore +PSF licensed. Modifications on these files are dual licensed (both MIT and +PSF). These files are: + +- parso/pgen2/* +- parso/tokenize.py +- parso/token.py +- test/test_pgen2.py + +Also some test files under test/normalizer_issue_files have been copied from +https://github.com/PyCQA/pycodestyle (Expat License == MIT License). + +------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) <2013-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. + +------------------------------------------------------------------------------- + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved" +are retained in Python alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +pathspec +Mozilla Public License 2.0 (MPL 2.0) +UNKNOWN +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + + +peft +Apache Software License +https://github.com/huggingface/peft + 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. + + +pexpect +ISC License (ISCL) +https://pexpect.readthedocs.io/ +ISC LICENSE + + This license is approved by the OSI and FSF as GPL-compatible. + http://opensource.org/licenses/isc-license.txt + + Copyright (c) 2013-2014, Pexpect development team + Copyright (c) 2012, Noah Spurrier + + 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. + + + +pillow +MIT-CMU +https://python-pillow.github.io +The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh and contributors + +Pillow is the friendly PIL fork. It is + + Copyright © 2010 by Jeffrey A. Clark and contributors + +Like PIL, Pillow is licensed under the open source MIT-CMU License: + +By obtaining, using, and/or copying this software and/or its associated +documentation, you agree that you have read, understood, and will comply +with the following terms and conditions: + +Permission to use, copy, modify and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies, and that +both that copyright notice and this permission notice appear in supporting +documentation, and that the name of Secret Labs AB or the author not be +used in advertising or publicity pertaining to distribution of the software +without specific, written prior permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR 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 THIS SOFTWARE. + + +---- + +AOM + +Copyright (c) 2016, Alliance for Open Media. 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. + +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. + + +---- + +BROTLI + +Copyright (c) 2009, 2010, 2013-2016 by the Brotli 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. + + +---- + +BZIP2 + + +-------------------------------------------------------------------------- + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2019 Julian R Seward. 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. 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. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +Julian Seward, jseward@acm.org +bzip2/libbzip2 version 1.0.8 of 13 July 2019 + +-------------------------------------------------------------------------- + + +---- + +DAV1D + +Copyright © 2018-2019, VideoLAN and dav1d 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: + +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. + +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. + + +---- + +FREETYPE2 + +The FreeType 2 font engine is copyrighted work and cannot be used +legally without a software license. In order to make this project +usable to a vast majority of developers, we distribute it under two +mutually exclusive open-source licenses. + +This means that *you* must choose *one* of the two licenses described +below, then obey all its terms and conditions when using FreeType 2 in +any of your projects or products. + + - The FreeType License, found in the file `docs/FTL.TXT`, which is + similar to the original BSD license *with* an advertising clause + that forces you to explicitly cite the FreeType project in your + product's documentation. All details are in the license file. + This license is suited to products which don't use the GNU General + Public License. + + Note that this license is compatible to the GNU General Public + License version 3, but not version 2. + + - The GNU General Public License version 2, found in + `docs/GPLv2.TXT` (any later version can be used also), for + programs which already use the GPL. Note that the FTL is + incompatible with GPLv2 due to its advertisement clause. + +The contributed BDF and PCF drivers come with a license similar to +that of the X Window System. It is compatible to the above two +licenses (see files `src/bdf/README` and `src/pcf/README`). The same +holds for the source code files `src/base/fthash.c` and +`include/freetype/internal/fthash.h`; they were part of the BDF driver +in earlier FreeType versions. + +The gzip module uses the zlib license (see `src/gzip/zlib.h`) which +too is compatible to the above two licenses. + +The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code +taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses +the 'Old MIT' license, compatible to the above two licenses. + +The MD5 checksum support (only used for debugging in development +builds) is in the public domain. + +-------------------------------------------------------------------------- + + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + + +--- end of FTL.TXT --- + +The following license details are part of `src/bdf/README`: + +``` +License +******* + +Copyright (C) 2001-2002 by Francesco Zappa Nardelli + +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. + +*** Portions of the driver (that is, bdflib.c and bdf.h): + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2002, 2011 Francesco Zappa Nardelli + +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 COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY 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. + + +Credits +******* + +This driver is based on excellent Mark Leisher's bdf library. If you +find something good in this driver you should probably thank him, not +me. +``` + +The following license details are part of `src/pcf/README`: + +``` +License +******* + +Copyright (C) 2000 by Francesco Zappa Nardelli + +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. + + +Credits +******* + +Keith Packard wrote the pcf driver found in XFree86. His work is at +the same time the specification and the sample implementation of the +PCF format. Undoubtedly, this driver is inspired from his work. +``` + + +---- + +HARFBUZZ + +HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. +For parts of HarfBuzz that are licensed under different licenses see individual +files names COPYING in subdirectories where applicable. + +Copyright © 2010-2022 Google, Inc. +Copyright © 2015-2020 Ebrahim Byagowi +Copyright © 2019,2020 Facebook, Inc. +Copyright © 2012,2015 Mozilla Foundation +Copyright © 2011 Codethink Limited +Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright © 2009 Keith Stribley +Copyright © 2011 Martin Hosken and SIL International +Copyright © 2007 Chris Wilson +Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod +Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc. +Copyright © 1998-2005 David Turner and Werner Lemberg +Copyright © 2016 Igalia S.L. +Copyright © 2022 Matthias Clasen +Copyright © 2018,2021 Khaled Hosny +Copyright © 2018,2019,2020 Adobe, Inc +Copyright © 2013-2015 Alexei Podtelezhnikov + +For full copyright notices consult the individual files in the package. + + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + +---- + +LCMS2 + +Little CMS +Copyright (c) 1998-2020 Marti Maria Saguer + +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. + + +---- + +LIBAVIF + +Copyright 2019 Joe Drago. 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. + +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. + +------------------------------------------------------------------------------ + +Files: src/obu.c + +Copyright © 2018-2019, VideoLAN and dav1d 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: + +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. + +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. + +------------------------------------------------------------------------------ + +Files: third_party/iccjpeg/* + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +------------------------------------------------------------------------------ + +Files: contrib/gdk-pixbuf/* + +Copyright 2020 Emmanuel Gil Peyrot. 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. + +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. + +------------------------------------------------------------------------------ + +Files: android_jni/gradlew* + + + 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. + +------------------------------------------------------------------------------ + +Files: third_party/libyuv/* + +Copyright 2011 The LibYuv Project 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 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. + + +---- + +LIBJPEG + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +---- + +LIBLZMA + +XZ Utils Licensing +================== + + Different licenses apply to different files in this package. Here + is a rough summary of which licenses apply to which parts of this + package (but check the individual files to be sure!): + + - liblzma is in the public domain. + + - xz, xzdec, and lzmadec command line tools are in the public + domain unless GNU getopt_long had to be compiled and linked + in from the lib directory. The getopt_long code is under + GNU LGPLv2.1+. + + - The scripts to grep, diff, and view compressed files have been + adapted from gzip. These scripts and their documentation are + under GNU GPLv2+. + + - All the documentation in the doc directory and most of the + XZ Utils specific documentation files in other directories + are in the public domain. + + - Translated messages are in the public domain. + + - The build system contains public domain files, and files that + are under GNU GPLv2+ or GNU GPLv3+. None of these files end up + in the binaries being built. + + - Test files and test code in the tests directory, and debugging + utilities in the debug directory are in the public domain. + + - The extra directory may contain public domain files, and files + that are under various free software licenses. + + You can do whatever you want with the files that have been put into + the public domain. If you find public domain legally problematic, + take the previous sentence as a license grant. If you still find + the lack of copyright legally problematic, you have too many + lawyers. + + As usual, this software is provided "as is", without any warranty. + + If you copy significant amounts of public domain code from XZ Utils + into your project, acknowledging this somewhere in your software is + polite (especially if it is proprietary, non-free software), but + naturally it is not legally required. Here is an example of a good + notice to put into "about box" or into documentation: + + This software includes code from XZ Utils . + + The following license texts are included in the following files: + - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 + - COPYING.GPLv2: GNU General Public License version 2 + - COPYING.GPLv3: GNU General Public License version 3 + + Note that the toolchain (compiler, linker etc.) may add some code + pieces that are copyrighted. Thus, it is possible that e.g. liblzma + binary wouldn't actually be in the public domain in its entirety + even though it contains no copyrighted code from the XZ Utils source + package. + + If you have questions, don't hesitate to ask the author(s) for more + information. + + +---- + +LIBPNG + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE +========================================= + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * Copyright (c) 2018-2022 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +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 Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + + +---- + +LIBTIFF + +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. + + +---- + +LIBWEBP + +Copyright (c) 2010, 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 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. + + +---- + +LIBYUV + +Copyright 2011 The LibYuv Project 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 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. + + +---- + +OPENJPEG + +* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * 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. + * + * 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. + */ + + +---- + +RAQM + +The MIT License (MIT) + +Copyright © 2015 Information Technology Authority (ITA) +Copyright © 2016 Khaled Hosny + +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. + + +---- + +XAU + +Copyright 1988, 1993, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +---- + +XCB + +Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett. +All Rights Reserved. + +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 +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. + +Except as contained in this notice, the names of the authors +or their institutions shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this +Software without prior written authorization from the +authors. + + +---- + +XDMCP + +Copyright 1989, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +Author: Keith Packard, MIT X Consortium + + +---- + +ZLIB + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. + + +platformdirs +MIT +https://github.com/tox-dev/platformdirs +MIT License + +Copyright (c) 2010-202x The platformdirs developers + +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. + + +pluggy +MIT License +UNKNOWN +The MIT License (MIT) + +Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) + +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. + + +plyfile +GNU General Public License v3 or later (GPLv3+) +https://github.com/dranjan/python-plyfile + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +polars +MIT License +https://www.pola.rs/ +Copyright (c) 2025 Ritchie Vink +Some portions Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + +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. + + +polars-runtime-32 +MIT License +https://www.pola.rs/ +Copyright (c) 2025 Ritchie Vink +Some portions Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + +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. + + +polyscope +MIT License +https://github.com/nmwsharp/polyscope +MIT License + +Copyright (c) 2017-2020 Nicholas Sharp and the Polyscope 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. + + +portalocker +BSD-3-Clause +https://github.com/wolph/portalocker/ +Copyright 2022 Rick van Hattem + +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. + + +proglog +MIT +https://github.com/Edinburgh-Genome-Foundry/proglog +MIT License + +Copyright (c) 2017 Edinburgh Genome Foundry, University of Edinburgh + +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. + + +prometheus_client +Apache-2.0 AND BSD-2-Clause +https://github.com/prometheus/client_python + 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. + + +prompt_toolkit +BSD License +https://github.com/prompt-toolkit/python-prompt-toolkit +Copyright (c) 2014, Jonathan Slenders +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 the {organization} 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. + + +propcache +Apache Software License +https://github.com/aio-libs/propcache + + 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. + + +proto-plus +Apache Software License +https://github.com/googleapis/proto-plus-python + + 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. + + +protobuf +3-Clause BSD License +https://developers.google.com/protocol-buffers/ +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. + + +psutil +BSD-3-Clause +https://github.com/giampaolo/psutil +BSD 3-Clause License + +Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola +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 the psutil authors 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. + + +psycopg2-binary +GNU Library or Lesser General Public License (LGPL) +https://psycopg.org/ +psycopg2 and the LGPL +--------------------- + +psycopg2 is free software: you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +psycopg2 is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +In addition, as a special exception, the copyright holders give +permission to link this program with the OpenSSL library (or with +modified versions of OpenSSL that use the same license as OpenSSL), +and distribute linked combinations including the two. + +You must obey the GNU Lesser General Public License in all respects for +all of the code used other than OpenSSL. If you modify file(s) with this +exception, you may extend this exception to your version of the file(s), +but you are not obligated to do so. If you do not wish to do so, delete +this exception statement from your version. If you delete this exception +statement from all source files in the program, then also delete it here. + +You should have received a copy of the GNU Lesser General Public License +along with psycopg2 (see the doc/ directory.) +If not, see . + + +Alternative licenses +-------------------- + +The following BSD-like license applies (at your option) to the files following +the pattern ``psycopg/adapter*.{h,c}`` and ``psycopg/microprotocol*.{h,c}``: + + 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. + + +ptyprocess +ISC License (ISCL) +https://github.com/pexpect/ptyprocess +Ptyprocess is under the ISC license, as code derived from Pexpect. + http://opensource.org/licenses/ISC + +Copyright (c) 2013-2014, Pexpect development team +Copyright (c) 2012, Noah Spurrier + +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. + + + +pure_eval +MIT License +http://github.com/alexmojaki/pure_eval +MIT License + +Copyright (c) 2019 Alex Hall + +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. + + +py-spy +MIT License +https://github.com/benfred/py-spy +The MIT License (MIT) + +Copyright (c) 2018-2019 Ben Frederickson + +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. + + +py3nvml +BSD License +https://github.com/fbcotter/py3nvml.git +COPYRIGHT +--------- +Copyright (c) 2011-2015, NVIDIA Corporation. All rights reserved. + +LICENSE +------- +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 the NVIDIA Corporation 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. + + + + +pyarrow +Apache Software License +https://arrow.apache.org/ + + 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. + +-------------------------------------------------------------------------------- + +src/arrow/util (some portions): Apache 2.0, and 3-clause BSD + +Some portions of this module are derived from code in the Chromium project, +copyright (c) Google inc and (c) The Chromium Authors and licensed under the +Apache 2.0 License or the under the 3-clause BSD license: + + Copyright (c) 2013 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. + +-------------------------------------------------------------------------------- + +This project includes code from Daniel Lemire's FrameOfReference project. + +https://github.com/lemire/FrameOfReference/blob/6ccaf9e97160f9a3b299e23a8ef739e711ef0c71/src/bpacking.cpp +https://github.com/lemire/FrameOfReference/blob/146948b6058a976bc7767262ad3a2ce201486b93/scripts/turbopacking64.py + +Copyright: 2013 Daniel Lemire +Home page: http://lemire.me/en/ +Project page: https://github.com/lemire/FrameOfReference +License: Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from the TensorFlow project + +Copyright 2015 The TensorFlow Authors. All Rights Reserved. + +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 project includes code from the NumPy project. + +https://github.com/numpy/numpy/blob/e1f191c46f2eebd6cb892a4bfe14d9dd43a06c4e/numpy/core/src/multiarray/multiarraymodule.c#L2910 + +https://github.com/numpy/numpy/blob/68fd82271b9ea5a9e50d4e761061dfcca851382a/numpy/core/src/multiarray/datetime.c + +Copyright (c) 2005-2017, NumPy Developers. +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 the NumPy Developers nor the names of any + 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. + +-------------------------------------------------------------------------------- + +This project includes code from the Boost project + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +This project includes code from the FlatBuffers project + +Copyright 2014 Google Inc. + +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 project includes code from the tslib project + +Copyright 2015 Microsoft Corporation. All rights reserved. + +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 project includes code from the jemalloc project + +https://github.com/jemalloc/jemalloc + +Copyright (C) 2002-2017 Jason Evans . +All rights reserved. +Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved. +Copyright (C) 2009-2017 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: +1. Redistributions of source code must retain the above copyright notice(s), + this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice(s), + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``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(S) 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. +-------------------------------------------------------------------------------- + +This project includes code from the Go project, BSD 3-clause license + PATENTS +weak patent termination clause +(https://github.com/golang/go/blob/master/PATENTS). + +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. + +-------------------------------------------------------------------------------- + +This project includes code from the hs2client + +https://github.com/cloudera/hs2client + +Copyright 2016 Cloudera Inc. + +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 script ci/scripts/util_wait_for_it.sh has the following license + +Copyright (c) 2016 Giles Hall + +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 script r/configure has the following license (MIT) + +Copyright (c) 2017, Jeroen Ooms and Jim Hester + +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. + +-------------------------------------------------------------------------------- + +cpp/src/arrow/util/logging.cc, cpp/src/arrow/util/logging.h and +cpp/src/arrow/util/logging-test.cc are adapted from +Ray Project (https://github.com/ray-project/ray) (Apache 2.0). + +Copyright (c) 2016 Ray Project (https://github.com/ray-project/ray) + +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 files cpp/src/arrow/vendored/datetime/date.h, cpp/src/arrow/vendored/datetime/tz.h, +cpp/src/arrow/vendored/datetime/tz_private.h, cpp/src/arrow/vendored/datetime/ios.h, +cpp/src/arrow/vendored/datetime/ios.mm, +cpp/src/arrow/vendored/datetime/tz.cpp are adapted from +Howard Hinnant's date library (https://github.com/HowardHinnant/date) +It is licensed under MIT license. + +The MIT License (MIT) +Copyright (c) 2015, 2016, 2017 Howard Hinnant +Copyright (c) 2016 Adrian Colomitchi +Copyright (c) 2017 Florian Dang +Copyright (c) 2017 Paul Thompson +Copyright (c) 2018 Tomasz 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 file cpp/src/arrow/util/utf8.h includes code adapted from the page + https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ +with the following license (MIT) + +Copyright (c) 2008-2009 Bjoern Hoehrmann + +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 files in cpp/src/arrow/vendored/xxhash/ have the following license +(BSD 2-Clause License) + +xxHash Library +Copyright (c) 2012-2014, Yann Collet +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. + +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. + +You can contact the author at : +- xxHash homepage: http://www.xxhash.com +- xxHash source repository : https://github.com/Cyan4973/xxHash + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/double-conversion/ have the following license +(BSD 3-Clause License) + +Copyright 2006-2011, the V8 project 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. + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/uriparser/ have the following license +(BSD 3-Clause License) + +uriparser - RFC 3986 URI parsing library + +Copyright (C) 2007, Weijia Song +Copyright (C) 2007, Sebastian Pipping +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 the 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. + +-------------------------------------------------------------------------------- + +The files under dev/tasks/conda-recipes have the following license + +BSD 3-clause license +Copyright (c) 2015-2018, conda-forge +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 files in cpp/src/arrow/vendored/utfcpp/ have the following license + +Copyright 2006-2018 Nemanja Trifunovic + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +This project includes code from Apache Kudu. + + * cpp/cmake_modules/CompilerInfo.cmake is based on Kudu's cmake_modules/CompilerInfo.cmake + +Copyright: 2016 The Apache Software Foundation. +Home page: https://kudu.apache.org/ +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Apache Impala (incubating), formerly +Impala. The Impala code and rights were donated to the ASF as part of the +Incubator process after the initial code imports into Apache Parquet. + +Copyright: 2012 Cloudera, Inc. +Copyright: 2016 The Apache Software Foundation. +Home page: http://impala.apache.org/ +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Apache Aurora. + +* dev/release/{release,changelog,release-candidate} are based on the scripts from + Apache Aurora + +Copyright: 2016 The Apache Software Foundation. +Home page: https://aurora.apache.org/ +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Snappy. + +* cpp/cmake_modules/{SnappyCMakeLists.txt,SnappyConfig.h} are based on code + from Google's Snappy project. + +Copyright: 2009 Google Inc. All rights reserved. +Homepage: https://github.com/google/snappy +License: 3-clause BSD + +-------------------------------------------------------------------------------- + +This project includes code from the manylinux project. + +* python/manylinux1/scripts/{build_python.sh,python-tag-abi-tag.py, + requirements.txt} are based on code from the manylinux project. + +Copyright: 2016 manylinux +Homepage: https://github.com/pypa/manylinux +License: The MIT License (MIT) + +-------------------------------------------------------------------------------- + +This project includes code from the cymove project: + +* python/pyarrow/includes/common.pxd includes code from the cymove project + +The MIT License (MIT) +Copyright (c) 2019 Omer Ozarslan + +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 projects includes code from the Ursabot project under the dev/archery +directory. + +License: BSD 2-Clause + +Copyright 2019 RStudio, Inc. + +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. + +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. + +-------------------------------------------------------------------------------- + +This project include code from mingw-w64. + +* cpp/src/arrow/util/cpu-info.cc has a polyfill for mingw-w64 < 5 + +Copyright (c) 2009 - 2013 by the mingw-w64 project +Homepage: https://mingw-w64.org +License: Zope Public License (ZPL) Version 2.1. + +--------------------------------------------------------------------------------- + +This project include code from Google's Asylo project. + +* cpp/src/arrow/result.h is based on status_or.h + +Copyright (c) Copyright 2017 Asylo authors +Homepage: https://asylo.dev/ +License: Apache 2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Google's protobuf project + +* cpp/src/arrow/result.h ARROW_ASSIGN_OR_RAISE is based off ASSIGN_OR_RETURN +* cpp/src/arrow/util/bit_stream_utils.h contains code from wire_format_lite.h + +Copyright 2008 Google Inc. All rights reserved. +Homepage: https://developers.google.com/protocol-buffers/ +License: + +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. + +-------------------------------------------------------------------------------- + +3rdparty dependency LLVM is statically linked in certain binary distributions. +Additionally some sections of source code have been derived from sources in LLVM +and have been clearly labeled as such. LLVM has the following license: + +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +-------------------------------------------------------------------------------- + +3rdparty dependency gRPC is statically linked in certain binary +distributions, like the python wheels. gRPC has the following license: + +Copyright 2014 gRPC authors. + +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. + +-------------------------------------------------------------------------------- + +3rdparty dependency Apache Thrift is statically linked in certain binary +distributions, like the python wheels. Apache Thrift has the following license: + +Apache Thrift +Copyright (C) 2006 - 2019, The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +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. + +-------------------------------------------------------------------------------- + +3rdparty dependency Apache ORC is statically linked in certain binary +distributions, like the python wheels. Apache ORC has the following license: + +Apache ORC +Copyright 2013-2019 The Apache Software Foundation + +This product includes software developed by The Apache Software +Foundation (http://www.apache.org/). + +This product includes software developed by Hewlett-Packard: +(c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P + +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. + +-------------------------------------------------------------------------------- + +3rdparty dependency zstd is statically linked in certain binary +distributions, like the python wheels. ZSTD has the following 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency lz4 is statically linked in certain binary +distributions, like the python wheels. lz4 has the following license: + +LZ4 Library +Copyright (c) 2011-2016, Yann Collet +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. + +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. + +-------------------------------------------------------------------------------- + +3rdparty dependency Brotli is statically linked in certain binary +distributions, like the python wheels. Brotli has the following license: + +Copyright (c) 2009, 2010, 2013-2016 by the Brotli 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency rapidjson is statically linked in certain binary +distributions, like the python wheels. rapidjson and its dependencies have the +following licenses: + +Tencent is pleased to support the open source community by making RapidJSON +available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +All rights reserved. + +If you have downloaded a copy of the RapidJSON binary from Tencent, please note +that the RapidJSON binary is licensed under the MIT License. +If you have downloaded a copy of the RapidJSON source code from Tencent, please +note that RapidJSON source code is licensed under the MIT License, except for +the third-party components listed below which are subject to different license +terms. Your integration of RapidJSON into your own projects may require +compliance with the MIT License, as well as the other licenses applicable to +the third-party components included within RapidJSON. To avoid the problematic +JSON license in your own projects, it's sufficient to exclude the +bin/jsonchecker/ directory, as it's the only code under the JSON license. +A copy of the MIT License is included in this file. + +Other dependencies and licenses: + + Open Source Software Licensed Under the BSD License: + -------------------------------------------------------------------- + + The msinttypes r29 + Copyright (c) 2006-2013 Alexander Chemeris + 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 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 REGENTS 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 REGENTS AND 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. + + Terms of 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency snappy is statically linked in certain binary +distributions, like the python wheels. snappy has the following license: + +Copyright 2011, 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. + +=== + +Some of the benchmark data in testdata/ is licensed differently: + + - fireworks.jpeg is Copyright 2013 Steinar H. Gunderson, and + is licensed under the Creative Commons Attribution 3.0 license + (CC-BY-3.0). See https://creativecommons.org/licenses/by/3.0/ + for more information. + + - kppkn.gtb is taken from the Gaviota chess tablebase set, and + is licensed under the MIT License. See + https://sites.google.com/site/gaviotachessengine/Home/endgame-tablebases-1 + for more information. + + - paper-100k.pdf is an excerpt (bytes 92160 to 194560) from the paper + “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA + Replication Timing in _Drosophila_” by Federico Comoglio and Renato Paro, + which is licensed under the CC-BY license. See + http://www.ploscompbiol.org/static/license for more ifnormation. + + - alice29.txt, asyoulik.txt, plrabn12.txt and lcet10.txt are from Project + Gutenberg. The first three have expired copyrights and are in the public + domain; the latter does not have expired copyright, but is still in the + public domain according to the license information + (http://www.gutenberg.org/ebooks/53). + +-------------------------------------------------------------------------------- + +3rdparty dependency gflags is statically linked in certain binary +distributions, like the python wheels. gflags has the following license: + +Copyright (c) 2006, 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency glog is statically linked in certain binary +distributions, like the python wheels. glog has the following license: + +Copyright (c) 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. + + +A function gettimeofday in utilities.cc is based on + +http://www.google.com/codesearch/p?hl=en#dR3YEbitojA/COPYING&q=GetSystemTimeAsFileTime%20license:bsd + +The license of this code is: + +Copyright (c) 2003-2008, Jouni Malinen and contributors +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(s) of the above-listed copyright holder(s) 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency re2 is statically linked in certain binary +distributions, like the python wheels. re2 has the following license: + +Copyright (c) 2009 The RE2 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency c-ares is statically linked in certain binary +distributions, like the python wheels. c-ares has the following license: + +# c-ares license + +Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS +file. + +Copyright 1998 by the Massachusetts Institute of Technology. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided that +the above copyright notice appear in all copies and that both that copyright +notice and this permission notice appear in supporting documentation, and that +the name of M.I.T. not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +M.I.T. makes no representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. + +-------------------------------------------------------------------------------- + +3rdparty dependency zlib is redistributed as a dynamically linked shared +library in certain binary distributions, like the python wheels. In the future +this will likely change to static linkage. zlib has the following license: + +zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.11, January 15th, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +-------------------------------------------------------------------------------- + +3rdparty dependency openssl is redistributed as a dynamically linked shared +library in certain binary distributions, like the python wheels. openssl +preceding version 3 has the following license: + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. 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. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * 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 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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 licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +-------------------------------------------------------------------------------- + +This project includes code from the rtools-backports project. + +* ci/scripts/PKGBUILD and ci/scripts/r_windows_build.sh are based on code + from the rtools-backports project. + +Copyright: Copyright (c) 2013 - 2019, Алексей and Jeroen Ooms. +All rights reserved. +Homepage: https://github.com/r-windows/rtools-backports +License: 3-clause BSD + +-------------------------------------------------------------------------------- + +Some code from pandas has been adapted for the pyarrow codebase. pandas is +available under the 3-clause BSD license, which follows: + +pandas license +============== + +Copyright (c) 2011-2012, Lambda Foundry, Inc. and PyData Development Team +All rights reserved. + +Copyright (c) 2008-2011 AQR Capital Management, LLC +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 the copyright holder nor the names of any + 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 HOLDER 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. + +-------------------------------------------------------------------------------- + +Some bits from DyND, in particular aspects of the build system, have been +adapted from libdynd and dynd-python under the terms of the BSD 2-clause +license + +The BSD 2-Clause License + + Copyright (C) 2011-12, Dynamic NDArray Developers + 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. + + 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. + +Dynamic NDArray Developers list: + + * Mark Wiebe + * Continuum Analytics + +-------------------------------------------------------------------------------- + +Some source code from Ibis (https://github.com/cloudera/ibis) has been adapted +for PyArrow. Ibis is released under the Apache License, Version 2.0. + +-------------------------------------------------------------------------------- + +dev/tasks/homebrew-formulae/apache-arrow.rb has the following license: + +BSD 2-Clause License + +Copyright (c) 2009-present, Homebrew contributors +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. + +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. + +---------------------------------------------------------------------- + +cpp/src/arrow/vendored/base64.cpp has the following license + +ZLIB License + +Copyright (C) 2004-2017 René Nyffenegger + +This source code is provided 'as-is', without any express or implied +warranty. In no event will the author 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 source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + 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 source code. + +3. This notice may not be removed or altered from any source distribution. + +René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +-------------------------------------------------------------------------------- + +This project includes code from Folly. + + * cpp/src/arrow/vendored/ProducerConsumerQueue.h + +is based on Folly's + + * folly/Portability.h + * folly/lang/Align.h + * folly/ProducerConsumerQueue.h + +Copyright: Copyright (c) Facebook, Inc. and its affiliates. +Home page: https://github.com/facebook/folly +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +The file cpp/src/arrow/vendored/musl/strptime.c has the following license + +Copyright © 2005-2020 Rich Felker, et al. + +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 file cpp/cmake_modules/BuildUtils.cmake contains code from + +https://gist.github.com/cristianadam/ef920342939a89fae3e8a85ca9459b49 + +which is made available under the MIT license + +Copyright (c) 2019 Cristian Adam + +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 files in cpp/src/arrow/vendored/portable-snippets/ contain code from + +https://github.com/nemequ/portable-snippets + +and have the following copyright notice: + +Each source file contains a preamble explaining the license situation +for that file, which takes priority over this file. With the +exception of some code pulled in from other repositories (such as +µnit, an MIT-licensed project which is used for testing), the code is +public domain, released using the CC0 1.0 Universal dedication (*). + +(*) https://creativecommons.org/publicdomain/zero/1.0/legalcode + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/fast_float/ contain code from + +https://github.com/lemire/fast_float + +which is made available under the Apache License 2.0. + +-------------------------------------------------------------------------------- + +The file python/pyarrow/vendored/docscrape.py contains code from + +https://github.com/numpy/numpydoc/ + +which is made available under the BSD 2-clause license. + +-------------------------------------------------------------------------------- + +The file python/pyarrow/vendored/version.py contains code from + +https://github.com/pypa/packaging/ + +which is made available under both the Apache license v2.0 and the +BSD 2-clause license. + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/pcg contain code from + +https://github.com/imneme/pcg-cpp + +and have the following copyright notice: + +Copyright 2014-2019 Melissa O'Neill , + and the PCG Project contributors. + +SPDX-License-Identifier: (Apache-2.0 OR MIT) + +Licensed under the Apache License, Version 2.0 (provided in +LICENSE-APACHE.txt and at http://www.apache.org/licenses/LICENSE-2.0) +or under the MIT license (provided in LICENSE-MIT.txt and at +http://opensource.org/licenses/MIT), at your option. This file may not +be copied, modified, or distributed except according to those terms. + +Distributed on an "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, either +express or implied. See your chosen license for details. + +-------------------------------------------------------------------------------- +r/R/dplyr-count-tally.R (some portions) + +Some portions of this file are derived from code from + +https://github.com/tidyverse/dplyr/ + +which is made available under the MIT license + +Copyright (c) 2013-2019 RStudio and others. + +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 file src/arrow/util/io_util.cc contains code from the CPython project +which is made available under the Python Software Foundation License Version 2. + +-------------------------------------------------------------------------------- + +3rdparty dependency opentelemetry-cpp is statically linked in certain binary +distributions. opentelemetry-cpp is made available under the Apache License 2.0. + +Copyright The OpenTelemetry Authors +SPDX-License-Identifier: OpenMDW-1.1 + +-------------------------------------------------------------------------------- + +ci/conan/ is based on code from Conan Package and Dependency Manager. + +Copyright (c) 2019 Conan.io + +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. + +-------------------------------------------------------------------------------- + +3rdparty dependency UCX is redistributed as a dynamically linked shared +library in certain binary distributions. UCX has the following license: + +Copyright (c) 2014-2015 UT-Battelle, LLC. All rights reserved. +Copyright (C) 2014-2020 Mellanox Technologies Ltd. All rights reserved. +Copyright (C) 2014-2015 The University of Houston System. All rights reserved. +Copyright (C) 2015 The University of Tennessee and The University + of Tennessee Research Foundation. All rights reserved. +Copyright (C) 2016-2020 ARM Ltd. All rights reserved. +Copyright (c) 2016 Los Alamos National Security, LLC. All rights reserved. +Copyright (C) 2016-2020 Advanced Micro Devices, Inc. All rights reserved. +Copyright (C) 2019 UChicago Argonne, LLC. All rights reserved. +Copyright (c) 2018-2020 NVIDIA CORPORATION. All rights reserved. +Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. +Copyright (C) 2016-2020 Stony Brook University. 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 file dev/tasks/r/github.packages.yml contains code from + +https://github.com/ursa-labs/arrow-r-nightly + +which is made available under the Apache License 2.0. + +-------------------------------------------------------------------------------- +.github/actions/sync-nightlies/action.yml (some portions) + +Some portions of this file are derived from code from + +https://github.com/JoshPiper/rsync-docker + +which is made available under the MIT license + +Copyright (c) 2020 Joshua Piper + +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. + +-------------------------------------------------------------------------------- +.github/actions/sync-nightlies/action.yml (some portions) + +Some portions of this file are derived from code from + +https://github.com/burnett01/rsync-deployments + +which is made available under the MIT license + +Copyright (c) 2019-2022 Contention +Copyright (c) 2019-2022 Burnett01 + +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. + +-------------------------------------------------------------------------------- +java/vector/src/main/java/org/apache/arrow/vector/util/IntObjectHashMap.java +java/vector/src/main/java/org/apache/arrow/vector/util/IntObjectMap.java + +These files are derived from code from Netty, which is made available under the +Apache License 2.0. + +-------------------------------------------------------------------------------- +cpp/src/arrow/util/math_internal.cc (some portions) + +Some portions of this file are derived from + +https://github.com/ankane/dist-rust/ + +which is made available under the MIT license + +The MIT License (MIT) + +Copyright (c) 2021-2023 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 files cpp/src/arrow/vendored/whereami/whereami.h, +cpp/src/arrow/vendored/whereami/whereami.cc are adapted from +Grégory Pakosz's whereami library (https://github.com/gpakosz/whereami) +It is dual licensed under both the WTFPLv2 and MIT licenses. + +The WTFPLv2 License + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + 1. Bla bla bla + 2. Montesqieu et camembert, vive la France, zut alors! + +The MIT License (MIT) +Copyright Gregory Pakosz + +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. + + +pyasn1 +BSD-2-Clause +https://github.com/pyasn1/pyasn1 +Copyright (c) 2005-2020, Ilya Etingof +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. + +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. + + +pyasn1_modules +BSD License +https://github.com/pyasn1/pyasn1-modules +Copyright (c) 2005-2020, Ilya Etingof +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. + +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. + + +pycocotools +FreeBSD +https://github.com/ppwwyyxx/cocoapi +UNKNOWN + +pycparser +BSD-3-Clause +https://github.com/eliben/pycparser +pycparser -- A C parser in Python + +Copyright (c) 2008-2022, Eli Bendersky +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 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. + + +pycryptodomex +BSD License; Public Domain +https://www.pycryptodome.org +The source code in PyCryptodome is partially in the public domain +and partially released under the BSD 2-Clause license. + +In either case, there are minimal if no restrictions on the redistribution, +modification and usage of the software. + +Public domain +============= + +All code originating from PyCrypto is free and unencumbered software +released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to + +BSD license +=========== + +All direct contributions to PyCryptodome are released under the following +license. The copyright of each piece belongs to the respective author. + +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. + +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. + + +pydantic +MIT +https://github.com/pydantic/pydantic +The MIT License (MIT) + +Copyright (c) 2017 to present Pydantic Services Inc. and individual 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. + + +pydantic_core +MIT +https://github.com/pydantic/pydantic-core +The MIT License (MIT) + +Copyright (c) 2022 Samuel Colvin + +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. + + +pydub +MIT License +http://pydub.com +Copyright (c) 2011 James Robert, http://jiaaro.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. + +pygltflib +MIT License +https://gitlab.com/dodgyville/pygltflib +Copyright (c) 2018 Luke Miller + +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. + + +pyinstrument +BSD License +https://github.com/joerick/pyinstrument +Copyright (c) 2014-2020, Joe Rickerby and contributors +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. + + +pynput +GNU Lesser General Public License v3 (LGPLv3) +https://github.com/moses-palmer/pynput + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007-2024 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + +pyparsing +MIT +https://github.com/pyparsing/pyparsing/ +Copyright (c) 2003-2025 Paul McGuire + +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. + + +pyproject_hooks +MIT License +https://github.com/pypa/pyproject-hooks +The MIT License (MIT) + +Copyright (c) 2017 Thomas Kluyver + +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. + + +pyrefly +UNKNOWN +https://pyrefly.org +UNKNOWN + +pyserial +BSD License +https://github.com/pyserial/pyserial +UNKNOWN + +pytest +MIT +https://docs.pytest.org/en/latest/ +The MIT License (MIT) + +Copyright (c) 2004 Holger Krekel and others + +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. + + +pytest-cov +MIT +https://pytest-cov.readthedocs.io/en/latest/changelog.html +The MIT License + +Copyright (c) 2010 Meme Dough + +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. + + +pytest-custom-exit-code +MIT License +https://github.com/yashtodi94/pytest-custom_exit_code + +The MIT License (MIT) + +Copyright (c) 2019 Yash Todi + +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. + + +pytest-datadir +MIT License +http://github.com/gabrielcnr/pytest-datadir +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright (c) 2015-2022 the pytest-datadir authors and 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. + + +pytest-env +MIT License +https://github.com/pytest-dev/pytest-env +MIT License + +Copyright (c) 2010-202x The pytest-env developers + +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. + + +pytest-instafail +BSD License +https://github.com/pytest-dev/pytest-instafail +Copyright (c) 2013-2016, Janne Vanhala + +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. + +* The names of the contributors may not 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 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. + + +pytest-regressions +MIT License +https://github.com/ESSS/pytest-regressions + +The MIT License (MIT) + +Copyright (c) 2018 ESSS + +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. + + +pytest-xdist +MIT +https://github.com/pytest-dev/pytest-xdist +MIT License + +Copyright (c) 2010 Holger Krekel and 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. + + +python-dateutil +Apache Software License; BSD License +https://github.com/dateutil/dateutil +Copyright 2017- Paul Ganssle +Copyright 2017- dateutil contributors (see 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 above license applies to all contributions after 2017-12-01, as well as +all contributions that have been re-licensed (see AUTHORS file for the list of +contributors who have re-licensed their code). +-------------------------------------------------------------------------------- +dateutil - Extensions to the standard Python datetime module. + +Copyright (c) 2003-2011 - Gustavo Niemeyer +Copyright (c) 2012-2014 - Tomi Pieviläinen +Copyright (c) 2014-2016 - Yaron de Leeuw +Copyright (c) 2015- - Paul Ganssle +Copyright (c) 2015- - dateutil contributors (see AUTHORS file) + +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 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 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. + +The above BSD License Applies to all code, even that also covered by Apache 2.0. + +python-discovery +MIT License +https://github.com/tox-dev/python-discovery +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. + + +python-dotenv +BSD-3-Clause +https://github.com/theskumar/python-dotenv +Copyright (c) 2014, Saurabh Kumar (python-dotenv), 2013, Ted Tieken (django-dotenv-rw), 2013, Jacob Kaplan-Moss (django-dotenv) + +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 django-dotenv 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. + + +python-json-logger +BSD License +https://nhairs.github.io/python-json-logger +Copyright (c) 2011, Zakaria Zajac and the python-json-logger Contributors +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. + +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. + + +python-memcached +Python Software Foundation License +https://github.com/linsomniac/python-memcached +UNKNOWN + +python-multipart +Apache-2.0 +https://github.com/Kludex/python-multipart +Copyright 2012, Andrew Dunham + +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 + + https://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. + + + +python-xlib +GNU Lesser General Public License v2 or later (LGPLv2+) +https://github.com/python-xlib/python-xlib + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + +pytorch-lightning +Apache Software License +https://github.com/Lightning-AI/lightning + 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 2018-2021 William Falcon + + 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. + + +pytorch-ranger +MIT License +https://github.com/mpariente/Ranger-Deep-Learning-Optimizer + 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. + + +pytz +MIT License +http://pythonhosted.org/pytz +Copyright (c) 2003-2019 Stuart Bishop + +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. + + +pyzmq +BSD License +https://pyzmq.readthedocs.org +BSD 3-Clause License + +Copyright (c) 2009-2012, Brian Granger, Min Ragan-Kelley + +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. + + +qwen-vl-utils +Apache Software License +https://github.com/QwenLM/Qwen2-VL/tree/main/qwen-vl-utils +UNKNOWN + +ray +Apache 2.0 +https://github.com/ray-project/ray +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. + + +referencing +MIT +https://github.com/python-jsonschema/referencing +Copyright (c) 2022 Julian Berman + +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. + + +regex +Apache-2.0 AND CNRI-Python +https://github.com/mrabarnett/mrab-regex +This work was derived from the 're' module of CPython 2.6 and CPython 3.1, +copyright (c) 1998-2001 by Secret Labs AB and licensed under CNRI's Python 1.6 +license. + +All additions and alterations are licensed under 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. + + Copyright 2020 Matthew Barnett + + 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. + + +requests +Apache Software License +https://requests.readthedocs.io + + 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. + + +retinaface-py +MIT License +https://github.com/andresprados/Pytorch_Retinaface +MIT License + +Copyright (c) 2019 + +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. + + +rfc3339-validator +MIT License +https://github.com/naimetti/rfc3339-validator +MIT License + +Copyright (c) 2019, Nicolas Aimetti + +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. + + + +rfc3986-validator +MIT License +https://github.com/naimetti/rfc3986-validator +MIT License + +Copyright (c) 2019, Nicolas Aimetti + +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. + + + +rfc3987-syntax +MIT +https://github.com/willynilly/rfc3987-syntax +MIT License + +Copyright (c) 2025 Will Riley + +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. + + +rich +MIT License +https://github.com/Textualize/rich +Copyright (c) 2020 Will McGugan + +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. + + +robotmq +MIT License +https://github.com/yihuai-gao/robot-message-queue +MIT License + +Copyright (c) 2024 Yihuai Gao + +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. + + +rpds-py +MIT +https://github.com/crate-py/rpds +Copyright (c) 2023 Julian Berman + +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. + + +rsa +Apache Software License +https://stuvel.eu/rsa +Copyright 2011 Sybren A. Stüvel + +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 + + https://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. + + +ruff +MIT License +https://docs.astral.sh/ruff +MIT License + +Copyright (c) 2022 Charles Marsh + +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. + +end of terms and conditions + +The externally maintained libraries from which parts of the Software is derived +are: + +- flake8-comprehensions, licensed as follows: + """ + MIT License + + Copyright (c) 2017 Adam Johnson + + 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. + """ + +- flake8-no-pep420, licensed as follows: + """ + MIT License + + Copyright (c) 2020 Adam Johnson + + 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. + """ + +- flake8-tidy-imports, licensed as follows: + """ + MIT License + + Copyright (c) 2017 Adam Johnson + + 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. + """ + +- flake8-return, licensed as follows: + """ + MIT License + + Copyright (c) 2019 Afonasev Evgeniy + + 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. + """ + +- flake8-2020, licensed as follows: + """ + Copyright (c) 2019 Anthony Sottile + + 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. + """ + +- pyupgrade, licensed as follows: + """ + Copyright (c) 2017 Anthony Sottile + + 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. + """ + +- flake8-blind-except, licensed as follows: + """ + The MIT License (MIT) + + Copyright (c) 2014 Elijah Andrews + + 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. + """ + +- flake8-gettext, licensed as follows: + """ + BSD Zero Clause License + + Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. + + 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. + """ + +- flake8-implicit-str-concat, licensed as follows: + """ + The MIT License (MIT) + + Copyright (c) 2019 Dylan Turner + + 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. + """ + +- flake8-debugger, licensed as follows: + """ + MIT License + + Copyright (c) 2016 Joseph Kahn + + 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. + """ + +- flake8-pyi, licensed as follows: + """ + The MIT License (MIT) + + Copyright (c) 2016 Łukasz Langa + + 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. + """ + +- flake8-print, licensed as follows: + """ + MIT License + + Copyright (c) 2016 Joseph Kahn + + 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. + """ + +- flake8-import-conventions, licensed as follows: + """ + MIT License + + Copyright (c) 2021 João Palmeiro + + 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. + """ + +- flake8-simplify, licensed as follows: + """ + MIT License + + Copyright (c) 2020 Martin Thoma + + 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. + """ + +- flake8-slots, licensed as follows: + """ + Copyright (c) 2021 Dominic Davis-Foster + + 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. + """ + +- flake8-todos, licensed as follows: + """ + Copyright (c) 2019 EclecticIQ. All rights reserved. + Copyright (c) 2020 Gram . 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. + """ + +- flake8-unused-arguments, licensed as follows: + """ + MIT License + + Copyright (c) 2019 Nathan Hoad + + 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. + """ + +- pygrep-hooks, licensed as follows: + """ + Copyright (c) 2018 Anthony Sottile + + 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. + """ + +- autoflake, licensed as follows: + """ + Copyright (C) 2012-2018 Steven Myint + + 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. + """ + +- autotyping, licensed as follows: + """ + MIT License + + Copyright (c) 2023 Jelle Zijlstra + + 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. + """ + +- Flake8, licensed as follows: + """ + == Flake8 License (MIT) == + + Copyright (C) 2011-2013 Tarek Ziade + Copyright (C) 2012-2016 Ian Cordasco + + 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. + """ + +- flake8-bugbear, licensed as follows: + """ + The MIT License (MIT) + + Copyright (c) 2016 Łukasz Langa + + 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. + """ + +- flake8-commas, licensed as follows: + """ + The MIT License (MIT) + + Copyright (c) 2017 Thomas Grainger. + + 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. + + + Portions of this flake8-commas Software may utilize the following + copyrighted material, the use of which is hereby acknowledged. + + Original flake8-commas: https://github.com/trevorcreech/flake8-commas/commit/e8563b71b1d5442e102c8734c11cb5202284293d + + 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. + """ + +- flynt, licensed as follows: + """ + MIT License + + Copyright (c) 2019-2022 Ilya Kamenshchikov + + 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. + """ + +- isort, licensed as follows: + """ + The MIT License (MIT) + + Copyright (c) 2013 Timothy Edmund Crosley + + 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. + """ + +- pep8-naming, licensed as follows: + """ + Copyright © 2013 Florent Xicluna + + Licensed under the terms of the Expat 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. + """ + +- pycodestyle, licensed as follows: + """ + Copyright © 2006-2009 Johann C. Rocholl + Copyright © 2009-2014 Florent Xicluna + Copyright © 2014-2020 Ian Lee + + Licensed under the terms of the Expat 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. + """ + +- pydocstyle, licensed as follows: + """ + Copyright (c) 2012 GreenSteam, + + Copyright (c) 2014-2020 Amir Rachum, + + Copyright (c) 2020 Sambhav Kothari, + + 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. + """ + +- Pyflakes, licensed as follows: + """ + Copyright 2005-2011 Divmod, Inc. + Copyright 2013-2014 Florent Xicluna + + 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. + """ + +- flake8-use-pathlib, licensed as follows: + """ + MIT License + + Copyright (c) 2021 Rodolphe Pelloux-Prayer + + 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. + """ + +- RustPython, licensed as follows: + """ + MIT License + + Copyright (c) 2020 RustPython Team + + 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. + """ + +- flake8-annotations, licensed as follows: + """ + MIT License + + Copyright (c) 2019 - Present S. Co1 + + 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. + """ + +- flake8-async, licensed as follows: + """ + MIT License + + Copyright (c) 2022 Cooper Lees + + 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. + """ + +- flake8-type-checking, licensed as follows: + """ + Copyright (c) 2021, Sondre Lillebø Gundersen + 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 pytest-{{ cookiecutter.plugin_name }} 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. + """ + +- flake8-bandit, licensed as follows: + """ + Copyright (c) 2017 Tyler Wince + + 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. + """ + +- flake8-eradicate, licensed as follows: + """ + MIT License + + Copyright (c) 2018 Nikita Sobolev + + 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. + """ + +- flake8-quotes, licensed as follows: + """ + 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. + """ + +- flake8-logging-format, licensed as follows: + """ + 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. + """ + +- flake8-raise, licensed as follows: + """ + MIT License + + Copyright (c) 2020 Jon Dufresne + + 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. + """ + +- flake8-self, licensed as follows: + """ + MIT License + + Copyright (c) 2023 Korijn van Golen + + 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. + """ + +- flake8-django, licensed under the GPL license. + +- perflint, licensed as follows: + """ + MIT License + + Copyright (c) 2022 Anthony Shaw + + 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. + """ + +- flake8-logging, licensed as follows: + """ + MIT License + + Copyright (c) 2023 Adam Johnson + + 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. + """ + +- flake8-trio, licensed as follows: + """ + MIT License + + Copyright (c) 2022 Zac Hatfield-Dodds + + 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. + """ + +- Pyright, licensed as follows: + """ + MIT License + + Pyright - A static type checker for the Python language + Copyright (c) Microsoft Corporation. All rights reserved. + + 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 + """ + +- rust-analyzer/text-size, licensed 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. + """ + +- rome/tools, licensed under the MIT license: + """ + MIT License + + Copyright (c) Rome Tools, Inc. and its affiliates. + + 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. + """ + +- pydoclint, licensed as follows: + """ + MIT License + + Copyright (c) 2023 jsh9 + + 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. + """ + + +s3fs +BSD License +http://github.com/fsspec/s3fs/ +Copyright (c) 2016, Continuum Analytics, Inc. and contributors +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 Continuum Analytics nor the names of any 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. + + +s3transfer +Apache Software License +https://github.com/boto/s3transfer + + 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. + + +safehttpx +MIT License +https://github.com/gradio-app/safehttpx + 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. + + +safetensors +Apache Software License +https://github.com/huggingface/safetensors + 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. + + +scikit-image +BSD License +https://scikit-image.org +Files: * +Copyright: 2009-2022 the scikit-image team +License: BSD-3-Clause + +Files: doc/source/themes/scikit-image/layout.html +Copyright: 2007-2010 the Sphinx team +License: BSD-3-Clause + +Files: skimage/feature/_canny.py + skimage/filters/edges.py + skimage/filters/_rank_order.py + skimage/morphology/_skeletonize.py + skimage/morphology/tests/test_watershed.py + skimage/morphology/watershed.py + skimage/segmentation/heap_general.pxi + skimage/segmentation/heap_watershed.pxi + skimage/segmentation/_watershed.py + skimage/segmentation/_watershed_cy.pyx +Copyright: 2003-2009 Massachusetts Institute of Technology + 2009-2011 Broad Institute + 2003 Lee Kamentsky + 2003-2005 Peter J. Verveer +License: BSD-3-Clause + +Files: skimage/filters/thresholding.py + skimage/graph/_mcp.pyx + skimage/graph/heap.pyx +Copyright: 2009-2015 Board of Regents of the University of + Wisconsin-Madison, Broad Institute of MIT and Harvard, + and Max Planck Institute of Molecular Cell Biology and + Genetics + 2009 Zachary Pincus + 2009 Almar Klein +License: BSD-2-Clause + +File: skimage/morphology/grayreconstruct.py + skimage/morphology/tests/test_reconstruction.py +Copyright: 2003-2009 Massachusetts Institute of Technology + 2009-2011 Broad Institute + 2003 Lee Kamentsky +License: BSD-3-Clause + +File: skimage/morphology/_grayreconstruct.pyx +Copyright: 2003-2009 Massachusetts Institute of Technology + 2009-2011 Broad Institute + 2003 Lee Kamentsky + 2022 Gregory Lee (added a 64-bit integer variant for large images) +License: BSD-3-Clause + +File: skimage/segmentation/_expand_labels.py +Copyright: 2020 Broad Institute + 2020 CellProfiler team +License: BSD-3-Clause + +File: skimage/exposure/_adapthist.py +Copyright: 1994 Karel Zuiderveld +License: BSD-3-Clause + +Function: skimage/morphology/_skeletonize_various_cy.pyx:_skeletonize_loop +Copyright: 2003-2009 Massachusetts Institute of Technology + 2009-2011 Broad Institute + 2003 Lee Kamentsky +License: BSD-3-Clause + +Function: skimage/_shared/version_requirements.py:_check_version +Copyright: 2013 The IPython Development Team +License: BSD-3-Clause + +Function: skimage/_shared/version_requirements.py:is_installed +Copyright: 2009-2011 Pierre Raybaut +License: MIT + +File: skimage/feature/_fisher_vector.py +Copyright: 2014 2014 Dan Oneata +License: MIT + +File: skimage/_vendored/numpy_lookfor.py +Copyright: 2005-2023, NumPy Developers +License: BSD-3-Clause + +File: skimage/transform/_thin_plate_splines.py +Copyright: 2007 Zachary Pincus +License: BSD-3-Clause + +License: BSD-2-Clause + +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. +. +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 HOLDERS 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: BSD-3-Clause + +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 University 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 HOLDERS 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: 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. + + +scipy +BSD License +https://scipy.org/ +Copyright (c) 2001-2002 Enthought, Inc. 2003, SciPy Developers. +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 +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. + +---- + +This binary distribution of SciPy can also bundle the following software +(depending on the build): + + +Name: OpenBLAS +Files: scipy.libs/libscipy_openblas*.so +Description: bundled as a dynamically linked library +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause + Copyright (c) 2011-2014, The OpenBLAS Project + 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 OpenBLAS project 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. + + +Name: LAPACK +Files: scipy.libs/libscipy_openblas*.so +Description: bundled in OpenBLAS +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause-Open-MPI + Copyright (c) 1992-2013 The University of Tennessee and The University + of Tennessee Research Foundation. All rights + reserved. + Copyright (c) 2000-2013 The University of California Berkeley. All + rights reserved. + Copyright (c) 2006-2013 The University of Colorado Denver. All rights + reserved. + + $COPYRIGHT$ + + Additional copyrights may follow + + $HEADER$ + + 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 listed + in this license in the documentation and/or other materials + provided with the distribution. + + - Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + The copyright holders provide no reassurances that the source code + provided does not infringe any patent, copyright, or any other + intellectual property rights of third parties. The copyright holders + disclaim any liability to any recipient for claims brought against + recipient by any third party for infringement of that parties + intellectual property rights. + + 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. + + +Name: GCC runtime library +Files: scipy.libs/libgfortran*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libgfortran +License: GPL-3.0-or-later WITH GCC-exception-3.1 + Copyright (C) 2002-2017 Free Software Foundation, Inc. + + Libgfortran is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Libgfortran is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . + +---- + +Full text of license texts referred to above follows (that they are +listed below does not necessarily imply the conditions apply to the +present binary release): + +---- + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + +---- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +Name: libquadmath +Files: scipy.libs/libquadmath*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath +License: LGPL-2.1-or-later + + GCC Quad-Precision Math Library + Copyright (C) 2010-2019 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + + This file is part of the libquadmath library. + Libquadmath is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + Libquadmath is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +semantic-version +BSD License +https://github.com/rbarrois/python-semanticversion +Copyright (c) The python-semanticversion project +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. + +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. + + +semver +BSD License +https://python-semver.readthedocs.io/en/latest/changelog.html +Copyright (c) 2013, Konstantine Rybnikov +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 the python-semver org 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. + + +sentencepiece +UNKNOWN +https://github.com/google/sentencepiece +UNKNOWN + +sentry-sdk +BSD License +https://github.com/getsentry/sentry-python +MIT License + +Copyright (c) 2018 Functional Software, Inc. dba Sentry + +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. + + +shellingham +ISC License (ISCL) +https://github.com/sarugaku/shellingham +Copyright (c) 2018, Tzu-ping Chung + +Permission to use, copy, modify, and 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. + + +six +MIT License +https://github.com/benjaminp/six +Copyright (c) 2010-2024 Benjamin Peterson + +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. + + +slangtorch +MIT License +https://github.com/shader-slang/slang +SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + 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. + +LLVM Exceptions to the Apache 2.0 License + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + +smart_open +MIT License +https://github.com/piskvorky/smart_open +The MIT License (MIT) + +Copyright (c) 2015 Radim Řehůřek + +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. + + + +smmap +BSD License +https://github.com/gitpython-developers/smmap +Copyright (C) 2010, 2011 Sebastian Thiel and contributors +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 the async project 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. + + + +sniffio +Apache Software License; MIT License +https://github.com/python-trio/sniffio +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are +made under the terms of *both* these licenses. + + +soundfile +BSD License +https://github.com/bastibe/python-soundfile + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + +soupsieve +MIT +https://github.com/facelessuser/soupsieve +MIT License + +Copyright (c) 2018 - 2026 Isaac Muse + +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. + + +stack-data +MIT License +http://github.com/alexmojaki/stack_data +MIT License + +Copyright (c) 2019 Alex Hall + +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. + + +starlette +BSD-3-Clause +https://github.com/Kludex/starlette +Copyright © 2018, [Encode OSS Ltd](https://www.encode.io/). +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 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. + + +sympy +BSD License +https://sympy.org +Copyright (c) 2006-2023 SymPy Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b. 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. + c. Neither the name of SymPy 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 REGENTS 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. + +-------------------------------------------------------------------------------- + +Patches that were taken from the Diofant project (https://github.com/diofant/diofant) +are licensed as: + +Copyright (c) 2006-2018 SymPy Development Team, + 2013-2023 Sergey B Kirpichev + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b. 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. + c. Neither the name of Diofant or SymPy 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 REGENTS 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. + +-------------------------------------------------------------------------------- + +Submodules taken from the multipledispatch project (https://github.com/mrocklin/multipledispatch) +are licensed as: + +Copyright (c) 2014 Matthew Rocklin + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b. 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. + c. Neither the name of multipledispatch 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 REGENTS 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 files under the directory sympy/parsing/autolev/tests/pydy-example-repo +are directly copied from PyDy project and are licensed as: + +Copyright (c) 2009-2023, PyDy 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 this project 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 PYDY AUTHORS 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 files under the directory sympy/parsing/latex +are directly copied from latex2sympy project and are licensed as: + +Copyright 2016, latex2sympy + +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. + + +tabulate +MIT +https://github.com/astanin/python-tabulate +Copyright (c) 2011-2020 Sergey Astanin and 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. + + +tensorboard +Apache Software License +https://github.com/tensorflow/tensorboard +# TensorBoard License + +TensorBoard is licensed Apache 2.0 and distributed with +vendored content licensed Apache 2.0, MIT, and BSD-3. + +## Table of Contents + +- tensorboard/pip_package/LICENSE.tensorflow +- external/npm/node_modules/d3/LICENSE +- external/com_google_fonts_roboto/LICENSE +- external/org_mozilla_bleach/LICENSE +- external/org_pythonhosted_webencodings/LICENSE +- third_party/bh_tsne.LICENSE + +## Licenses + + + +### tensorboard/pip_package/LICENSE.tensorflow + +Copyright 2017 The TensorFlow Authors. All rights reserved. + + 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 2017, The TensorFlow Authors. + + 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. + + + +### external/npm/node_modules/d3/LICENSE + +Copyright 2010-2017 Mike Bostock +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 the author nor the names of 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. + + + +### external/com_google_fonts_roboto/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. + + 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. + + + +### external/org_mozilla_bleach/LICENSE + +Copyright (c) 2014-2017, Mozilla Foundation + +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. + + + +### external/org_pythonhosted_webencodings/LICENSE + +Copyright (c) 2012 by Simon Sapin. + +Some 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. + + * The names of the contributors may not 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. + + + +### third_party/bh_tsne.LICENSE + +The MIT License (MIT) + +Copyright (c) 2015 Andrej Karpathy + +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. + + +tensorboard-data-server +Apache Software License +https://github.com/tensorflow/tensorboard/tree/master/tensorboard/data/server +UNKNOWN + +tensorstore +Apache-2.0 +https://github.com/google/tensorstore +Files: **/* + +Copyright 2018 The TensorStore Authors. All rights reserved. + + 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 2017, The TensorStore Authors. + + 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. + +-------------------------------------------------------------------------------- + +Files: internal/utf8.cc + +Copyright (c) 2008-2009 Bjoern Hoehrmann + +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. + +-------------------------------------------------------------------------------- + +Files: third_party/snappy/bundled.BUILD.bazel + +Copyright 2011 Google Inc. All Rights Reserved. +Author: sesse@google.com (Steinar H. Gunderson) + +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. + +-------------------------------------------------------------------------------- + +Files: tools/cmake/FindAVIF.cmake + +Copyright (C) 2021 Igalia S.L. + +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. + +THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. + + + +termcolor +MIT +https://github.com/termcolor/termcolor +Copyright (c) 2008-2011 Volvox Development Team + +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. + + +terminado +BSD License +https://github.com/jupyter/terminado +BSD 2-Clause License + +- Copyright (c) 2014-, Jupyter development team +- Copyright (c) 2014, Ramalingam Saravanan + +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. + +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. + + +tifffile +BSD-3-Clause +https://www.cgohlke.com +BSD-3-Clause license + +Copyright (c) 2008-2026, Christoph Gohlke +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. + + +tiktoken +MIT License + +Copyright (c) 2022 OpenAI, Shantanu Jain + +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. + +https://github.com/openai/tiktoken +MIT License + +Copyright (c) 2022 OpenAI, Shantanu Jain + +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. + + +timm +Apache Software License +https://github.com/huggingface/pytorch-image-models + 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 2019 Ross Wightman + + 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. + + +tinycss2 +BSD License +https://www.courtbouillon.org/tinycss2 +BSD 3-Clause License + +Copyright (c) 2013-2020, Simon Sapin and contributors. +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 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. + + +tokenizers +Apache Software License +https://github.com/huggingface/tokenizers +UNKNOWN + +tomli +MIT +https://github.com/hukkin/tomli +MIT License + +Copyright (c) 2021 Taneli Hukkinen + +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. + + +tomli_w +MIT License +https://github.com/hukkin/tomli-w +MIT License + +Copyright (c) 2021 Taneli Hukkinen + +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. + + +tomlkit +MIT License +https://github.com/sdispater/tomlkit +Copyright (c) 2018 Sébastien Eustace + +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. + + +torch +BSD-3-Clause +https://pytorch.org +From PyTorch: + +Copyright (c) 2016- Facebook, Inc (Adam Paszke) +Copyright (c) 2014- Facebook, Inc (Soumith Chintala) +Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert) +Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu) +Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu) +Copyright (c) 2011-2013 NYU (Clement Farabet) +Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston) +Copyright (c) 2006 Idiap Research Institute (Samy Bengio) +Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) + +From Caffe2: + +Copyright (c) 2016-present, Facebook Inc. All rights reserved. + +All contributions by Facebook: +Copyright (c) 2016 Facebook Inc. + +All contributions by Google: +Copyright (c) 2015 Google Inc. +All rights reserved. + +All contributions by Yangqing Jia: +Copyright (c) 2015 Yangqing Jia +All rights reserved. + +All contributions by Kakao Brain: +Copyright 2019-2020 Kakao Brain + +All contributions by Cruise LLC: +Copyright (c) 2022 Cruise LLC. +All rights reserved. + +All contributions by Tri Dao: +Copyright (c) 2024 Tri Dao. +All rights reserved. + +All contributions by Arm: +Copyright (c) 2021, 2023-2025 Arm Limited and/or its affiliates + +All contributions from Caffe: +Copyright(c) 2013, 2014, 2015, the respective contributors +All rights reserved. + +All other contributions: +Copyright(c) 2015, 2016 the respective contributors +All rights reserved. + +Caffe2 uses a copyright model similar to Caffe: each contributor holds +copyright over their contributions to Caffe2. The project versioning records +all such contribution and copyright details. If a contributor wants to further +mark their specific copyright on a particular contribution, they should +indicate their copyright solely in the commit message of the change when it is +committed. + +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 names of Facebook, Deepmind Technologies, NYU, NEC Laboratories America + and IDIAP Research Institute 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. + + +The PyTorch repository and source distributions bundle several libraries that are +compatibly licensed. We list these here. + +Name: DCGM +License: Apache-2.0 +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/LICENSE + +Name: FP16 +License: MIT +Files: /pytorch/third_party/FP16 + For details, see the files concatenated below: /pytorch/third_party/FP16/LICENSE + +Name: FXdiv +License: MIT +Files: /pytorch/third_party/FXdiv + For details, see the files concatenated below: /pytorch/third_party/FXdiv/LICENSE + +Name: NNPACK +License: BSD-2-Clause +Files: /pytorch/third_party/NNPACK + For details, see the files concatenated below: /pytorch/third_party/NNPACK/LICENSE + +Name: NVTX +License: Apache-2.0 with exception +Files: /pytorch/third_party/NVTX + For details, see the files concatenated below: /pytorch/third_party/NVTX/LICENSE.txt + +Name: VulkanMemoryAllocator +License: MIT +Files: /pytorch/third_party/VulkanMemoryAllocator + For details, see the files concatenated below: /pytorch/third_party/VulkanMemoryAllocator/LICENSE.txt + +Name: XNNPACK +License: BSD-3-Clause +Files: /pytorch/third_party/XNNPACK + For details, see the files concatenated below: /pytorch/third_party/XNNPACK/LICENSE + +Name: aiter +License: MIT +Files: /pytorch/third_party/aiter + For details, see the files concatenated below: /pytorch/third_party/aiter/LICENSE + +Name: benchmark +License: Apache-2.0 +Files: /pytorch/third_party/benchmark, + /pytorch/third_party/opentelemetry-cpp/third_party/benchmark, + /pytorch/third_party/protobuf/third_party/benchmark + For details, see the files concatenated below: /pytorch/third_party/benchmark/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/benchmark/LICENSE, + /pytorch/third_party/protobuf/third_party/benchmark/LICENSE + +Name: boost-vcpkg-helpers +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/boost-vcpkg-helpers + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/boost-vcpkg-helpers/LICENSE.txt + +Name: cJSON +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON/LICENSE + +Name: catch2 +License: BSL-1.0 +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/catch2 + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/catch2/LICENSE.txt + +Name: clog +License: BSD-2-Clause +Files: /pytorch/third_party/cpuinfo/deps/clog, + /pytorch/third_party/fbgemm/external/cpuinfo/deps/clog + For details, see the files concatenated below: /pytorch/third_party/cpuinfo/deps/clog/LICENSE, + /pytorch/third_party/fbgemm/external/cpuinfo/deps/clog/LICENSE + +Name: colorama +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/testing/python3/libs_3rdparty/colorama + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/testing/python3/libs_3rdparty/colorama/LICENSE.txt + +Name: composable_kernel +License: MIT +Files: /pytorch/third_party/aiter/3rdparty/composable_kernel, + /pytorch/third_party/composable_kernel, + /pytorch/third_party/fbgemm/external/composable_kernel, + /pytorch/third_party/flash-attention/csrc/composable_kernel + For details, see the files concatenated below: /pytorch/third_party/aiter/3rdparty/composable_kernel/LICENSE, + /pytorch/third_party/composable_kernel/LICENSE, + /pytorch/third_party/fbgemm/external/composable_kernel/LICENSE, + /pytorch/third_party/flash-attention/csrc/composable_kernel/LICENSE + +Name: cpp-httplib +License: MIT +Files: /pytorch/third_party/cpp-httplib + For details, see the files concatenated below: /pytorch/third_party/cpp-httplib/LICENSE + +Name: cpplint +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/third_party/cpplint + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/third_party/cpplint/LICENSE + +Name: cpr +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/LICENSE + +Name: cpuinfo +License: BSD-2-Clause +Files: /pytorch/third_party/cpuinfo, + /pytorch/third_party/fbgemm/external/cpuinfo + For details, see the files concatenated below: /pytorch/third_party/cpuinfo/LICENSE, + /pytorch/third_party/fbgemm/external/cpuinfo/LICENSE + +Name: cudnn_frontend +License: MIT +Files: /pytorch/third_party/cudnn_frontend + For details, see the files concatenated below: /pytorch/third_party/cudnn_frontend/LICENSE.txt + +Name: cutlass +License: BSD-3-Clause +Files: /pytorch/third_party/cutlass, + /pytorch/third_party/fbgemm/external/cutlass, + /pytorch/third_party/flash-attention/csrc/cutlass + For details, see the files concatenated below: /pytorch/third_party/cutlass/LICENSE.txt, + /pytorch/third_party/fbgemm/external/cutlass/LICENSE.txt, + /pytorch/third_party/flash-attention/csrc/cutlass/LICENSE.txt + +Name: dart +License: Apache-2.0 +Files: /pytorch/third_party/flatbuffers/dart + For details, see the files concatenated below: /pytorch/third_party/flatbuffers/dart/LICENSE + +Name: docs +License: Apache-2.0 with exception +Files: /pytorch/third_party/NVTX/docs + For details, see the files concatenated below: /pytorch/third_party/NVTX/docs/LICENSE.txt + +Name: doctest +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/test/thirdparty/doctest + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/test/thirdparty/doctest/LICENSE.txt + +Name: duktape-1.5.2 +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2 + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/LICENSE.txt, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/LICENSE.txt + +Name: duktape-1.8.0 +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0 + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/LICENSE.txt, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/LICENSE.txt + +Name: dynolog +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/LICENSE + +Name: etw +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/exporters/etw/include/opentelemetry/exporters/etw + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/exporters/etw/include/opentelemetry/exporters/etw/LICENSE + +Name: expected +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/expected + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/expected/LICENSE + +Name: fbgemm +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm + For details, see the files concatenated below: /pytorch/third_party/fbgemm/LICENSE + +Name: ffnvcodec +License: MIT with exception +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/ffnvcodec + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/ffnvcodec/LICENSE.txt + +Name: flash-attention +License: BSD-3-Clause +Files: /pytorch/third_party/flash-attention + For details, see the files concatenated below: /pytorch/third_party/flash-attention/LICENSE + +Name: flatbuffers +License: Apache-2.0 +Files: /pytorch/third_party/flatbuffers + For details, see the files concatenated below: /pytorch/third_party/flatbuffers/LICENSE + +Name: fmt +License: MIT with exception +Files: /pytorch/third_party/fmt, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/fmt, + /pytorch/third_party/kineto/libkineto/third_party/fmt + For details, see the files concatenated below: /pytorch/third_party/fmt/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/fmt/LICENSE.rst, + /pytorch/third_party/kineto/libkineto/third_party/fmt/LICENSE + +Name: gemmlowp +License: Apache-2.0 +Files: /pytorch/third_party/gemmlowp/gemmlowp + For details, see the files concatenated below: /pytorch/third_party/gemmlowp/gemmlowp/LICENSE + +Name: generator +License: Apache-2.0 +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator, + /pytorch/third_party/protobuf/third_party/googletest/googlemock/scripts/generator, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/googlemock/scripts/generator/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator/LICENSE + +Name: gettimeofday +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/gettimeofday + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/gettimeofday/LICENSE + +Name: gloo +License: BSD-3-Clause +Files: /pytorch/third_party/gloo + For details, see the files concatenated below: /pytorch/third_party/gloo/LICENSE + +Name: googlemock +License: BSD-3-Clause +Files: /pytorch/third_party/protobuf/third_party/googletest/googlemock, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock + For details, see the files concatenated below: /pytorch/third_party/protobuf/third_party/googletest/googlemock/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/googlemock/LICENSE + +Name: googletest +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm/external/googletest, + /pytorch/third_party/googletest, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/googletest, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/googletest, + /pytorch/third_party/kineto/libkineto/third_party/googletest, + /pytorch/third_party/opentelemetry-cpp/third_party/googletest, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest, + /pytorch/third_party/protobuf/third_party/googletest, + /pytorch/third_party/protobuf/third_party/googletest/googletest, + /pytorch/third_party/tensorpipe/third_party/googletest, + /pytorch/third_party/tensorpipe/third_party/googletest/googletest + For details, see the files concatenated below: /pytorch/third_party/fbgemm/external/googletest/LICENSE, + /pytorch/third_party/googletest/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/googletest/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/googletest/LICENSE, + /pytorch/third_party/kineto/libkineto/third_party/googletest/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/googletest/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/LICENSE, + /pytorch/third_party/protobuf/third_party/googletest/googletest/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/LICENSE, + /pytorch/third_party/tensorpipe/third_party/googletest/googletest/LICENSE + +Name: gtest +License: BSD-3-Clause +Files: /pytorch/third_party/ideep/mkl-dnn/tests/gtests/gtest + For details, see the files concatenated below: /pytorch/third_party/ideep/mkl-dnn/tests/gtests/gtest/LICENSE + +Name: hipify_torch +License: MIT +Files: /pytorch/third_party/fbgemm/external/hipify_torch + For details, see the files concatenated below: /pytorch/third_party/fbgemm/external/hipify_torch/LICENSE.txt + +Name: hstu +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm/fbgemm_gpu/experimental/hstu + For details, see the files concatenated below: /pytorch/third_party/fbgemm/fbgemm_gpu/experimental/hstu/LICENSE + +Name: hungarian +License: Permissive (free to use) +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/hungarian + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/hungarian/LICENSE.txt + +Name: ideep +License: MIT +Files: /pytorch/third_party/ideep + For details, see the files concatenated below: /pytorch/third_party/ideep/LICENSE + +Name: irrlicht +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/irrlicht + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/irrlicht/LICENSE.txt + +Name: kineto +License: BSD-3-Clause +Files: /pytorch/third_party/kineto + For details, see the files concatenated below: /pytorch/third_party/kineto/LICENSE + +Name: libnop +License: Apache-2.0 +Files: /pytorch/third_party/tensorpipe/third_party/libnop + For details, see the files concatenated below: /pytorch/third_party/tensorpipe/third_party/libnop/LICENSE + +Name: libstemmer +License: BSD-3-Clause +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/libstemmer + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/libstemmer/LICENSE + +Name: libuv +License: MIT +Files: /pytorch/third_party/tensorpipe/third_party/libuv + For details, see the files concatenated below: /pytorch/third_party/tensorpipe/third_party/libuv/LICENSE + +Name: mimalloc +License: MIT +Files: /pytorch/third_party/mimalloc + For details, see the files concatenated below: /pytorch/third_party/mimalloc/LICENSE + +Name: miniz-3.0.2 +License: MIT +Files: /pytorch/third_party/miniz-3.0.2 + For details, see the files concatenated below: /pytorch/third_party/miniz-3.0.2/LICENSE + +Name: mkl-dnn +License: Apache-2.0 +Files: /pytorch/third_party/ideep/mkl-dnn + For details, see the files concatenated below: /pytorch/third_party/ideep/mkl-dnn/LICENSE + +Name: ms-gsl +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/third_party/ms-gsl + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/ms-gsl/LICENSE + +Name: mx +License: MIT +Files: /pytorch/third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx, + /pytorch/third_party/fbgemm/fbgemm_gpu/test/quantize/mx + For details, see the files concatenated below: /pytorch/third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx/LICENSE, + /pytorch/third_party/fbgemm/fbgemm_gpu/test/quantize/mx/LICENSE + +Name: onnx +License: Apache-2.0 +Files: /pytorch/third_party/onnx + For details, see the files concatenated below: /pytorch/third_party/onnx/LICENSE + +Name: opentelemetry-cpp +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/LICENSE + +Name: opentelemetry-proto +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentelemetry-proto + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentelemetry-proto/LICENSE + +Name: opentracing-cpp +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/LICENSE + +Name: pdcurses +License: Public Domain for core +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pdcurses + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pdcurses/LICENSE + +Name: pfs +License: Apache-2.0 +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/pfs + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/pfs/LICENSE + +Name: physac +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/physac + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/physac/LICENSE + +Name: pqp +License: Apache-2.0 +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pqp + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pqp/LICENSE + +Name: prometheus-cpp +License: MIT +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/LICENSE, + /pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/LICENSE + +Name: protobuf +License: BSD-3-Clause +Files: /pytorch/third_party/protobuf + For details, see the files concatenated below: /pytorch/third_party/protobuf/LICENSE + +Name: psimd +License: MIT +Files: /pytorch/third_party/psimd + For details, see the files concatenated below: /pytorch/third_party/psimd/LICENSE + +Name: pthreadpool +License: BSD-2-Clause +Files: /pytorch/third_party/pthreadpool + For details, see the files concatenated below: /pytorch/third_party/pthreadpool/LICENSE + +Name: pybind11 +License: BSD-3-Clause +Files: /pytorch/third_party/onnx/third_party/pybind11, + /pytorch/third_party/pybind11, + /pytorch/third_party/tensorpipe/third_party/pybind11 + For details, see the files concatenated below: /pytorch/third_party/onnx/third_party/pybind11/LICENSE, + /pytorch/third_party/pybind11/LICENSE, + /pytorch/third_party/tensorpipe/third_party/pybind11/LICENSE + +Name: python +License: Apache-2.0 with exception +Files: /pytorch/third_party/NVTX/python + For details, see the files concatenated below: /pytorch/third_party/NVTX/python/LICENSE.txt + +Name: python +License: BSD-3-Clause +Files: /pytorch/third_party/cutlass/python + For details, see the files concatenated below: /pytorch/third_party/cutlass/python/LICENSE.txt + +Name: python +License: BSD-3-Clause +Files: /pytorch/third_party/fbgemm/external/cutlass/python + For details, see the files concatenated below: /pytorch/third_party/fbgemm/external/cutlass/python/LICENSE.txt + +Name: python +License: BSD-3-Clause +Files: /pytorch/third_party/flash-attention/csrc/cutlass/python + For details, see the files concatenated below: /pytorch/third_party/flash-attention/csrc/cutlass/python/LICENSE.txt + +Name: python-peachpy +License: BSD-2-Clause +Files: /pytorch/third_party/python-peachpy + For details, see the files concatenated below: /pytorch/third_party/python-peachpy/LICENSE.rst + +Name: sigslot +License: Public Domain +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/sigslot + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/sigslot/LICENSE + +Name: sleef +License: BSL-1.0 +Files: /pytorch/third_party/sleef + For details, see the files concatenated below: /pytorch/third_party/sleef/LICENSE.txt + +Name: swift +License: Apache-2.0 +Files: /pytorch/third_party/flatbuffers/swift + For details, see the files concatenated below: /pytorch/third_party/flatbuffers/swift/LICENSE + +Name: tb_plugin +License: BSD-3-Clause +Files: /pytorch/third_party/kineto/tb_plugin + For details, see the files concatenated below: /pytorch/third_party/kineto/tb_plugin/LICENSE + +Name: tensorflow-common +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/tensorflow-common + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/tensorflow-common/LICENSE.txt + +Name: tensorpipe +License: BSD-3-Clause +Files: /pytorch/third_party/tensorpipe + For details, see the files concatenated below: /pytorch/third_party/tensorpipe/LICENSE.txt + +Name: test +License: MIT with exception +Files: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/test + For details, see the files concatenated below: /pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/test/LICENSE + +Name: variant +License: BSD-3-Clause +Files: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/variant + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/variant/LICENSE + +Name: vcpkg +License: MIT +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/LICENSE.txt + +Name: vulkan +License: Apache-2.0 with exception +Files: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/vulkan + For details, see the files concatenated below: /pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/vulkan/LICENSE.txt + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/LICENSE +---------------------------------------------------------------------------------- +Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. + +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. + + +/pytorch/third_party/FP16/LICENSE +--------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2017 Georgia Institute of Technology +Copyright 2019 Google LLC + +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. + + +/pytorch/third_party/FXdiv/LICENSE +---------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2016-2017 Marat Dukhan + +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. + + +/pytorch/third_party/NNPACK/LICENSE +----------------------------------- +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2015-2017, Georgia Institute of Technology +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. + +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. + + +/pytorch/third_party/NVTX/LICENSE.txt +------------------------------------- +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +/pytorch/third_party/VulkanMemoryAllocator/LICENSE.txt +------------------------------------------------------ +Copyright (c) 2017-2025 Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/XNNPACK/LICENSE +------------------------------------ +BSD License + +For XNNPACK software + +Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. +Copyright 2019 Google LLC + +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. + + +/pytorch/third_party/aiter/LICENSE +---------------------------------- +Copyright © Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/benchmark/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. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/benchmark/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. + + 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. + + +/pytorch/third_party/protobuf/third_party/benchmark/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. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/boost-vcpkg-helpers/LICENSE.txt +---------------------------------------------------------------------------------------- +Copyright (c) Microsoft Corporation + +All rights reserved. + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON/LICENSE +---------------------------------------------------------------------------------------------------------------------------------- +Copyright (c) 2009-2017 Dave Gamble and cJSON 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. + + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/examples/rest/cJSON/LICENSE +--------------------------------------------------------------------------------------------------------------- +Copyright (c) 2009-2017 Dave Gamble and cJSON 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. + + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/catch2/LICENSE.txt +------------------------------------------------------------------------------------------------------------------- +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +/pytorch/third_party/cpuinfo/deps/clog/LICENSE +---------------------------------------------- +Copyright (C) 2018 Marat Dukhan +Copyright (c) 2017-2018 Facebook Inc. +Copyright (c) 2017 Georgia Institute of Technology + +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. + +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. + + +/pytorch/third_party/fbgemm/external/cpuinfo/deps/clog/LICENSE +-------------------------------------------------------------- +Copyright (C) 2018 Marat Dukhan +Copyright (c) 2017-2018 Facebook Inc. +Copyright (c) 2017 Georgia Institute of Technology + +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. + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/DCGM/testing/python3/libs_3rdparty/colorama/LICENSE.txt +----------------------------------------------------------------------------------------------------------------------------- +Copyright (c) 2010 Jonathan Hartley + +Released under the New BSD license (reproduced below), or alternatively you may +use this software under any OSI approved open source license such as those at +http://opensource.org/licenses/alphabetical + +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(s) of the copyright holders, nor those 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. + + + +/pytorch/third_party/aiter/3rdparty/composable_kernel/LICENSE +------------------------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/composable_kernel/LICENSE +---------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/fbgemm/external/composable_kernel/LICENSE +-------------------------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/flash-attention/csrc/composable_kernel/LICENSE +------------------------------------------------------------------- +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/cpp-httplib/LICENSE +---------------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 yhirose + +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. + + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/third_party/cpplint/LICENSE +------------------------------------------------------------------------------------------------------ +cpplint.py and its corresponding unit tests are Copyright (C) 2009 Google Inc. + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/LICENSE +--------------------------------------------------------------------------------- +This license applies to everything except the contents of the "test" +directory and its subdirectories. + +MIT License + +Copyright (c) 2017-2021 Huu Nguyen +Copyright (c) 2022 libcpr and many other 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. + +/pytorch/third_party/cpuinfo/LICENSE +------------------------------------ +Copyright (c) 2019 Google LLC +Copyright (c) 2017-2018 Facebook Inc. +Copyright (C) 2012-2017 Georgia Institute of Technology +Copyright (C) 2010-2012 Marat Dukhan + +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. + +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. + + +/pytorch/third_party/fbgemm/external/cpuinfo/LICENSE +---------------------------------------------------- +Copyright (c) 2019 Google LLC +Copyright (c) 2017-2018 Facebook Inc. +Copyright (C) 2012-2017 Georgia Institute of Technology +Copyright (C) 2010-2012 Marat Dukhan + +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. + +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. + + +/pytorch/third_party/cudnn_frontend/LICENSE.txt +----------------------------------------------- +/* + * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * + * 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. + */ + + +/pytorch/third_party/cutlass/LICENSE.txt +---------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. + +Certain files within this repository are subject to separate licensing terms: + +- The files located in the `python/CuTeDSL` directory are licensed under the + NVIDIA End User License Agreement (EULA). Please refer to + https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html + for the full terms. + + +/pytorch/third_party/fbgemm/external/cutlass/LICENSE.txt +-------------------------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. + +Certain files within this repository are subject to separate licensing terms: + +- The files located in the `python/CuTeDSL` directory are licensed under the + NVIDIA End User License Agreement (EULA). Please refer to + https://docs.nvidia.com/cutlass/media/docs/pythonDSL/license.html + for the full terms. + + +/pytorch/third_party/flash-attention/csrc/cutlass/LICENSE.txt +------------------------------------------------------------- +Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. + + +/pytorch/third_party/flatbuffers/dart/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. + + Copyright 2014 Google Inc. + + 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. + + +/pytorch/third_party/NVTX/docs/LICENSE.txt +------------------------------------------ +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/json/test/thirdparty/doctest/LICENSE.txt +-------------------------------------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2016-2021 Viktor Kirilov + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/LICENSE.txt +------------------------------------------------------------------------------------------------------------------------------------------------ +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2016 by Duktape authors (see AUTHORS.rst) + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.5.2/LICENSE.txt +----------------------------------------------------------------------------------------------------------------------------- +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2016 by Duktape authors (see AUTHORS.rst) + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/LICENSE.txt +------------------------------------------------------------------------------------------------------------------------------------------------ +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/third_party/duktape-1.8.0/LICENSE.txt +----------------------------------------------------------------------------------------------------------------------------- +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) + +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/LICENSE +----------------------------------------------------------------- +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +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. + + +/pytorch/third_party/opentelemetry-cpp/exporters/etw/include/opentelemetry/exporters/etw/LICENSE +------------------------------------------------------------------------------------------------ +TraceLogging Dynamic for Windows + +Copyright (c) Microsoft Corporation. All rights reserved. + +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/expected/LICENSE +----------------------------------------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) 2015 Martin Moene +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +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. + + + +/pytorch/third_party/fbgemm/LICENSE +----------------------------------- +BSD License + +For FBGEMM 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 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/ffnvcodec/LICENSE.txt +------------------------------------------------------------------------------ +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Libraries +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + +one line to give the library's name and an idea of what it does. +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice +That's all there is to it! + +/pytorch/third_party/flash-attention/LICENSE +-------------------------------------------- +BSD 3-Clause License + +Copyright (c) 2022, the respective contributors, as shown by the AUTHORS file. +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 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. + + +/pytorch/third_party/flatbuffers/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. + + 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. + + +/pytorch/third_party/fmt/LICENSE +-------------------------------- +Copyright (c) 2012 - present, Victor Zverovich and {fmt} 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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/fmt/LICENSE.rst +------------------------------------------------------------------------------------- +Copyright (c) 2012 - present, Victor Zverovich + +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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + + +/pytorch/third_party/kineto/libkineto/third_party/fmt/LICENSE +------------------------------------------------------------- +Copyright (c) 2012 - present, Victor Zverovich and {fmt} 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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + + +/pytorch/third_party/gemmlowp/gemmlowp/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. + + 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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator/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. + + Copyright [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/googlemock/scripts/generator/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. + + Copyright [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/protobuf/third_party/googletest/googlemock/scripts/generator/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. + + Copyright [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator/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. + + Copyright [2007] Neal Norwitz + Portions Copyright [2007] Google Inc. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/gettimeofday/LICENSE +----------------------------------------------------------------------------- +/* + * Copied from PostgreSQL source: + * http://doxygen.postgresql.org/gettimeofday_8c_source.html + * + */ + +/* + * gettimeofday.c + * Win32 gettimeofday() replacement + * + * src/port/gettimeofday.c + * + * Copyright (c) 2003 SRA, Inc. + * Copyright (c) 2003 SKC, Inc. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without a + * written agreement is hereby granted, provided that the above + * copyright notice and this paragraph and the following two + * paragraphs appear in all copies. + * + * IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, + * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING + * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS + * IS" BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, + * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + + +/pytorch/third_party/gloo/LICENSE +--------------------------------- +BSD License + +For Gloo software + +Copyright (c) 2017-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. + + +/pytorch/third_party/protobuf/third_party/googletest/googlemock/LICENSE +----------------------------------------------------------------------- +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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/googlemock/LICENSE +------------------------------------------------------------------------- +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. + + +/pytorch/third_party/fbgemm/external/googletest/LICENSE +------------------------------------------------------- +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. + + +/pytorch/third_party/googletest/LICENSE +--------------------------------------- +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/googletest/LICENSE +---------------------------------------------------------------------------------------- +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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/3rdparty/googletest/LICENSE +---------------------------------------------------------------------------------------------------------------- +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. + + +/pytorch/third_party/kineto/libkineto/third_party/googletest/LICENSE +-------------------------------------------------------------------- +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/googletest/LICENSE +--------------------------------------------------------------------- +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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/googletest/LICENSE +--------------------------------------------------------------------------------------------- +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. + + +/pytorch/third_party/protobuf/third_party/googletest/LICENSE +------------------------------------------------------------ +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. + + +/pytorch/third_party/protobuf/third_party/googletest/googletest/LICENSE +----------------------------------------------------------------------- +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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/LICENSE +-------------------------------------------------------------- +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. + + +/pytorch/third_party/tensorpipe/third_party/googletest/googletest/LICENSE +------------------------------------------------------------------------- +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. + + +/pytorch/third_party/ideep/mkl-dnn/tests/gtests/gtest/LICENSE +------------------------------------------------------------- +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. + + +/pytorch/third_party/fbgemm/external/hipify_torch/LICENSE.txt +------------------------------------------------------------- +MIT License + +Copyright (c) 2021-2024, Advanced Micro Devices, Inc. All rights reserved. + +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. + + +/pytorch/third_party/fbgemm/fbgemm_gpu/experimental/hstu/LICENSE +---------------------------------------------------------------- +BSD 3-Clause License + +Copyright (c) 2022, the respective contributors, as shown by the AUTHORS file. +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 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. + +/* + * SPDX-FileCopyrightText: Copyright (c) <2024> NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: LicenseRef-NvidiaProprietary + * + * NVIDIA CORPORATION, its affiliates and licensors retain all intellectual + * property and proprietary rights in and to this material, related + * documentation and any modifications thereto. Any use, reproduction, + * disclosure or distribution of this material and related documentation + * without an express license agreement from NVIDIA CORPORATION or + * its affiliates is strictly prohibited. + */ + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/hungarian/LICENSE.txt +------------------------------------------------------------------------------ +/******************************************************************** + ******************************************************************** + ** + ** libhungarian by Cyrill Stachniss, 2004 + ** + ** + ** Solving the Minimum Assignment Problem using the + ** Hungarian Method. + ** + ** ** This file may be freely copied and distributed! ** + ** + ** Parts of the used code was originally provided by the + ** "Stanford GraphGase", but I made changes to this code. + ** As asked by the copyright node of the "Stanford GraphGase", + ** I hereby proclaim that this file are *NOT* part of the + ** "Stanford GraphGase" distrubition! + ** + ** This file is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied + ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + ** PURPOSE. + ** + ******************************************************************** + ********************************************************************/ + + +/pytorch/third_party/ideep/LICENSE +---------------------------------- +Copyright (c) 2018 Intel Corporation. + +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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/irrlicht/LICENSE.txt +----------------------------------------------------------------------------- +The Irrlicht Engine License +=========================== + +Copyright (C) 2002-2015 Nikolaus Gebhardt + +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 acknowledgement in the product documentation would be + appreciated but is not required. +2. Altered source versions must be clearly 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. + +/pytorch/third_party/kineto/LICENSE +----------------------------------- +BSD License + +For Kineto software + +Copyright (c) Meta Platforms, Inc. and affiliates. + +All contributions by Microsoft: +Copyright (c) Microsoft Corporation. (The Azure AI Platform team) + +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 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. + + +/pytorch/third_party/tensorpipe/third_party/libnop/LICENSE +---------------------------------------------------------- +Copyright 2017 The Native Object Protocols Authors + +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 + + https://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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/libstemmer/LICENSE +--------------------------------------------------------------------------- +Snowball - License +Except where explicitly noted, all the software given out on this Snowball site is covered by the 3-clause BSD License: + +Copyright (c) 2001, Dr Martin Porter, +Copyright (c) 2002, Richard Boulton. +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. +Essentially, all this means is that you can do what you like with the code, except claim another Copyright for it, or claim that it is issued under a different license. The software is also issued without warranties, which means that if anyone suffers through its use, they cannot come back and sue you. You also have to alert anyone to whom you give the Snowball software to the fact that it is covered by the BSD license. + +We have not bothered to insert the licensing arrangement into the text of the Snowball software. + + +/pytorch/third_party/tensorpipe/third_party/libuv/LICENSE +--------------------------------------------------------- +Copyright (c) 2015-present libuv project 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. + + +/pytorch/third_party/mimalloc/LICENSE +------------------------------------- +MIT License + +Copyright (c) 2018-2025 Microsoft Corporation, Daan Leijen + +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. + + +/pytorch/third_party/miniz-3.0.2/LICENSE +---------------------------------------- +Copyright 2013-2014 RAD Game Tools and Valve Software +Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + +All Rights Reserved. + +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. + + +/pytorch/third_party/ideep/mkl-dnn/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 + + ============================================================================ + + Copyright 2016-2023 Intel Corporation + Copyright 2018 YANDEX LLC + Copyright 2019-2023 FUJITSU LIMITED + Copyright 2020-2023 Arm Ltd. and affiliates + Copyright 2020-2022 Codeplay Software Limited + Copyright 2021 Alanna Tempest + Copyright 2022-2023 IBM Corporation + Copyright 2023 KNS Group LLC (YADRO) + + 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 distribution includes third party software ("third party programs"). + This third party software, even if included with the distribution of + the Intel software, may be governed by separate license terms, including + without limitation, third party license terms, other Intel software license + terms, and open source software license terms. These separate license terms + govern your use of the third party programs as set forth in the + "THIRD-PARTY-PROGRAMS" file. + + +/pytorch/third_party/opentelemetry-cpp/third_party/ms-gsl/LICENSE +----------------------------------------------------------------- +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +This code is licensed under the MIT 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. + + +/pytorch/third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx/LICENSE +------------------------------------------------------------------ + MIT License + + Copyright (c) Microsoft Corporation. + + 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 + + +/pytorch/third_party/fbgemm/fbgemm_gpu/test/quantize/mx/LICENSE +--------------------------------------------------------------- + MIT License + + Copyright (c) Microsoft Corporation. + + 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 + + +/pytorch/third_party/onnx/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. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/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. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentelemetry-proto/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. + + 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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/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. + + Copyright The OpenTracing Authors + + 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. + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pdcurses/LICENSE +------------------------------------------------------------------------- +The core package is in the public domain, but small portions of PDCurses are subject to copyright under various licenses. + +The win32 files are released to the public domain. + +If you use PDCurses in an application, an acknowledgement would be appreciated, but is not mandatory. If you make corrections or enhancements to PDCurses, please forward them to the current maintainer for the benefit of other users. + +This software is provided AS IS with NO WARRANTY whatsoever. + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/pfs/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 + + Copyright 2020-present Daniel Trugman + + 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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/physac/LICENSE +----------------------------------------------------------------------- +MIT License + +Copyright (c) 2022 Víctor Fisac + +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. + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/pqp/LICENSE +-------------------------------------------------------------------- +Copyright 1999 University of North Carolina at Chapel Hill. +All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for educational, research, and non-profit purposes, without fee, +and without a written agreement is hereby granted, provided that the above +copyright notice and the following three paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL BE LIABLE TO +ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL SPECIFICALLY DISCLAIMS ANY +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED +HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF NORTH CAROLINA AT +CHAPEL HILL HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, +ENHANCEMENTS, OR MODIFICATIONS. + +The authors may be contacted via: + +US Mail: Eric Larsen, Stefan Gottschalk + Department of Computer Science + Sitterson Hall, CB #3175 + University of North Carolina + Chapel Hill, NC 27599-3175 + +Phone: (919) 962-1749 + +Email: geom@cs.unc.edu + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/prometheus-cpp/LICENSE +-------------------------------------------------------------------------------------------- +MIT License + +Copyright (c) 2016-2021 Jupp Mueller +Copyright (c) 2017-2022 Gregor Jasny + +And many contributors, see +https://github.com/jupp0r/prometheus-cpp/graphs/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. + + +/pytorch/third_party/opentelemetry-cpp/third_party/prometheus-cpp/LICENSE +------------------------------------------------------------------------- +MIT License + +Copyright (c) 2016-2021 Jupp Mueller +Copyright (c) 2017-2022 Gregor Jasny + +And many contributors, see +https://github.com/jupp0r/prometheus-cpp/graphs/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. + + +/pytorch/third_party/protobuf/LICENSE +------------------------------------- +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. + + +/pytorch/third_party/psimd/LICENSE +---------------------------------- +The MIT License (MIT) + +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2014-2017 Georgia Institute of Technology +Copyright 2019 Google LLC + +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. + + +/pytorch/third_party/pthreadpool/LICENSE +---------------------------------------- +Copyright 2019 Google LLC +Copyright (c) 2017 Facebook Inc. +Copyright (c) 2015-2017 Georgia Institute of Technology +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. + +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. + + + +/pytorch/third_party/onnx/third_party/pybind11/LICENSE +------------------------------------------------------ +Copyright (c) 2016 Wenzel Jakob , 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. + +Please also refer to the file .github/CONTRIBUTING.md, which clarifies licensing of +external contributions to this project including patches, pull requests, etc. + + +/pytorch/third_party/pybind11/LICENSE +------------------------------------- +Copyright (c) 2016 Wenzel Jakob , 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. + +Please also refer to the file .github/CONTRIBUTING.md, which clarifies licensing of +external contributions to this project including patches, pull requests, etc. + + +/pytorch/third_party/tensorpipe/third_party/pybind11/LICENSE +------------------------------------------------------------ +Copyright (c) 2016 Wenzel Jakob , 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. + +Please also refer to the file CONTRIBUTING.md, which clarifies licensing of +external contributions to this project including patches, pull requests, etc. + + +/pytorch/third_party/NVTX/python/LICENSE.txt +-------------------------------------------- +============================================================================== +NVTX is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + + +/pytorch/third_party/cutlass/python/LICENSE.txt +----------------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. + + +/pytorch/third_party/fbgemm/external/cutlass/python/LICENSE.txt +--------------------------------------------------------------- +Copyright (c) 2017 - 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. + + +/pytorch/third_party/flash-attention/csrc/cutlass/python/LICENSE.txt +-------------------------------------------------------------------- +Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: BSD-3-Clause + +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. + + +/pytorch/third_party/python-peachpy/LICENSE.rst +----------------------------------------------- +============================== +PeachPy license (2-clause BSD) +============================== + +Copyright (c) 2017, Facebook Inc. +Copyright (c) 2013-2017, Georgia Institute of Technology +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. + +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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/sigslot/LICENSE +------------------------------------------------------------------------ +License +The sigslot library has been placed in the public domain. This means that you are free to use it however you like. + +The author takes no responsibility or liability of any kind for any use that you may make of this library. + +If you screw up, it's your fault. + +If the library screws up, you got it for free, so you should have tested it better - it's still your responsibility. + +/pytorch/third_party/sleef/LICENSE.txt +-------------------------------------- +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +/pytorch/third_party/flatbuffers/swift/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. + + 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. + + +/pytorch/third_party/kineto/tb_plugin/LICENSE +--------------------------------------------- +BSD License + +For Kineto software + +Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. + +All contributions by Microsoft: +Copyright (c) Microsoft Corporation. (The Azure AI Platform team) + +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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/tensorflow-common/LICENSE.txt +-------------------------------------------------------------------------------------- +Copyright (c) Microsoft Corporation + +All rights reserved. + +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. + + +/pytorch/third_party/tensorpipe/LICENSE.txt +------------------------------------------- +BSD License + +For TensorPipe 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 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. + + +/pytorch/third_party/kineto/libkineto/third_party/dynolog/third_party/cpr/test/LICENSE +-------------------------------------------------------------------------------------- +This license applies to everything inside this directory and all +subdirectories. + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +/pytorch/third_party/opentelemetry-cpp/third_party/opentracing-cpp/3rd_party/include/opentracing/variant/LICENSE +---------------------------------------------------------------------------------------------------------------- +Copyright (c) MapBox +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 "MapBox" 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. + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/LICENSE.txt +-------------------------------------------------------------- +MIT License + +Copyright (c) Microsoft Corporation + +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. + + +/pytorch/third_party/opentelemetry-cpp/tools/vcpkg/ports/vulkan/LICENSE.txt +--------------------------------------------------------------------------- +/* +* +* 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. +*/ + + +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: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +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 +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 + +=============================================================================================================================================== + +/Copyright (C) 2012 LunarG, 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 LunarG 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 HOLDERS 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. + +=============================================================================================================================================== + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# Copyright 2007-2008 Miguel A. Figueroa-Villanueva +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright_cmake.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + + +============================================================================================================================================== + +// +// Copyright (C) 2015-2018 Google, Inc. +// Copyright (C) +// +// 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 3Dlabs Inc. Ltd. 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 HOLDERS 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. +// + +========================================================================================================================================== + +Note: This license has also been called the "New BSD License" or "Modified BSD License". See also the 2-clause BSD License. +Copyright +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. + + +========================================================================================================================================== + +/* +* xxHash - Fast Hash algorithm +* Copyright (C) 2012-2016, Yann Collet +* +* BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) +* +* 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. +* +* 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. +* +* You can contact the author at : +* - xxHash homepage: http://www.xxhash.com +* - xxHash source repository : https://github.com/Cyan4973/xxHash +*/ + + +=========================================================================================================================================== + +# Copyright (C) 2018 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 HOLDERS 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. + +========================================================================================================================================== + +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison implementation for Yacc-like parsers in C +Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains +part or all of the Bison parser skeleton and distribute that work +under terms of your choice, so long as that work isn't itself a +parser generator using the skeleton or a modified version thereof +as a parser skeleton. Alternatively, if you modify or redistribute +the parser skeleton itself, you may (at your option) remove this +special exception, which will cause the skeleton and the resulting +Bison output files to be licensed under the GNU General Public +License without this special exception. +This special exception was added by the Free Software Foundation in +version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by +simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid +infringing on user name space. This should be done even for local +variables, as they might otherwise be expanded by user macros. +There are some unavoidable exceptions within include files to +define necessary library symbols; they are noted "INFRINGES ON +USER NAME SPACE" below. */ + +============================================================================================================================================== + +copyright : [ +Copyright (c) 2017 The Khronos Group Inc., +, +Permission is hereby granted, free of charge, to any person obtaining a copy, +of this software and/or associated documentation files (the \Materials\"),", +to deal in the Materials without restriction, including without limitation, +the rights to use, copy, modify, merge, publish, distribute, sublicense,, +and/or sell copies of the Materials, and to permit persons to whom the, +Materials are 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 Materials., +, +MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS, +STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND, +HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ , +, +THE MATERIALS 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. 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 MATERIALS OR THE USE OR OTHER DEALINGS, +IN THE MATERIALS. + +============================================================================================================================================= + +CMake - Cross Platform Makefile Generator +Copyright 2000-2009 Kitware, Inc., Insight Software Consortium +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 names of Kitware, Inc., the Insight Software Consortium, +nor the names of their 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 above copyright and license notice applies to distributions of +CMake in source and binary form. Some source files contain additional +notices of original copyright by their contributors; see each source +for details. Third-party software packages supplied with CMake under +compatible licenses provide their own copyright notices documented in +corresponding subdirectories. + +------------------------------------------------------------------------------ + +CMake was initially developed by Kitware with the following sponsorship: + +* National Library of Medicine at the National Institutes of Health +as part of the Insight Segmentation and Registration Toolkit (ITK). + +* US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel +Visualization Initiative. + +* National Alliance for Medical Image Computing (NAMIC) is funded by the +National Institutes of Health through the NIH Roadmap for Medical Research, +Grant U54 EB005149. + +* Kitware, Inc. + +======================================================================================================================================== + +The authors of this software are Rob Pike and Ken Thompson. +* Copyright (c) 2002 by Lucent Technologies. +* Permission to use, copy, modify, and distribute this software for any +* purpose without fee is hereby granted, provided that this entire notice +* is included in all copies of any software which is or includes a copy +* or modification of this software and in all copies of the supporting +* documentation for such software. +* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED +* WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY +* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY +* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + + +======================================================================================================================================== + +Copyright (c) 2015-2018 Baldur Karlsson + +Copyright (c) 2014 Crytek + +Copyright (c) 1998-2018 Third party code and tools + +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. + +========================================================================================================================================= + +/* +Copyright (c) 2009 Dave Gamble +Copyright (c) 2015-2016 The Khronos Group Inc. +Copyright (c) 2015-2016 Valve Corporation +Copyright (c) 2015-2016 LunarG, 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. +*/ + +=========================================================================================================================================== + +Copyright (c) 2005 - 2017 G-Truc Creation + +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 JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: +http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +Copyright (c) 2007-2010 Baptiste Lepilleur +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. + +========================================================================================================================================== + +/** +* `murmurhash.h' - murmurhash +* +* copyright (c) 2014 joseph werle +* Copyright (c) 2015-2016 The Khronos Group Inc. +* Copyright (c) 2015-2016 Valve Corporation +* Copyright (c) 2015-2016 LunarG, Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and/or associated documentation files (the "Materials"), to +* deal in the Materials without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Materials, and to permit persons to whom the Materials are +* furnished to do so, subject to the following conditions: +* +* The above copyright notice(s) and this permission notice shall be included in +* all copies or substantial portions of the Materials. +* +* THE MATERIALS 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. +* +* 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 MATERIALS OR THE +* USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +========================================================================================================================================= + +Licenced as X11: http://www.kryogenix.org/code/browser/licence.html +This basically means: do what you want with it. + +========================================================================================================================================= + +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/common.hpp +/// @date 2013-12-24 / 2013-12-24 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + + +========================================================================================================================================== + +// LICENSE +// +// This software is in the public domain. Where that dedication is not +// recognized, you are granted a perpetual, irrevocable license to copy, +// distribute, and modify this file as you see fit. +// + +========================================================================================================================================== + +Simple DirectMedia Layer +Copyright (C) 1997-2018 Sam Lantinga + +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. + +========================================================================================================================================= + +/****************************************************************************\ +Copyright (c) 2002, NVIDIA Corporation. + +NVIDIA Corporation("NVIDIA") supplies this software to you in +consideration of your agreement to the following terms, and your use, +installation, modification or redistribution of this NVIDIA software +constitutes acceptance of these terms. If you do not agree with these +terms, please do not use, install, modify or redistribute this NVIDIA +software. + +In consideration of your agreement to abide by the following terms, and +subject to these terms, NVIDIA grants you a personal, non-exclusive +license, under NVIDIA's copyrights in this original NVIDIA software (the +NVIDIA Software), to use, reproduce, modify and redistribute the +NVIDIA Software, with or without modifications, in source and/or binary +forms; provided that if you redistribute the NVIDIA Software, you must +retain the copyright notice of NVIDIA, this notice and the following +text and disclaimers in all such redistributions of the NVIDIA Software. +Neither the name, trademarks, service marks nor logos of NVIDIA +Corporation may be used to endorse or promote products derived from the +NVIDIA Software without specific prior written permission from NVIDIA. +Except as expressly stated in this notice, no other rights or licenses +express or implied, are granted by NVIDIA herein, including but not +limited to any patent rights that may be infringed by your derivative +works or by other works in which the NVIDIA Software may be +incorporated. No hardware is licensed hereunder. + +THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER +PRODUCTS. + +IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, +INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY +OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE +NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, +TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF +NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\****************************************************************************/ + +================================================================================================================================================== + +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. + + +================================================================================================================================================== + +GNU LESSER GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. + +0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. + +"The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". + +The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: + +a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or +b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. +3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: + +a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the object code with a copy of the GNU GPL and this license document. +4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: + +a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the Combined Work with a copy of the GNU GPL and this license document. +c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. +d) Do one of the following: +0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. +1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. +e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) +5. Combined Libraries. + +You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. +b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. + + +torch-optimizer +Apache Software License +https://github.com/jettify/pytorch-optimizer +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 2020 Nikolay Novik (https://github.com/jettify) + + 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. + + + +torch_fidelity +Apache License 2.0 +https://www.github.com/toshas/torch-fidelity +Copyright 2020 Anton Obukhov + +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. + + +torchcodec +BSD 3-Clause License + +Copyright 2024 Meta + +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. + +UNKNOWN +BSD 3-Clause License + +Copyright 2024 Meta + +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. + + +torchdata +BSD License +https://github.com/pytorch/data +BSD 3-Clause License + +Copyright (c) 2021-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 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. + + +torchmetrics +Apache Software License +https://github.com/Lightning-AI/torchmetrics + 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 2020-2022 Lightning-AI team + + 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. + + +torchtitan +BSD 3-Clause License + +(c) Meta Platforms, Inc. and affiliates. + +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. + +UNKNOWN +BSD 3-Clause License + +(c) Meta Platforms, Inc. and affiliates. + +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. + + +torchvision +BSD +https://github.com/pytorch/vision +BSD 3-Clause License + +Copyright (c) Soumith Chintala 2016, +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 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. + + +tornado +Apache Software License +http://www.tornadoweb.org/ + + 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. + + +tqdm +MPL-2.0 AND MIT +https://tqdm.github.io +`tqdm` is a product of collaborative work. +Unless otherwise stated, all authors (see commit logs) retain copyright +for their respective work, and release the work under the MIT licence +(text below). + +Exceptions or notable authors are listed below +in reverse chronological order: + +* files: * + MPL-2.0 2015-2026 (c) Casper da Costa-Luis + [casperdcl](https://github.com/casperdcl). +* files: tqdm/_tqdm.py + MIT 2016 (c) [PR #96] on behalf of Google Inc. +* files: tqdm/_tqdm.py README.rst .gitignore + MIT 2013 (c) Noam Yorav-Raphael, original author. + +[PR #96]: https://github.com/tqdm/tqdm/pull/96 + + +Mozilla Public Licence (MPL) v. 2.0 - Exhibit A +----------------------------------------------- + +This Source Code Form is subject to the terms of the +Mozilla Public License, v. 2.0. +If a copy of the MPL was not distributed with this project, +You can obtain one at https://mozilla.org/MPL/2.0/. + + +MIT License (MIT) +----------------- + +Copyright (c) 2013 noamraph + +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. + + +traitlets +BSD License +https://github.com/ipython/traitlets +BSD 3-Clause License + +- Copyright (c) 2001-, IPython Development Team + +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. + + +transformer_engine +UNKNOWN +UNKNOWN + 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. + + + +transformers +Apache Software License +https://github.com/huggingface/transformers +Copyright 2018- The Hugging Face team. All rights reserved. + + 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. + + +trimesh +MIT License +https://github.com/mikedh/trimesh +The MIT License (MIT) + +Copyright (c) 2023 Michael Dawson-Haggerty + +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. + + +triton +MIT License +https://github.com/triton-lang/triton/ +/* +* Copyright 2018-2020 Philippe Tillet +* Copyright 2020-2022 OpenAI +* +* 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. +*/ + + +trove-classifiers +Apache Software License +https://github.com/pypa/trove-classifiers + 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. + + +typeguard +MIT +UNKNOWN +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright (c) Alex Grönholm + +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. + + +typer +MIT License +https://github.com/fastapi/typer +The MIT License (MIT) + +Copyright (c) 2019 Sebastián Ramírez + +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. + + +typing-inspect +MIT License +https://github.com/ilevkivskyi/typing_inspect +The MIT License (MIT) + +Copyright (c) 2017-2019 Ivan Levkivskyi + +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. + + +typing-inspection +MIT +https://github.com/pydantic/typing-inspection +MIT License + +Copyright (c) Pydantic Services Inc. 2025 to present + +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. + + +typing_extensions +PSF-2.0 +https://github.com/python/typing_extensions +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR 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 THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. + + +tyro +MIT License +UNKNOWN +MIT License + +Copyright (c) 2024 Brent Yi + +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. + + +tzdata +Apache-2.0 +https://github.com/python/tzdata +Apache Software License 2.0 + +Copyright (c) 2020, Paul Ganssle (Google) + +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. + + +uri-template +MIT License +https://gitlab.linss.com/open-source/python/uri-template +MIT License + +Copyright (c) 2020 Peter Linss + +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. + + +urllib3 +MIT +https://github.com/urllib3/urllib3/blob/main/CHANGES.rst +MIT License + +Copyright (c) 2008-2020 Andrey Petrov and 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. + + +userpath +MIT +https://github.com/ofek/userpath +MIT License + +Copyright (c) 2017-present Ofek Lev + +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. + + +uv +Apache Software License; MIT License +https://pypi.org/project/uv/ + 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. + + +uvicorn +BSD-3-Clause +https://uvicorn.dev/ +Copyright © 2017-present, [Encode OSS Ltd](https://www.encode.io/). +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 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. + + +uvloop +Apache Software License; MIT License +UNKNOWN +Copyright (C) 2016-present the uvloop authors and contributors. + + 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 (c) 2015-present MagicStack Inc. http://magic.io + + 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. + + +virtualenv +MIT +https://github.com/pypa/virtualenv +Copyright (c) 2020-202x The virtualenv developers + +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. + + +wandb +MIT License +https://github.com/wandb/wandb +MIT License + +Copyright (c) 2021 Weights and Biases, 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. + + +watchfiles +MIT License +https://github.com/samuelcolvin/watchfiles +The MIT License (MIT) + +Copyright (c) 2017 to present Samuel Colvin + +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. + + +wcmatch +MIT +https://github.com/facelessuser/wcmatch +MIT License + +Copyright (c) 2018 - 2025 Isaac Muse + +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. + + +webcolors +BSD License +UNKNOWN +Copyright (c) James Bennett, and contributors. +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 the author nor the names of other + 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. + + +webdataset +BSD-3-Clause +http://github.com/webdataset/webdataset +Copyright 2020 NVIDIA CORPORATION. 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. + + +webencodings +BSD License +https://github.com/SimonSapin/python-webencodings +UNKNOWN + +websocket-client +Apache Software License +https://github.com/websocket-client/websocket-client.git + + 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 2025 engn33r + + 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. + + + +websockets +BSD-3-Clause +https://github.com/python-websockets/websockets +Copyright (c) Aymeric Augustin and contributors + +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 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. + + +widgetsnbextension +BSD License +http://jupyter.org +Copyright (c) 2015 Project Jupyter Contributors +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. + + +wrapt +BSD License +https://github.com/GrahamDumpleton/wrapt +Copyright (c) 2013-2023, Graham Dumpleton +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. + +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. + + +xatlas +MIT License + + Copyright (c) 2021 Markus Worchel + + 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. + +https://github.com/mworchel/xatlas-python +MIT License + +Copyright (c) 2021 Markus Worchel + +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. + + +xattr +MIT +https://github.com/xattr/xattr +This is the MIT license. This software may also be distributed under the same terms as Python (the PSF license). + +Copyright (c) 2004 Bob Ippolito. + +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. + + +xmltodict +MIT +https://github.com/martinblech/xmltodict +Copyright (C) 2012 Martin Blech and individual 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. + + +xxhash +BSD License +https://github.com/ifduyue/python-xxhash +Copyright (c) 2014-2024, Yue Du +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. + +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. + + +yacs +Apache Software License +https://github.com/rbgirshick/yacs +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. + + +yarl +Apache-2.0 +https://github.com/aio-libs/yarl + + 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. + + +zarr +MIT +https://github.com/zarr-developers/zarr-python +The MIT License (MIT) + +Copyright (c) 2015-2025 Zarr Developers + +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. + + +zipp +MIT +https://github.com/jaraco/zipp +MIT License + +Copyright (c) 2025 + +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/releases/bridge-native-v3/code/LICENSE b/releases/bridge-native-v3/code/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..a5b8c94f0e6853b91b841725be0832f5ffc93ea4 --- /dev/null +++ b/releases/bridge-native-v3/code/LICENSE @@ -0,0 +1,52 @@ +Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + + +OpenMDW License Agreement, version 1.1 (OpenMDW-1.1) + +By exercising rights granted to you under this agreement, you accept and agree +to its terms. + +As used in this agreement, "Model Materials" means the materials provided to +you under this agreement, consisting of: (1) one or more machine learning +models (including architecture and parameters); and (2) all related artifacts +(including associated data, documentation and software) that are provided to +you hereunder. + +Subject to your compliance with this agreement, permission is hereby granted, +free of charge, to deal in the Model Materials without restriction, including +under all copyright, patent, database, and trade secret rights included or +embodied therein. + +If you distribute any portion of the Model Materials, you shall retain in your +distribution (1) a copy of this agreement, and (2) all copyright notices and +other notices of origin included in the Model Materials that are applicable to +your distribution. + +If you file, maintain, or voluntarily participate in a lawsuit against any +person or entity asserting that the Model Materials directly or indirectly +infringe any patent or copyright, then all rights and grants made to you +hereunder are terminated, unless that lawsuit was in response to a +corresponding lawsuit first brought against you. + +This agreement does not impose any restrictions or obligations with respect to +any use, modification, or sharing of any outputs generated by using the Model +Materials. + +THE MODEL MATERIALS 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, TITLE, NONINFRINGEMENT, ACCURACY, OR THE +ABSENCE OF LATENT OR OTHER DEFECTS OR ERRORS, WHETHER OR NOT DISCOVERABLE, ALL +TO THE GREATEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW. + +YOU ARE SOLELY RESPONSIBLE FOR (1) CLEARING RIGHTS OF OTHER PERSONS THAT MAY +APPLY TO THE MODEL MATERIALS OR ANY USE THEREOF, INCLUDING WITHOUT LIMITATION +ANY PERSON'S COPYRIGHTS OR OTHER RIGHTS INCLUDED OR EMBODIED IN THE MODEL +MATERIALS; (2) OBTAINING ANY NECESSARY CONSENTS, PERMISSIONS OR OTHER RIGHTS +REQUIRED FOR ANY USE OF THE MODEL MATERIALS; OR (3) PERFORMING ANY DUE +DILIGENCE OR UNDERTAKING ANY OTHER INVESTIGATIONS INTO THE MODEL MATERIALS OR +ANYTHING INCORPORATED OR EMBODIED THEREIN. + +IN NO EVENT SHALL THE PROVIDERS OF THE MODEL MATERIALS 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 MODEL MATERIALS, THE +USE THEREOF OR OTHER DEALINGS THEREIN. diff --git a/releases/bridge-native-v3/code/NOTICE b/releases/bridge-native-v3/code/NOTICE new file mode 100644 index 0000000000000000000000000000000000000000..1e1f5ad25e5d28e0ae6aeb9804b02ad4cd9cc482 --- /dev/null +++ b/releases/bridge-native-v3/code/NOTICE @@ -0,0 +1,54 @@ +Cosmos + +Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. + +This file contains attribution notices for third-party source code that is +adapted, copied, or vendored in this repository. Dependency notices are listed +separately in ATTRIBUTIONS.md. + +HuggingFace Transformers / Qwen +Source: https://github.com/huggingface/transformers +License: Apache-2.0 +Notices: + Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. + Copyright 2025 The Qwen team, Alibaba Group and the HuggingFace Inc. team. + Copyright 2025 The Qwen Team and The HuggingFace Inc. team. + Copyright 2025 HuggingFace Inc. team. +Files: + cosmos_framework/model/generator/vlm/qwen3_vl/configuration_qwen3_vl.py + cosmos_framework/model/generator/vlm/qwen3_vl/qwen3_vl.py + cosmos_framework/model/generator/vlm/qwen3_vl/utils.py + cosmos_framework/model/generator/vlm/qwen3_vl/video_processing_qwen3_vl.py + +ByteDance-Seed Bagel / Qwen2 tokenizer +Source: https://github.com/ByteDance-Seed/Bagel +License: Apache-2.0 +Notice: + Copyright 2024 The Qwen Team and The HuggingFace Inc. team. +File: + cosmos_framework/model/generator/tokenizers/tokenization_qwen2.py + +HuggingFace Diffusers UniPC scheduler +Source: https://github.com/huggingface/diffusers +License: Apache-2.0 +Notices: + Copyright 2024 TSAIL Team and The HuggingFace Team. All rights reserved. + Copyright 2024-2025 The Alibaba Wan Team Authors. All rights reserved. +File: + cosmos_framework/model/generator/diffusion/samplers/fm_solvers_unipc.py + +Detectron2 lazy config helpers +Source: https://github.com/facebookresearch/detectron2 +License: Apache-2.0 +Notice: + Copyright (c) Facebook, Inc. and its affiliates. +File: + cosmos_framework/utils/lazy_config/__init__.py + +TaylorSeer +Source: https://github.com/Shenyi-Z/TaylorSeer +License: GPL-3.0 +Notice: + Upstream source files do not contain an explicit copyright notice. +Files: + cosmos_framework/model/generator/utils/taylorseer.py diff --git a/releases/bridge-native-v3/code/README.md b/releases/bridge-native-v3/code/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0948c0bfa410ce735cedd2efe413b125fbfd078c --- /dev/null +++ b/releases/bridge-native-v3/code/README.md @@ -0,0 +1,142 @@ +# zeva + +**In-Context Causal Learning for Generalizable Embodied Manipulation** + +[Project page](https://air-embodied-brain.github.io/Zeva) · +[Model weights](https://huggingface.co/chen123fu/zeva) · +[Atomic5 reproduction](docs/reproduce.md) · +[Cross-attempt reproduction](docs/zeva_pim.md) + +--- + +## Overview + +zeva enables a frozen robot policy to learn from its own physical interaction +experience at deployment time. Instead of updating model parameters, zeva +extracts action-induced state changes, stores them in a dual-timescale causal +memory, and retrieves relevant interaction evidence as context for subsequent +actions. + +![zeva overview](assets/zeva_overview.png) + +## Method + +zeva implements **In-Context Causal Learning (ICCL)** in three parts: + +1. **Causal Interaction Extraction.** A Causal Transition Encoder (CTE) + integrates visual state, executed action, and observed state change. It + produces a phase token \(p_\tau\) and a causal interaction signal + \(e_\tau\). CTE is trained with causal-effect prediction, task-identity + clustering, and phase-progression objectives. +2. **Dual-timescale Causal Memory.** A Brief Interaction Trace (BIT) retains + recent evidence within an attempt, while Persistent Interaction Memory (PIM) + consolidates phase/effect evidence across attempts in the same episode. +3. **In-Context Policy Injection.** Phase-conditioned retrieval selects relevant + PIM entries. A memory encoder fuses the task, current phase, BIT, and retrieved + PIM evidence into a Causal Prompt \(M_\tau\) for the diffusion policy. + +> [!IMPORTANT] +> During deployment, all neural parameters remain frozen. Only BIT and PIM are +> updated online. + +## Installation + +zeva is released as an overlay for +[NVIDIA Cosmos Framework](https://github.com/NVIDIA/cosmos-framework) at commit +`ee58e41467f33c49ddde08b4d0ef4923876a95ac`. + +```bash +git clone https://github.com/NVIDIA/cosmos-framework.git +cd cosmos-framework +git checkout ee58e41467f33c49ddde08b4d0ef4923876a95ac +cd .. + +git clone https://github.com/dsdfasfaac/zeva-test.git zeva +rsync -a --exclude=.git --exclude=README.md zeva/ cosmos-framework/ +cd cosmos-framework +``` + +Install the remaining Cosmos Framework dependencies following the upstream +[setup instructions](https://github.com/NVIDIA/cosmos-framework/blob/main/docs/setup.md). + +## Reproduction + +> [!NOTE] +> The released checkpoint was trained on success-only trajectories and +> evaluated without cross-attempt self-evolution. Its benchmark success rate +> therefore measures the frozen policy rather than improvement from accumulated +> PIM experience. + +### Atomic5 benchmark reproduction + +Follow [docs/reproduce.md](docs/reproduce.md) to start the frozen policy server +and reproduce the locked five-task evaluation. The released protocol uses a +32-action horizon, 30 UniPC steps, guidance 3.0, shift 5.0, and no retries. + +### Fixed-seed cross-attempt evolution + +Follow [docs/zeva_pim.md](docs/zeva_pim.md) to run PIM-enabled evaluation on a +fixed episode. Each case below was reproduced twice from empty PIM; `F` denotes +failure and `S` denotes success. + +> [!NOTE] +> The current release includes these reproducible case studies. + +| Task | Seed | Attempt sequence | +| --- | ---: | --- | +| OpenStandMixerHead | 199 | `FSSSS` | +| TurnOnElectricKettle | 197 | `FSSSSS` | +| CloseToasterOvenDoor | 199 | `FFFSSSSSSSS` | +| TurnOnMicrowave | 200 | `FFFFSSSS` | +| CoffeeSetupMug | 204 | `FFFFFFFFFSSSS` | + +Validate an exported pair of runs with: + +```bash +python experiment_manifests/verify_pim_evolve_case.py \ + --first /path/to/first_run \ + --repeat /path/to/repeat_run \ + --task TurnOnElectricKettle \ + --seed 197 +``` + +## Repository layout + +| Path | Description | +| --- | --- | +| `cosmos_framework/model/zeva/` | CTE, BIT, PIM, retrieval, Causal Prompt, and policy injection | +| `cosmos_framework/scripts/` | Policy servers and RoboCasa365 evaluators | +| `experiment_manifests/` | Locked evaluation and verification utilities | +| `examples/` | Training launchers and experiment configurations | +| `docs/reproduce.md` | Atomic5 reproduction protocol | +| `docs/zeva_pim.md` | PIM and cross-attempt case studies | + +## Citation + +If you find this work useful, please cite: + +```bibtex +@misc{zeva2026, + title={Zeva: In-Context Causal Learning for Generalizable Embodied Manipulation}, + author={Fu Chen, Xin Ding, Bingjia Huang, Xiangyu Li, Mingju Wang, Jiawei He, Kun Li, Wei Sun, Yunxin Liu, Hao Wu, Ting Cao}, + howpublished={\url{https://air-embodied-brain.github.io/Zeva}}, + year={2026}, +} +``` + +## Acknowledgements + +zeva builds on the following open-source projects: + +- [NVIDIA Cosmos Framework](https://github.com/NVIDIA/cosmos-framework) +- [RoboCasa365](https://github.com/robocasa/robocasa) +- [BehaviorVLA](https://github.com/iLearn-Lab/ICML26-BehaviorVLA) + +Please follow the licenses and citation requirements of all external models, +datasets, simulators, and software dependencies. + +## License + +This repository is released under the included [OpenMDW-1.1 license](LICENSE). +External models, datasets, and simulators remain subject to their respective +licenses. diff --git a/releases/bridge-native-v3/code/configs/bridge_stage2_native_contract.json b/releases/bridge-native-v3/code/configs/bridge_stage2_native_contract.json new file mode 100644 index 0000000000000000000000000000000000000000..827f7955f2c21be35e2a0af7e5944c3eacf71182 --- /dev/null +++ b/releases/bridge-native-v3/code/configs/bridge_stage2_native_contract.json @@ -0,0 +1,47 @@ +{ + "schema": "bridge_native_stage2_design_v1", + "implementation_status": "IMPLEMENTED_GPU_VALIDATION_NOT_RUN", + "entrypoint": "python -m scripts.run_bridge_stage2_native", + "base_repo": "nvidia/Cosmos3-Nano", + "base_revision": "e59a53c25979a090fa8706c9acc0c254a6e89b92", + "framework_revision": "ee58e41467f33c49ddde08b4d0ef4923876a95ac", + "dataset_repo": "IPEC-COMMUNITY/bridge_orig_lerobot", + "dataset_revision": "0e9d76d07e9df3ea3eba257b2520d4913833fad2", + "domain_name": "bridge_orig_lerobot", + "domain_id": 7, + "policy_action_dim": 10, + "policy_gripper_index": 9, + "cte_action_dim": 7, + "cte_gripper_index": 6, + "proprio_dim": 10, + "policy_horizon": 32, + "expected_model_action_dim": 64, + "model_action_dim_source": "runtime configuration AND constructed action projections", + "global_dim": 256, + "phase_dim": 128, + "effect_dim": 128, + "effect_history_length": 4, + "boundary_controls": 4, + "completed_effect_controls": 16, + "cte_preprocess_id": "bridge_cte_image0_rgb_singleframe_256_bf16_wan22_v1", + "cte_normalizer_id": "bridge_reached_delta_legacy_quantile_v0", + "policy_normalizer": "NVIDIA bridge_orig_lerobot native10 quantile (unclipped)", + "proprio_normalizer": null, + "cte_source_step": 30000, + "static_bank_entries": 3000, + "retrieval": {"readout": "frozen Nano understanding-only image+instruction prefill", "head_dimensions": [4096, 1024, 128], "head_status": "NOT_TRAINED", "top_k": 5, "temperature": 0.07}, + "learning_rates": {"generation": 0.00002, "action": 0.0001, "zeva": 0.00003}, + "frozen": ["shared_reasoner", "shared_understanding", "semantic_vision_encoder", "Wan_VAE", "Bridge_CTE", "bank", "retrieval_head_after_training"], + "train_generation": ["moe_gen", "time_embedder", "vae2llm", "llm2vae"], + "train_action": ["action2llm_domain7", "llm2action_domain7", "action_modality_embed_shared"], + "train_zeva": ["proprio_projector_and_gate", "behavior_pbd", "behavior_adapter", "behavior_global_projector", "phase_effect_receivers"], + "action_table_weight_decay": 0.0, + "domain7_initialization": "original Nano checkpoint tensors; never reinitialize", + "other_domain_max_absolute_diff": 0.0, + "losses": {"mode": "wam", "vision_weight": 1.0, "action_weight": 10.0, "pbd_weight": 0.01, "ignore_tail_padding": true}, + "gates": {"train_episodes": 32, "development_episodes": 8, "smoke_optimizer_steps": 50, "fit_optimizer_steps": 500, "both_required_before_continuous": true}, + "checkpoint": {"save_every_optimizer_steps": 10000, "automatic_deletion": false, "save_frozen_base": false, "save_optimizer_and_data_cursor": true}, + "forbidden_initialization": ["Cosmos3-Nano-Policy-DROID", "ZeVA RoboCasa Stage2", "RoboCasa Atomic5", "old ipec_full delta", "old Bridge 7D policy", "old optimizer state"], + "no_full_dataset_feature_cache": true, + "seed": 20260926 +} diff --git a/releases/bridge-native-v3/code/cosmos_framework/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d5797e4424ef46ecae377d615d70c2c7638af002 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/__init__.py @@ -0,0 +1,3 @@ +"""Zeva overlay package; extend imports to the upstream Cosmos framework.""" +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/config.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/config.py new file mode 100644 index 0000000000000000000000000000000000000000..7a45714689783cf9446d35ce43b8d92301971e05 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/config.py @@ -0,0 +1,109 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +from typing import Any, List + +import attrs + +from cosmos_framework.trainer import ImaginaireTrainer as Trainer +from cosmos_framework.utils import config + + +@attrs.define(slots=False) +class DataSetting: + """Configuration for data. + + Attributes: + qwen_max_video_token_length: Maximum video token length. + qwen_target_fps: Target fps for video sampling. + text_chat_order: Order of text items in user messages. + """ + + qwen_max_video_token_length: int = 8192 + + +@attrs.define(slots=False) +class Config(config.Config): + data_setting: DataSetting = attrs.field(factory=DataSetting) + defaults: List[Any] = attrs.field( + factory=lambda: [ + "_self_", + {"model": "mot_fsdp"}, + {"data_train": None}, + {"data_val": None}, + {"optimizer": "adamw"}, + {"scheduler": "warmup_cosine_lr"}, + {"checkpoint": "s3"}, + {"callbacks": ["basic", "optimization", "job_monitor", "generation"]}, + {"ema": "power"}, + {"tokenizer": "wan2pt2_tokenizer"}, + {"sound_tokenizer": None}, # Optional: for audio-video generation + {"vlm_config": None}, + {"ckpt_type": "dcp"}, + {"experiment": None}, + ] + ) + + +def make_config() -> Config: + c = Config( + model=None, + optimizer=None, + scheduler=None, + dataloader_train=None, + dataloader_val=None, + ) + + # Specifying values through instances of attrs + c.job.project = "cosmos3_vfm" + c.job.group = "debug" + c.job.name = "delete_${now:%Y-%m-%d}_${now:%H-%M-%S}" + + c.trainer.type = Trainer + c.trainer.straggler_detection.enabled = False + c.trainer.max_iter = 400_000 + c.trainer.logging_iter = 20 + c.trainer.validation_iter = 100 + c.trainer.run_validation = False + c.trainer.callbacks = None + + c.upload_reproducible_setup = False + + from cosmos_framework.configs.base.defaults.callbacks import register_callbacks + from cosmos_framework.configs.base.defaults.checkpointer import register_checkpoint, register_ckpt_type + from cosmos_framework.configs.base.defaults.ema import register_ema + + # from cosmos_framework.configs.base.defaults.data import register_data + from cosmos_framework.configs.base.defaults.model import register_model + from cosmos_framework.configs.base.defaults.optimizer import register_optimizer, register_scheduler + from cosmos_framework.configs.base.defaults.tokenizer import register_sound_tokenizer, register_tokenizer + from cosmos_framework.configs.base.defaults.reasoner import register_vlm + + # Call this function to register config groups for advanced overriding. the order follows the default config groups + # register_data() + register_model() + register_checkpoint() + register_ckpt_type() + register_optimizer() + register_scheduler() + register_callbacks() + register_tokenizer() + register_sound_tokenizer() + register_ema() + register_vlm() + + # Register shipped experiments explicitly. (vision_sft_nano also defines + # vision_sft_nano_mapstyle_dataloader — the CosmosDataLoader variant — in the same module.) + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_droid_nano # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva_transition_memory # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva_pim # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva_pim_inference # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_libero_all_nano # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_libero_nano # noqa: F401 + import cosmos_framework.configs.base.experiment.action.posttrain_config.action_fd_droid_posttrain # noqa: F401 + import cosmos_framework.configs.base.experiment.sft.vision_sft_nano # noqa: F401 + import cosmos_framework.configs.base.experiment.sft.vision_sft_super # noqa: F401 + import cosmos_framework.configs.base.experiment.sft.vision_sft_edge # noqa: F401 + + return c diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/defaults/model_config.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/defaults/model_config.py new file mode 100644 index 0000000000000000000000000000000000000000..09c14f08948829dc8fff93ebcefe57b1baf19944 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/defaults/model_config.py @@ -0,0 +1,380 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +from typing import Any + +import attrs + +from cosmos_framework.utils.lazy_config import LazyDict +from cosmos_framework.configs.base.defaults.activation_checkpointing import ActivationCheckpointingConfig +from cosmos_framework.configs.base.defaults.compile import CompileConfig +from cosmos_framework.configs.base.defaults.ema import EMAConfig +from cosmos_framework.configs.base.defaults.parallelism import ParallelismConfig +from cosmos_framework.configs.base.defaults.reasoner import VLMConfig + + +@attrs.define(slots=False) +class DiffusionExpertConfig: + # This determines the range of timesteps before the fourier feature embedding is applied. + timestep_range: float = 1.0 + # Whether to load the generation pathway weights from pretrained LLM/VLM weights. + load_weights_from_pretrained: bool = True + + patch_spatial: int = 2 + max_vae_latent_side_after_patchify: int = ( + 20 # Max dimension (h or w) of the VAE latent after patchification (320/(8*2)) + ) + # Vision/action/sound position information is always provided through + # Qwen3VL-style 3D mRoPE attention IDs. + enable_fps_modulation: bool = False + base_fps: int = 24 + # Base temporal compression factor for SOUND m-RoPE. None = current behavior + # (sound advances at base_fps positions/sec). Set to the vision tcf (4) to put + # sound on the same latent-frame temporal grid as vision/action. + sound_base_temporal_compression_factor: int | None = None + # Temporal coordinates used for unified_3d_mrope vision tokens. + # - "latent_index": legacy behavior, positions are 0, 1, ..., T_latent-1. + # - "uniae_source_right_edge": use UniAE padded-patch right-edge source-frame coordinates. + vision_temporal_position_mode: str = "latent_index" + # For unified_3d_mrope: whether spatial (H, W) indices reset to 0 for each vision segment + unified_3d_mrope_reset_spatial_ids: bool = True + # Setting the temporal gap on the boundary of the different modalities, default is 0, using a value greater than 0 will add an additional offset on the accumulated temporal offset. + unified_3d_mrope_temporal_modality_margin: int = 0 + + +@attrs.define(slots=False) +class LBLConfig: + # For load balancing loss computation. + # - "local": Use the fraction of tokens routed to each expert only for the local rank. + # - "global": Use the fraction of tokens routed to each expert across all ranks. + method: str = "local" + + # Coefficients for the load balancing loss. + # - "und": Coefficient for the load balancing loss for the "und" pathway. + # - "gen": Coefficient for the load balancing loss for the "gen" pathway. + coeff_und: float | None = None + coeff_gen: float | None = None + + +@attrs.define(slots=False) +class RectifiedFlowTrainingConfig: + shift: Any = 5 # Training time shift. If dict, maps resolution (str) to shift value (int) + use_dynamic_shift: bool = False # Whether to use dynamic shifting + train_time_image_distribution: str = "logitnormal" # Training time distribution for images + train_time_video_distribution: str = "logitnormal" # Training time distribution for videos + train_time_action_distribution: str = "logitnormal" # Training time distribution for actions + train_time_sound_distribution: str = "logitnormal" # Training time distribution for sound + train_time_weight: str = "uniform" # Training time weight + loss_scale: float = 1.0 # Loss scale + image_loss_scale: float | None = None # If set, overrides loss_scale for images + sound_loss_scale: float | None = None # If set, overrides loss_scale for sound + use_discrete_rf: bool = False # Whether to use discrete formulation of rectified flow + + # user: please adjust this value according to loss_scale to balance the action loss with the video loss. + # default is 10.0 to align with previous training settings. + action_loss_weight: float = 10.0 + + # Independent noise schedule for action. When False (default), action shares the sigma + # sampled from the vision RF on every step — legacy behavior. When True, action samples + # its own sigma from `rectified_flow_action` using `shift_action`. Action always uses a + # shared scalar sigma per sample ([B,1]), independent of vision's DF mode. + independent_action_schedule: bool = False + shift_action: int | None = None # must be int; None → inherit `shift` (which must also be int) + + # Independent noise schedule for sound. When False (default), sound shares the vision + # sigma schedule, reindexed to the dense audio-bearing subset. When True, sound samples + # its own scalar sigma per sample ([B,1]) from `rectified_flow_sound` using `shift_sound`. + independent_sound_schedule: bool = False + shift_sound: int | None = None # must be int; None → inherit `shift` (which must also be int) + + # When True, per-instance flow-matching loss is normalized by the count of + # active (noisy) elements rather than all elements — preserves sum/active_count + # semantics so conditioning-heavy samples (e.g. I2V, forward_dynamics, diffusion + # forcing, AR rollout teacher-forcing) contribute gradient on par with K=0 + # samples. With .mean() the gradient of a K-conditioned sample is scaled by + # (T-K)/T, which undertrains the attend-to-clean-history dynamics. Kept + # False by default to preserve legacy loss magnitudes; enable for AR/DF training. + normalize_loss_by_active: bool = False + + # Sample-level (vs rank-level) loss averaging for the vision modality. + # + # By default the vision loss on each rank is a mean over that rank's samples, and + # FSDP/DDP averages gradients across ranks — so every *rank* contributes equally + # regardless of how many image/video samples it holds ("rank-level averaging"). + # When ranks carry different sample counts this over-weights samples on sparse ranks. + # + # When True, the loss is renormalized so every *sample* contributes equally across + # the whole data-parallel group: each iteration all-reduces the total number of image + # and video samples over the DP group, and image and video losses are each normalized + # by their own global sample count and then summed. This counteracts the framework's + # rank-level gradient averaging so the effective objective is a true per-sample mean. + # The two independently normalized terms are weighted by the existing `image_loss_scale` + # (images; falls back to `loss_scale` when None) and `loss_scale` (videos), so their + # balance is tuned with the same knobs as the legacy rank-level path. + sample_level_loss_averaging: bool = False + + +@attrs.define(slots=False) +class ZevaPolicyConfig: + """Configuration for Zeva causal-context policy conditioning. + + Data paths intentionally live in the dataset recipe. This model config only + describes the learned policy-injection prior and is disabled by default, preserving + every existing Cosmos recipe. + """ + + enabled: bool = False + global_dim: int = 256 + phase_dim: int = 128 + # Ordered causal observed-effect history from Stage-1 effect-v3. + effect_dim: int = 128 + effect_history_length: int = 4 + action_dim: int = 8 + horizon: int = 32 + num_anchors: int = 8 + hidden_dim: int = 256 + num_heads: int = 4 + prior_loss_weight: float = 0.01 + prior_dropout_rate: float = 0.4 + prior_inference_guidance_scale: float = 0.5 + global_prefix_tokens: int = 1 + # Number of leading action tokens that encode a clean initial state rather + # than policy commands. DROID/RoboTwin use one; RoboCasa365 uses zero + # because its 16-D proprio state is not isomorphic to its 12-D action. + leading_condition_steps: int = 1 + # Optional same-task-session transition context. The context is already + # encoded by TransitionMemoryEncoder before entering the model. + online_memory_enabled: bool = False + online_context_dim: int = 256 + online_prefix_tokens: int = 1 + # Paper-aligned Persistent Interaction Memory. PIM is injected as a + # gated residual into the existing global-behavior prefix, so enabling the + # module with gate_init=0 preserves the verified Stage-2 forward exactly. + pim_memory_enabled: bool = False + pim_persistent_length: int = 4 + pim_context_dim: int = 256 + pim_gate_init: float = 0.0 + # Static inference-only kill switch. The PIM modules remain instantiated + # and load their trained weights, but the forward takes the original + # Stage-2 prefix path without executing the PIM adapter. This is stronger + # than an empty validity mask because it also preserves the compiled graph + # used by the frozen base policy. + pim_force_bypass: bool = False + + +# Serialized releases may still reference this fully qualified type name. +BehaviorStage2Config = ZevaPolicyConfig + + +@attrs.define(slots=False) +class ProprioConditionConfig: + """Optional low-dimensional robot-state prefix for action policies.""" + + enabled: bool = False + input_dim: int = 16 + prefix_tokens: int = 1 + + +@attrs.define(slots=False) +class RectifiedFlowInferenceConfig: + scheduler_type: str = "unipc" # Scheduler type + num_train_timesteps: int = 1000 + shift: int = 1 + use_dynamic_shifting: bool = False + + +@attrs.define(slots=False) +class FixedStepSamplerConfig: + """Config for the fixed-step sampler used by distilled models. + + Uses a fixed sigma schedule instead of a smooth multi-step solver. + + Mirrors the constructor args of ``FixedStepSampler``. + """ + + # Discrete noise-level schedule (descending, excluding the final 0.0 step). + # Convention: exclude the final 0.0 step — FixedStepSampler appends it automatically. + # Values must be descending. Using 0.999 instead of 1.0 avoids numeric edge cases at sigma=1. + t_list: list[float] = [0.999, 0.75, 0.5, 0.25] + # Distilled fixed-step sampling uses stochastic re-noising at each step. + sample_type: str = "sde" + + +# Don't have any defaults and init only in config file. +@attrs.define(slots=False) +class OmniMoTModelConfig: + """ + Config for Omni MoT model. + """ + + tokenizer: LazyDict = None + load_vision_tokenizer: bool = True + """Instantiate the vision tokenizer. + + Reasoner-only inference disables this to avoid loading the generation VAE. + """ + net: LazyDict = None + ema: EMAConfig = EMAConfig() + + # Parallelism (CP, CFGP, FSDP, DP) and FSDP reduce-dtype configuration. + parallelism: ParallelismConfig = ParallelismConfig() + + # torch.compile knobs (enabled, compiled_region, dynamic, ...). + compile: CompileConfig = CompileConfig() + + # Activation-checkpointing policy (trade-off between memory and speed). + activation_checkpointing: ActivationCheckpointingConfig = ActivationCheckpointingConfig() + + # Model parameter / activation dtype (consumed by MixedPrecisionPolicy and + # ``model.precision`` for LowPrecisionCallback). One of "bfloat16", + # "float16", "float32". + precision: str = "bfloat16" + + # LoRA (parameter-efficient fine-tuning). When `lora_enabled=True`, + # `OmniMoTModel.build_net` injects custom LoRA adapters BEFORE FSDP wrap on + # the meta-device network, then re-initializes lora_A/lora_B after + # to_empty + init_weights. Pair with `optimizer.keys_to_select=["lora_"]` + # and `checkpoint.keys_to_skip_loading=[..., "lora_"]`. + lora_enabled: bool = False + lora_rank: int = 16 + lora_alpha: int = 32 + lora_target_modules: str = "q_proj_moe_gen,k_proj_moe_gen,v_proj_moe_gen,o_proj_moe_gen" + # Optional base-policy teacher anchor for LoRA post-training. The teacher + # is the same frozen network with adapters temporarily disabled, so this + # does not allocate a second copy of the model. The coefficient is applied + # in the same units as action_loss_weight; zero preserves legacy behavior. + lora_teacher_anchor_weight: float = 0.0 + lora_teacher_anchor_data_key: str = "teacher_anchor_weight" + + # Frozen-base action correction expert. When enabled, ``build_net`` + # freezes every base parameter and trains only the zero-initialized + # ``action_residual_head``. The head is never merged into the base. + residual_expert: dict[str, Any] = attrs.Factory(dict) + + # R3 correction-policy controls. These are intentionally kept in the + # model config (rather than in the serving request) so an exported policy + # is a single always-on model: no phase/predicate/task router is required + # at inference time. ``event_weighted`` only changes the training loss. + r3_event_weighted: bool = False + r3_event_weight: float = 2.0 + r3_task_weight_key: str = "r3_task_weight" + r3_event_weight_key: str = "residual_release_event" + + # Rectified flow configs + rectified_flow_training_config: RectifiedFlowTrainingConfig = RectifiedFlowTrainingConfig() + rectified_flow_inference_config: RectifiedFlowInferenceConfig = RectifiedFlowInferenceConfig() + # The field name is serialized in released configs; the type and all new + # public APIs use the Zeva paper terminology. + behavior_stage2: ZevaPolicyConfig = ZevaPolicyConfig() + proprio_condition: ProprioConditionConfig = ProprioConditionConfig() + + # Optional fixed-step sampler for distilled models (None for base models). + fixed_step_sampler_config: FixedStepSamplerConfig | None = None + + # Model configs + vlm_config: VLMConfig = VLMConfig() + diffusion_expert_config: DiffusionExpertConfig = DiffusionExpertConfig() + # Training data keys + input_video_key: str = "video" + input_image_key: str = "images" # key to fetch input image from data_batch + input_caption_key: str = "ai_caption" # Key used to fetch input captions + + # State and sequence shapes + state_ch: int = 16 # for latent model, ref to the latent channel number + state_t: int = 8 # for latent model, ref to the latent number of frames + latent_downsample_factor: int = 8 + resolution: str = "512" + max_num_tokens_after_packing: int = 13312 # Final num tokens after sequence packing + + # Attention implementation for joint understanding + generation + # Note "two_way" and "three_way" disallow and remove "End-of-Vision" or other text token in the generation tower. + # "three_way" must only be used when introducing sparsity + joint_attn_implementation: str = "two_way" # "two_way" or "three_way" + + # Per-layer NATTEN parameters + # Must use "three_way" attention if used. + # If None, all attention layers remain dense. + # If not None, must be a list exactly the size of number of layers, and each layer can be either + # None (dense) or a dictionary, with at least 'kernel_size' or 'kernel_size_float' keys + # specifying sparsity. NATTEN parameters 'dilation' and 'stride' may also be specified either as + # static integers, or as floating point values that will be mapped to their domain during + # runtime. Integer parameters should never be mixed with floating point ones. + # + # Floating point parameters are highly recommended, unless the use case will have a fixed token + # layout (input resolution). + # + # Examples: + # Interleaved sliding window layers, "GPT-OSS"-style, with static window size: + # natten_parameter_list = [None if layer_idx % 2 != 0 else {"kernel_size": (8, 8)}] + # Layers with odd indices ("None"s) will use dense attention, and layers with an even indices + # will use a static sliding window size of 8x8. + # + # Interleaved sliding window layers, "GPT-OSS"-style, with input-dependent window size: + # natten_parameter_list = [None if layer_idx % 2 != 0 else {"kernel_size_float": (0.5, 0.5)}] + # Layers with odd indices ("None"s) will use dense attention, and layers with an even indices + # will use a dynamic window size that is 50% of the input along each of the two dimensions. + # + # Interleaved sliding window and dilated layers, "DiNAT"-style: + # natten_parameter_list = [ + # { + # "kernel_size_float": (0.5, 0.5), + # "dilation_float": (1.0, 1.0), + # } if layer_idx % 2 != 0 else { + # "kernel_size_float": (0.5, 0.5), + # } + # ] + # All layers will use a dynamic window size that is 50% of the input along each of the two + # dimensions. Layers with odd indices will also dilate to the maximum level possible. + # + natten_parameter_list: list | None = None + + # Temporal causality for training autoregressive video generation models. + # When enabled, applies temporal causal attention to generation supertokens. + # Each supertoken is num_action_tokens_per_supertoken action tokens followed + # by H*W vision tokens; the value is stamped onto the packed sequence by the + # temporal-causal packer and read by attention/KV-cache code unchanged. + # Only supports image2video modes (with or without actions). + # Requires joint_attn_implementation="three_way". + video_temporal_causal: bool = False + # "none": standard joint denoising (shared σ, no clean context) + # "teacher_forcing": all frames noised with shared σ; clean history via cross-attention + # "diffusion_forcing": each latent frame gets independent σ ~ Uniform[0,1] + # "teacher_forcing_dcm": replayed teacher-forcing discrete-time consistency distillation + causal_training_strategy: str = attrs.field( + default="none", + validator=attrs.validators.in_({"none", "teacher_forcing", "diffusion_forcing", "teacher_forcing_dcm"}), + ) + + # Load balancing loss config. + lbl: LBLConfig = LBLConfig() + + # vision configs + vision_gen: bool = True # whether to use vision related parameters and condition/generate vision tokens + + # action configs + action_gen: bool = False # whether to use action related parameters and condition/generate action tokens + max_action_dim: int = 32 # maximum dimension of the action space, we need to pad the data to this dimension. + num_embodiment_domains: int = 32 # number of domains for the domain-aware linear layer + + # sound configs + sound_gen: bool = False # whether to use sound related parameters and condition/generate sound tokens + sound_tokenizer: LazyDict | None = None # Sound tokenizer config (e.g., AVAE) + sound_dim: int | None = None # Sound latent channel size (e.g., 64 for AVAE 48kHz) + sound_latent_fps: int = 25 # Sound tokenizer's latent rate (e.g., 48kHz / 1920 hop = 25 Hz) + + # When False, removes bias from vae2llm, sound2llm, and the two Linear layers inside + # time_embedder. These biases seem to inject token-constant DC offsets that dominate + # the MoE router input and create prompt invariant routing. This is observed empirically + # in the 30B-A3B checkpoint. + enable_input_bias: bool = True + + log_enc_time_every_n: int = 100 # Frequency of logging encoding time to W&B + + # When True, ``OmniMoTModel.state_dict`` / ``load_state_dict`` skip the + # reasoner (und) pathway weights under ``language_model`` — i.e. every key + # WITHOUT a ``_moe_gen`` suffix (including ``visual`` / ``lm_head`` / + # ``embed_tokens``). These are not written to checkpoints and are left + # untouched on load (typically already populated from the HF pretrained + # backbone). Generation-pathway (``_moe_gen``) and VFM heads are saved / + # loaded as usual. + exclude_reasoner_weights_from_checkpoint: bool = False diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/defaults/vlm.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/defaults/vlm.py new file mode 100644 index 0000000000000000000000000000000000000000..83f948c1b47f18c03b7ac3f2f013f29d0c1fa60a --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/defaults/vlm.py @@ -0,0 +1,17 @@ +"""Compatibility shim: behavior branch renamed defaults/vlm -> defaults/reasoner. +Hydra/export may still locate class paths under defaults.vlm.* for checkpoints +serialized before the rename; forward them to the reasoner definitions. +""" +from cosmos_framework.configs.base.defaults.reasoner import ( + PretrainedWeightsConfig, + VLMConfig, + create_qwen2_tokenizer_with_download, + create_vlm_config, +) + +__all__ = [ + "PretrainedWeightsConfig", + "VLMConfig", + "create_qwen2_tokenizer_with_download", + "create_vlm_config", +] diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva.py new file mode 100644 index 0000000000000000000000000000000000000000..1e1959154f7fa1e1d8277550ca74fd944746988c --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva.py @@ -0,0 +1,65 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Inference recipe for the fixed-base RoboCasa Atomic-5 Zeva policy.""" + +from __future__ import annotations + +import copy + +from hydra.core.config_store import ConfigStore + +from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_droid_nano import ( + action_policy_droid_nano, +) + +cs = ConfigStore.instance() + +action_policy_robocasa365_atomic5_zeva = copy.deepcopy(action_policy_droid_nano) +action_policy_robocasa365_atomic5_zeva["job"].update( + project="zeva", + group="zeva_robocasa_atomic5", + name="action_policy_robocasa365_atomic5_zeva", +) +action_policy_robocasa365_atomic5_zeva["model"]["config"]["behavior_stage2"] = dict( + enabled=True, + global_dim=256, + phase_dim=128, + effect_dim=128, + effect_history_length=4, + action_dim=7, + horizon=32, + num_anchors=8, + hidden_dim=256, + num_heads=4, + prior_loss_weight=0.01, + prior_dropout_rate=0.4, + prior_inference_guidance_scale=0.5, + global_prefix_tokens=1, + leading_condition_steps=0, +) +action_policy_robocasa365_atomic5_zeva["model"]["config"]["proprio_condition"] = dict( + enabled=True, + input_dim=9, + prefix_tokens=1, +) +# This is a post-trained Zeva checkpoint, not a fresh DROID initialization. +# Load every trained policy/action tensor; only the unused EMA namespace may be +# absent. Inheriting DROID's action-head skip list silently changes inference. +action_policy_robocasa365_atomic5_zeva["checkpoint"]["keys_to_skip_loading"] = ["net_ema."] +# The server supplies Qwen explicitly; retain the same environment contract as +# the training recipe so checkpoint metadata and manual startup agree. +action_policy_robocasa365_atomic5_zeva["model"]["config"]["vlm_config"]["tokenizer"][ + "pretrained_model_name" +] = "${oc.env:QWEN_VLM_PATH}" + +# Serving does not require training dataloaders. +action_policy_robocasa365_atomic5_zeva["dataloader_train"] = None +action_policy_robocasa365_atomic5_zeva["dataloader_val"] = None + +cs.store( + group="experiment", + package="_global_", + name="action_policy_robocasa365_atomic5_zeva", + node=action_policy_robocasa365_atomic5_zeva, +) diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim.py new file mode 100644 index 0000000000000000000000000000000000000000..8d0d7b53a3f7c6902a7efbf7623b39a0c3df6ffc --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim.py @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Frozen-policy PIM training for RoboCasa Atomic-5 Zeva.""" + +from __future__ import annotations + +import copy + +from hydra.core.config_store import ConfigStore + +from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva import ( + action_policy_robocasa365_atomic5_zeva, +) + +cs = ConfigStore.instance() + +action_policy_robocasa365_atomic5_zeva_pim = copy.deepcopy( + action_policy_robocasa365_atomic5_zeva +) +action_policy_robocasa365_atomic5_zeva_pim["job"].update( + project="zeva", + group="pim_adapter_robocasa_atomic5", + name="action_policy_robocasa365_atomic5_zeva_pim", +) +zeva_policy = action_policy_robocasa365_atomic5_zeva_pim["model"]["config"]["behavior_stage2"] +zeva_policy.update( + pim_memory_enabled=True, + pim_persistent_length=4, + pim_context_dim=256, + pim_gate_init=0.0, +) + +# Train only the Causal Prompt encoder, projection, and scalar gate. +keys = action_policy_robocasa365_atomic5_zeva_pim["optimizer"]["keys_to_select"] +keys[:] = ["behavior_pim_encoder", "behavior_pim_projector", "behavior_pim_gate"] +action_policy_robocasa365_atomic5_zeva_pim["optimizer"]["lr_multipliers"].update( + behavior_pim_encoder=5.0, + behavior_pim_projector=5.0, + behavior_pim_gate=1.0, +) +action_policy_robocasa365_atomic5_zeva_pim["checkpoint"]["keys_to_skip_loading"] += [ + "behavior_pim_encoder", + "behavior_pim_projector", + "behavior_pim_gate", +] + +train_loader = action_policy_robocasa365_atomic5_zeva_pim.get("dataloader_train") +if train_loader is not None: + dataset = train_loader["dataloader"]["datasets"]["robocasa365"]["dataset"] + dataset["behavior_pim_training_bank"] = "${oc.env:ZEVA_PIM_TRAINING_BANK}" + dataset["behavior_pim_history_length"] = 4 + dataset["behavior_pim_context_dropout"] = 0.2 + dataset["behavior_pim_support_dropout"] = 0.2 + +cs.store( + group="experiment", + package="_global_", + name="action_policy_robocasa365_atomic5_zeva_pim", + node=action_policy_robocasa365_atomic5_zeva_pim, +) diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim_inference.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim_inference.py new file mode 100644 index 0000000000000000000000000000000000000000..aea6c6ab6d05118ba63cc6cc72cbd65daa77bcfe --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim_inference.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Inference config that loads trained PIM weights instead of warm-start skipping them.""" + +from __future__ import annotations + +import copy + +from hydra.core.config_store import ConfigStore + +from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva_pim import ( + action_policy_robocasa365_atomic5_zeva_pim, +) + +cs = ConfigStore.instance() + +action_policy_robocasa365_atomic5_zeva_pim_inference = copy.deepcopy( + action_policy_robocasa365_atomic5_zeva_pim +) +action_policy_robocasa365_atomic5_zeva_pim_inference["job"]["name"] = ( + "action_policy_robocasa365_atomic5_zeva_pim_inference" +) +# The training recipe skips these keys only because its input checkpoint is the +# old Stage-2 model. A trained PIM DCP contains them and inference must load +# them. Keep the established net_ema exclusion used by the Stage-2 release. +action_policy_robocasa365_atomic5_zeva_pim_inference["checkpoint"][ + "keys_to_skip_loading" +] = ["net_ema."] + +cs.store( + group="experiment", + package="_global_", + name="action_policy_robocasa365_atomic5_zeva_pim_inference", + node=action_policy_robocasa365_atomic5_zeva_pim_inference, +) diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_test.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_test.py new file mode 100644 index 0000000000000000000000000000000000000000..22b5440fd27cfc38266f2f4f353c27f3ac8cf972 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_test.py @@ -0,0 +1,14 @@ +from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva import ( + action_policy_robocasa365_atomic5_zeva, +) + + +def test_released_stage2_loads_trained_action_heads() -> None: + assert action_policy_robocasa365_atomic5_zeva["checkpoint"][ + "keys_to_skip_loading" + ] == ["net_ema."] + + +def test_inference_recipe_does_not_construct_training_loaders() -> None: + assert action_policy_robocasa365_atomic5_zeva["dataloader_train"] is None + assert action_policy_robocasa365_atomic5_zeva["dataloader_val"] is None diff --git a/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_transition_memory.py b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_transition_memory.py new file mode 100644 index 0000000000000000000000000000000000000000..7c64ee9de8a0712ec7da754d8c4494870f2d143a --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_transition_memory.py @@ -0,0 +1,66 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Experimental transition-memory adaptation for the RoboCasa Atomic-5 Zeva policy. + +The CTE path and frozen diffusion policy are loaded from the verified +Atomic-5 Stage-2 checkpoint and frozen. The separately trained +history-only ``TransitionMemoryEncoder`` is consumed through the cached +``behavior_online_context`` token; this recipe trains the zero-init Cosmos +transition-memory projector so that the new context affects only the action branch. +""" + +from __future__ import annotations + +import copy + +from hydra.core.config_store import ConfigStore + +from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva import ( + action_policy_robocasa365_atomic5_zeva, +) + +cs = ConfigStore.instance() + +action_policy_robocasa365_atomic5_zeva_transition_memory = copy.deepcopy( + action_policy_robocasa365_atomic5_zeva +) +action_policy_robocasa365_atomic5_zeva_transition_memory["job"].update( + project="zeva", + group="transition_memory_robocasa_atomic5", + name="action_policy_robocasa365_atomic5_zeva_transition_memory", +) +zeva_policy = action_policy_robocasa365_atomic5_zeva_transition_memory["model"]["config"]["behavior_stage2"] +zeva_policy.update( + online_memory_enabled=True, + online_context_dim=256, + online_prefix_tokens=1, +) + +# The already trained policy-injection prior and task-context projector are deliberately not added +# again. Only the new zero-init Cosmos action-branch projector is optimized; +# the query/key/value/history encoder is trained by the preceding +# history-only recipe and loaded into the context cache. +keys = action_policy_robocasa365_atomic5_zeva_transition_memory["optimizer"]["keys_to_select"] +# Stage-2 checkpoint parameters and the Cosmos backbone must remain frozen in +# this adaptation. Replacing (rather than subtracting from) the inherited +# selector also prevents the base RoboCasa recipe's action/proprio modules from +# being silently optimized. +keys[:] = ["behavior_online_projector"] +action_policy_robocasa365_atomic5_zeva_transition_memory["optimizer"]["lr_multipliers"].update( + behavior_online_projector=5.0, +) + +train_loader = action_policy_robocasa365_atomic5_zeva_transition_memory.get("dataloader_train") +if train_loader is not None: + dataset = train_loader["dataloader"]["datasets"]["robocasa365"]["dataset"] + dataset["behavior_memory_bank"] = "${oc.env:ZEVA_TASK_CONTEXT_BANK}" + dataset["behavior_phase_cache"] = "${oc.env:ZEVA_CTE_FEATURE_CACHE}" + dataset["behavior_online_context_cache"] = "${oc.env:ZEVA_TRANSITION_CONTEXT_CACHE}" + +cs.store( + group="experiment", + package="_global_", + name="action_policy_robocasa365_atomic5_zeva_transition_memory", + node=action_policy_robocasa365_atomic5_zeva_transition_memory, +) diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/data/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ad9513f40e0c4c6eb5c09fa404aaa95e3ee8753 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/__init__.py @@ -0,0 +1,2 @@ +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ad9513f40e0c4c6eb5c09fa404aaa95e3ee8753 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/__init__.py @@ -0,0 +1,2 @@ +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ad9513f40e0c4c6eb5c09fa404aaa95e3ee8753 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/__init__.py @@ -0,0 +1,2 @@ +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8a8af0b1b929ba2c902b8d1b6392e4a01d41c82d --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/__init__.py @@ -0,0 +1,15 @@ +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) + +# Preserve the upstream package's public dataset exports. +from .agibotworld_beta_lerobot_dataset import AgiBotWorldBetaLeRobotDataset +from .base_dataset import ActionBaseDataset +from .bridge_orig_lerobot_dataset import BridgeOrigLeRobotDataset +from .droid_merged_lerobot_dataset import DROIDMergedLeRobotDataset +from .droid_lerobot_dataset import DROIDLeRobotDataset +from .fractal_lerobot_dataset import FractalLeRobotDataset +from .human_hand_pose_lerobot_dataset import HumanHandPoseLeRobotDataset +from .libero_lerobot_dataset import LIBEROLeRobotDataset +from .robomind_franka_dataset import RoboMINDFrankaDataset +from .robomind_ur_dataset import RoboMINDURDataset +from .umi_lerobot_dataset import UMILeRobotDataset diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/robocasa365_lerobot_dataset.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/robocasa365_lerobot_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..56bde3f73ab4f3f12220b75b2adc46f787f4fbb1 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/robocasa365_lerobot_dataset.py @@ -0,0 +1,334 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Read-only RoboCasa365 LeRobot-v2.1 adapter for Cosmos3 Action. + +The target set is a directory of 50 independent LeRobot roots. Current +LeRobot rejects v2.1 metadata, so this reader indexes the immutable JSONL and +per-episode parquet files directly while using LeRobot's torchcodec decoder. +""" + +from __future__ import annotations + +import bisect +import json +import random +import re +from collections import OrderedDict +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Sequence + +import pyarrow.parquet as pq +import torch +import torch.nn.functional as F +from lerobot.datasets.video_utils import decode_video_frames +from torch.utils.data import Dataset + +from cosmos_framework.data.generator.action.action_processing import ActionNormalizer, resolve_action_normalization +from cosmos_framework.data.generator.action.datasets.cosmos3_action_lerobot import split_episode_ids +from cosmos_framework.data.generator.action.domain_utils import get_domain_id + +_CAMERAS = { + "left": "observation.images.robot0_agentview_left", + "right": "observation.images.robot0_agentview_right", + "wrist": "observation.images.robot0_eye_in_hand", +} + +_CAMERA_LAYOUTS = { + "three_view_grid": ("left", "right", "wrist"), + "left_wrist_horizontal": ("left", "wrist"), +} + +_ACTION_INDICES = { + "full12": tuple(range(12)), + # RoboCasa365 layout: base xy-yaw-height (0:4), control mode (4), + # end-effector delta pose + gripper (5:12). + "arm7": tuple(range(5, 12)), +} + +_STATE_INDICES = { + "full16": tuple(range(16)), + # RoboCasa365 state: base pose (0:7), relative end-effector pose (7:14), + # gripper qpos (14:16). Fixed-base policies keep only the latter 9 values. + "arm9": tuple(range(7, 16)), +} + + +def _humanize_task(task: str) -> str: + words = re.sub(r"(? None: + if viewpoint not in {"concat_view", "third_person_view"}: + raise ValueError(f"Unsupported RoboCasa365 viewpoint={viewpoint!r}") + if split not in {"train", "val", "full"}: + raise ValueError("split must be train, val or full") + if task_set not in {"target50", "atomic", "composite", "composite_seen", "composite_unseen"}: + raise ValueError(f"Unsupported RoboCasa365 task_set={task_set!r}") + if camera_layout not in _CAMERA_LAYOUTS: + raise ValueError(f"Unsupported RoboCasa365 camera_layout={camera_layout!r}") + if action_mode not in _ACTION_INDICES: + raise ValueError(f"Unsupported RoboCasa365 action_mode={action_mode!r}") + if state_mode not in _STATE_INDICES: + raise ValueError(f"Unsupported RoboCasa365 state_mode={state_mode!r}") + self.root = Path(root) + self.fps = float(fps) + self.chunk_length = int(chunk_length) + self.split = split + self.split_seed = int(split_seed) + self.split_val_ratio = float(split_val_ratio) + self.mode = mode + self.viewpoint = viewpoint + self.use_state = bool(use_state) + self.use_image_augmentation = bool(use_image_augmentation) + self.emit_behavior_metadata = bool(emit_behavior_metadata) + self.task_set = task_set + self.task_names = frozenset(task_names) if task_names is not None else None + self.camera_layout = camera_layout + self.action_mode = action_mode + self.action_indices = _ACTION_INDICES[action_mode] + self.state_mode = state_mode + self.state_indices = _STATE_INDICES[state_mode] + self.camera_names = _CAMERA_LAYOUTS[camera_layout] + self.domain_id = get_domain_id(self.EMBODIMENT_TYPE) + self.action_dim = len(self.action_indices) + self._parquet_cache_size = int(parquet_cache_size) + self._parquet_cache: OrderedDict[Path, dict[str, torch.Tensor]] = OrderedDict() + self._normalizer: ActionNormalizer | None = None + if action_normalization is not None: + stats_path = ( + Path(action_stats_path) + if action_stats_path + else Path(__file__).parents[1] / "normalizer_stats" / "robocasa365_target_action_stats.json" + ) + if not stats_path.is_file(): + raise FileNotFoundError( + "RoboCasa365 action normalization requires the target50 global action statistics; " + f"missing {stats_path}" + ) + raw = json.loads(stats_path.read_text()) + raw = raw.get("action", raw) + index = torch.tensor(self.action_indices, dtype=torch.long) + stats = { + key: torch.tensor(raw[key], dtype=torch.float32).index_select(0, index) + for key in ("min", "max", "mean", "std", "q01", "q99") + } + self._normalizer = resolve_action_normalization(action_normalization, stats) + + roots = sorted(path.parent.parent for path in self.root.glob("*/*/*/lerobot/meta/info.json")) + roots = [path for path in roots if self._include_root(path)] + if max_roots is not None: + roots = roots[:max_roots] + if not roots: + raise FileNotFoundError(f"No RoboCasa365 LeRobot-v2.1 roots under {self.root}") + self.episodes: list[RoboCasa365Episode] = [] + for root_path in roots: + self._index_root(root_path) + # A length-H command needs H action rows and H+1 observation frames. + self._window_lengths = [max(0, episode.length - self.chunk_length) for episode in self.episodes] + self._cum_ends: list[int] = [] + total = 0 + for length in self._window_lengths: + total += length + self._cum_ends.append(total) + self._num_windows = total + + def _include_root(self, path: Path) -> bool: + category, task_name = path.relative_to(self.root).parts[:2] + if self.task_names is not None and task_name not in self.task_names: + return False + if self.task_set == "atomic": + return category == "atomic" + if self.task_set == "composite": + return category == "composite" + if self.task_set == "composite_seen": + return category == "composite" and task_name not in _COMPOSITE_UNSEEN + if self.task_set == "composite_unseen": + return category == "composite" and task_name in _COMPOSITE_UNSEEN + return True + + def _index_root(self, path: Path) -> None: + info = json.loads((path / "meta" / "info.json").read_text()) + if info["codebase_version"] != "v2.1" or info["fps"] != self.fps: + raise ValueError(f"Unexpected RoboCasa365 metadata in {path}") + category, task_name = path.relative_to(self.root).parts[:2] + records = [json.loads(line) for line in (path / "meta" / "episodes.jsonl").read_text().splitlines()] + selected = split_episode_ids(len(records), self.split_seed, self.split_val_ratio, self.split) + selected.sort() + for episode_id in selected: + record = records[episode_id] + length = int(record["length"]) + if length <= self.chunk_length: + continue + command = str(record.get("tasks", [""])[0]).strip() or _humanize_task(task_name) + video_paths = { + name: path / f"videos/chunk-{episode_id // 1000:03d}/{key}/episode_{episode_id:06d}.mp4" + for name, key in _CAMERAS.items() + if name in self.camera_names + } + parquet_path = path / f"data/chunk-{episode_id // 1000:03d}/episode_{episode_id:06d}.parquet" + if not parquet_path.is_file() or any(not video.is_file() for video in video_paths.values()): + raise FileNotFoundError(f"Incomplete RoboCasa365 episode {path}#{episode_id}") + self.episodes.append( + RoboCasa365Episode(path, category, task_name, episode_id, length, command, parquet_path, video_paths) + ) + + def __len__(self) -> int: + return self._num_windows + + def get_shuffle_blocks(self) -> list[tuple[int, int]]: + blocks: list[tuple[int, int]] = [] + start = 0 + for length in self._window_lengths: + blocks.append((start, length)) + start += length + return blocks + + def _resolve_index(self, index: int) -> tuple[int, int]: + if index < 0: + index += len(self) + if not 0 <= index < len(self): + raise IndexError(index) + episode_index = bisect.bisect_right(self._cum_ends, index) + start = 0 if episode_index == 0 else self._cum_ends[episode_index - 1] + return episode_index, index - start + + def _load_low_dim(self, episode: RoboCasa365Episode) -> dict[str, torch.Tensor]: + cached = self._parquet_cache.pop(episode.parquet_path, None) + if cached is None: + table = pq.read_table(episode.parquet_path, columns=["action", "observation.state"]) + payload = table.to_pydict() + cached = { + "action": torch.tensor(payload["action"], dtype=torch.float32), + "state": torch.tensor(payload["observation.state"], dtype=torch.float32), + } + self._parquet_cache[episode.parquet_path] = cached + while len(self._parquet_cache) > self._parquet_cache_size: + self._parquet_cache.popitem(last=False) + return cached + + def _decode(self, path: Path, start: int) -> torch.Tensor: + timestamps = [(start + offset) / self.fps for offset in range(self.chunk_length + 1)] + return decode_video_frames(path, timestamps, tolerance_s=2e-4, backend="torchcodec") + + def _compose_video(self, episode: RoboCasa365Episode, start: int) -> torch.Tensor: + left = self._decode(episode.video_paths["left"], start) + if self.viewpoint == "third_person_view": + return left + wrist = self._decode(episode.video_paths["wrist"], start) + if self.camera_layout == "left_wrist_horizontal": + if self.use_image_augmentation: + brightness = random.uniform(0.85, 1.15) + contrast = random.uniform(0.85, 1.15) + combined = torch.cat((left, wrist), dim=0) + mean = combined.mean(dim=(-2, -1), keepdim=True) + combined = ((combined - mean) * contrast + mean).mul(brightness).clamp(0, 1) + left, wrist = combined.chunk(2, dim=0) + # Preserve both native 256x256 views: agent-left | wrist. + return torch.cat((left, wrist), dim=-1) + right = self._decode(episode.video_paths["right"], start) + if self.use_image_augmentation: + brightness = random.uniform(0.85, 1.15) + contrast = random.uniform(0.85, 1.15) + combined = torch.cat((left, right, wrist), dim=0) + mean = combined.mean(dim=(-2, -1), keepdim=True) + combined = ((combined - mean) * contrast + mean).mul(brightness).clamp(0, 1) + n = left.shape[0] + left, right, wrist = combined[:n], combined[n : 2 * n], combined[2 * n :] + right = F.interpolate(right, size=(128, 128), mode="bilinear", align_corners=False) + wrist = F.interpolate(wrist, size=(128, 128), mode="bilinear", align_corners=False) + # Left agent view on top, right agent + wrist views in the bottom row. + return torch.cat((left, torch.cat((right, wrist), dim=-1)), dim=-2) + + def get_action_normalizer(self, _sample: dict[str, Any] | None = None) -> ActionNormalizer | None: + return self._normalizer + + def __getitem__(self, index: int) -> dict[str, Any]: + episode_index, frame_offset = self._resolve_index(index) + episode = self.episodes[episode_index] + low_dim = self._load_low_dim(episode) + action = low_dim["action"][frame_offset : frame_offset + self.chunk_length, self.action_indices] + if self.use_state: + # State and action have different physical layouts (16-D vs 12-D), + # so expose state separately instead of pretending it is an action. + initial_state = low_dim["state"][frame_offset, self.state_indices] + else: + initial_state = None + video = self._compose_video(episode, frame_offset) + result: dict[str, Any] = { + "ai_caption": episode.command, + "video": (video * 255.0).clamp(0, 255).to(torch.uint8).permute(1, 0, 2, 3), + "action": action, + "conditioning_fps": torch.tensor(int(self.fps), dtype=torch.long), + "mode": self.mode, + "domain_id": torch.tensor(self.domain_id, dtype=torch.long), + "viewpoint": self.viewpoint, + "additional_view_description": ( + "The left panel is the left agent view and the right panel is the wrist view." + if self.camera_layout == "left_wrist_horizontal" + else "The top panel is the left agent view. The bottom-left panel is the right agent view, " + "and the bottom-right panel is the wrist view." + ), + "task_cluster": episode.task_name, + "task_category": episode.category, + } + if initial_state is not None: + result["proprio"] = initial_state + if self.emit_behavior_metadata: + # Keep ordinal source_index for diagnostics; resolve the canonical + # Stage-1 key from task + episode_id in the behavior store. + result["behavior_source_index"] = torch.tensor(episode_index, dtype=torch.long) + result["behavior_episode_id"] = torch.tensor(episode.episode_id, dtype=torch.long) + result["behavior_task_cluster"] = episode.task_name + result["behavior_frame_offset"] = torch.tensor(frame_offset, dtype=torch.long) + return result + + +_COMPOSITE_UNSEEN = { + "ArrangeBreadBasket", "ArrangeTea", "BreadSelection", "CategorizeCondiments", + "CuttingToolSelection", "GarnishPancake", "GatherTableware", "HeatKebabSandwich", + "MakeIceLemonade", "PanTransfer", "PortionHotDogs", "RecycleBottlesByType", + "SeparateFreezerRack", "WaffleReheat", "WashFruitColander", "WeighIngredients", +} diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..90bc6f602001cb7b20351c30548371e2a24181c9 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py @@ -0,0 +1,163 @@ +"""Small, self-contained WidowX/Bridge LeRobot-v3 dataset adapter. + +The smoke export is deliberately kept independent from the legacy LeRobot +parquet layout used by the upstream Cosmos loaders. This adapter is also +useful for quick Zeva policy experiments and returns normalized 7-D Bridge +actions plus the 9-D proprioception contract used by the WidowX server. +""" +from __future__ import annotations + +import json +import os +from pathlib import Path +from typing import Dict +from collections import OrderedDict + +import av +import numpy as np +import pyarrow.parquet as pq +import torch +from torch.utils.data import Dataset + +Q01 = np.asarray([-0.028752606511116028, -0.041702210046350954, -0.026096698231995105, + -0.08052822157740593, -0.09249736212193965, -0.20738411962985992], np.float32) +Q99 = np.asarray([0.02830690816044803, 0.04089860741049051, 0.04018005654215808, + 0.08173405691981314, 0.07760896608233431, 0.20384809583425495], np.float32) + + +def normalize_actions(a: np.ndarray) -> np.ndarray: + out = np.asarray(a, np.float32).copy() + out[..., :6] = np.clip(2 * ((out[..., :6] - Q01) / (Q99 - Q01)) - 1, -1, 1) + out[..., 6] = np.where(out[..., 6] > 0.5, 1.0, -1.0) + return out + + +class WidowXBridgeV3Dataset(Dataset): + def __init__(self, root: str, chunk_length: int = 32, max_episodes: int | None = None, + image_size: int = 256, feature_cache: str | None = None, + window_mode: str | None = None, validate_cache: bool = True): + self.root = Path(root) + self.chunk_length = int(chunk_length) + self.window_mode = window_mode or os.environ.get('WIDOWX_WINDOW_MODE', 'full') + if self.window_mode not in ('full', 'legacy'): + raise ValueError('window_mode must be full or legacy') + self.image_size = int(image_size) + self.info = json.loads((self.root / 'meta/info.json').read_text()) + self.video_key = 'observation.images.image_0' + if self.video_key not in self.info['features']: + raise ValueError('Bridge front camera image_0 is missing') + self.feature_cache = Path(feature_cache) if feature_cache else None + episodes = [json.loads(x) for x in (self.root / "meta/episodes.jsonl").read_text().splitlines()] + tasks = [json.loads(x) for x in (self.root / "meta/tasks.jsonl").read_text().splitlines()] + self.tasks = {int(x['task_index']): x['task'] for x in tasks} + if max_episodes is not None: + episodes = episodes[:int(max_episodes)] + self.episodes = episodes + self.windows = [(e["episode_index"], s) for e in episodes + for s in range(0, int(e['length']) if self.window_mode == 'full' + else max(0, int(e['length']) - self.chunk_length), 4)] + self.feature_fingerprint = None + if self.feature_cache is not None: + if self.window_mode == 'full': + from scripts.widowx_contract import read_manifest + self.feature_fingerprint = read_manifest(self.root, self.feature_cache) + # Fail during dataset construction instead of much later in a + # worker, where a missing frozen CTE feature looks like a random + # dataloader crash after training has already started. + required_episodes = sorted({episode for episode, _ in self.windows}) + missing = [episode for episode in required_episodes + if not (self.feature_cache / f"episode_{episode:06d}.pt").is_file()] + if missing and validate_cache: + preview = ", ".join(str(x) for x in missing[:8]) + raise FileNotFoundError( + f"WIDOWX_FEATURE_CACHE is missing {len(missing)} episode feature files " + f"(first: {preview}); run scripts/prepare_widowx_features.py before training" + ) + self._frames = OrderedDict() + self._rows: Dict[int, Dict[str, np.ndarray]] = {} + self._feature_episode = None + self._features = None + + def __len__(self): + return len(self.windows) + + def _load(self, episode: int): + if episode in self._rows: + return + chunk = episode // int(self.info.get('chunks_size', 1000)) + fmt = dict(episode_chunk=chunk, episode_index=episode, video_key=self.video_key) + dp = self.root / self.info['data_path'].format(**fmt) + tab = pq.read_table(dp) + rows = {k: np.asarray(tab[k].to_pylist()) + for k in ("observation.state", "action", "task_index")} + vp = self.root / self.info['video_path'].format(**fmt) + with av.open(str(vp)) as container: + frames = [f.to_ndarray(format="rgb24") for f in container.decode(video=0)] + if len(frames) != len(rows['action']): + raise ValueError(f'Episode {episode}: video/action frame count mismatch') + if len(self._frames) >= 2: + old, _ = self._frames.popitem(last=False) + del self._rows[old] + self._rows[episode] = rows + self._frames[episode] = np.stack(frames) + + def __getitem__(self, index: int): + episode, start = self.windows[index] + self._load(episode) + rows, frames = self._rows[episode], self._frames[episode] + end = start + self.chunk_length + # A terminal recorded action remains a valid policy label even where + # the following image was not exported. Mask those modalities separately. + n_action = min(self.chunk_length, len(rows['action']) - start) + n_frames = min(self.chunk_length + 1, len(frames) - start) + image_indices = np.minimum(np.arange(start, end + 1), len(frames) - 1) + imgs = torch.from_numpy(frames[image_indices]).permute(3, 0, 1, 2).contiguous() + action = np.zeros((self.chunk_length, 7), np.float32) + action[:n_action] = normalize_actions(rows["action"][start:start+n_action]) + action[n_action:, 6] = action[n_action-1, 6] + state = rows["observation.state"][start] + proprio = np.concatenate([state, state[-1:]], axis=0).astype(np.float32) + task_index = int(rows['task_index'][start]) + sample = {"video": imgs, "action": torch.from_numpy(action), + "proprio": torch.from_numpy(proprio), + "ai_caption": self.tasks[task_index], 'mode': 'wam', + 'viewpoint': 'ego_view', 'domain_id': torch.tensor(7), + 'conditioning_fps': torch.tensor(int(self.info['fps']))} + sample['widowx_action_valid'] = torch.arange(self.chunk_length) < n_action + # Wan's causal latents represent raw boundaries 0,4,8,...; require + # an entirely real four-frame group for each supervised future latent. + sample['widowx_vision_valid'] = torch.arange(0, self.chunk_length + 1, 4) < n_frames + sample['widowx_episode_start'] = torch.tensor([episode, start]) + if self.feature_cache: + if self._feature_episode != episode: + features = torch.load(self.feature_cache / f'episode_{episode:06d}.pt', weights_only=True) + if self.feature_fingerprint is not None: + if features.get('fingerprint') != self.feature_fingerprint: + raise ValueError(f'Episode {episode}: feature fingerprint mismatch') + if features['starts'].tolist() != list(range(0, len(frames), 4)): + raise ValueError(f'Episode {episode}: incomplete feature boundaries') + self._features, self._feature_episode = features, episode + features = self._features + for key in ('behavior_global', 'behavior_phase', 'behavior_effect', 'behavior_effect_valid'): + sample[key] = features[key][start // 4] + return sample + + def get_shuffle_blocks(self): + blocks = [] + for i, (episode, _) in enumerate(self.windows): + if i == 0 or self.windows[i-1][0] != episode: + blocks.append([i, 1]) + else: + blocks[-1][1] += 1 + return blocks + + +def get_action_widowx_sft_dataset(root: str, tokenizer_config=None, max_action_dim=64, + resolution='256', **kwargs): + from cosmos_framework.data.generator.action.datasets.action_sft_dataset import ActionSFTDataset + from scripts.widowx_data_resume import WidowXIterableDataset + from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline + raw = WidowXBridgeV3Dataset(root=root, **kwargs) + transform = ActionTransformPipeline(tokenizer_config=tokenizer_config, max_action_dim=max_action_dim, + format_prompt_as_json=True) + return WidowXIterableDataset(ActionSFTDataset(raw, transform, resolution)) diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/domain_utils.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/domain_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..0608843401dd3e465cbbee2bbdefa11630f1a7c6 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/domain_utils.py @@ -0,0 +1,83 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Domain ID helpers for cross-embodiment action datasets.""" + +EMBODIMENT_TO_DOMAIN_ID: dict[str, int] = { + "no_action": 0, + "av": 1, + "camera_pose": 2, + "hand_pose": 3, + "pusht": 4, + "libero": 5, + "umi": 6, + "bridge_orig_lerobot": 7, + "droid_lerobot": 8, + "robomind-franka": 8, + "embodiment_b": 9, + "robomind-franka-dual": 12, + "robomind-ur": 13, + "agibotworld": 15, + "embodiment_c_gripper": 15, + "embodiment_c_gripper_ext": 15, + "xdof_yam": 16, + "molmoact2_yam": 16, + "abc_yam": 16, + "fractal": 20, + "drawanything": 21, + # Dedicated Panda-Omron embedding used when the released policy was trained. + # Do not alias this to DROID or to an unused numeric slot. + "robocasa-panda-omron": 22, +} + + +EMBODIMENT_TO_RAW_ACTION_DIM: dict[str, int] = { + "av": 9, + "camera_pose": 9, + "pusht": 2, + "umi": 10, + "bridge_orig_lerobot": 10, + "droid_lerobot": 10, + "robomind-franka": 10, + "robomind-franka-dual": 20, + "robomind-ur": 10, + "embodiment_b": 30, + "agibotworld": 29, + "embodiment_c_gripper": 29, + "embodiment_c_gripper_ext": 29, + "xdof_yam": 20, + "molmoact2_yam": 20, + "abc_yam": 20, + "fractal": 10, + "drawanything": 3, + # Full source command before the Atomic-5 arm-only [5:12] selection. + "robocasa-panda-omron": 12, +} + + +def get_domain_id(embodiment_type: str) -> int: + """Get the model domain embedding ID for an embodiment.""" + key = embodiment_type.lower().strip() + if key not in EMBODIMENT_TO_DOMAIN_ID: + raise KeyError( + f"Unknown embodiment type: {embodiment_type!r}. " + f"Available embodiments: {sorted(EMBODIMENT_TO_DOMAIN_ID.keys())}" + ) + return EMBODIMENT_TO_DOMAIN_ID[key] + + +def get_action_dim(embodiment_type: str) -> int: + """Get the raw action width before dataset-specific channel selection.""" + key = embodiment_type.lower().strip() + if key not in EMBODIMENT_TO_RAW_ACTION_DIM: + raise KeyError( + f"Unknown embodiment type: {embodiment_type!r}. " + f"Available embodiments: {sorted(EMBODIMENT_TO_RAW_ACTION_DIM.keys())}" + ) + return EMBODIMENT_TO_RAW_ACTION_DIM[key] + + +def is_valid_domain_name(embodiment_type: str) -> bool: + """Check whether an embodiment has a canonical raw action width.""" + key = embodiment_type.lower().strip() + return key in EMBODIMENT_TO_RAW_ACTION_DIM diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/normalizer_stats/robocasa365_target_action_stats.json b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/normalizer_stats/robocasa365_target_action_stats.json new file mode 100644 index 0000000000000000000000000000000000000000..9b4e5c69c49fa7471f8e1a1372dfae0e0382ca49 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/normalizer_stats/robocasa365_target_action_stats.json @@ -0,0 +1,11 @@ +{ + "action": { + "min": [-1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], + "max": [1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + "mean": [0.02590581175350872, 0.00202585452064382, -0.000603911072971857, 0.0, -0.7797204007304583, 0.007985740558506635, -0.009527682245632989, -0.02404516475177401, 0.0024829546270168945, -0.009724957579023025, -0.00014074740094141753, -0.17212704805076373], + "std": [0.19966604450417424, 0.18601724713237694, 0.12950011360377808, 0.0, 0.6261278595805986, 0.4100137479669798, 0.3704388299067406, 0.3502567436993047, 0.10230268334142267, 0.11492962521591003, 0.11579242435141789, 0.9850747576645584], + "q01": [-0.3200703506810163, -0.34884918400617965, -0.21919116581311202, 3.9995784462121255e-16, -0.9968481276386474, -0.9422251311439209, -0.8442310960485607, -0.7521983922010141, -0.2722379479403091, -0.36124760554870705, -0.31036559990487256, -0.9993595477431751], + "q99": [0.39805452510884953, 0.33510666883940965, 0.21445504450811365, 3.9595826617500056e-14, 0.03382406019703607, 0.8090603250091402, 0.8343534480833622, 0.8754301710780941, 0.2783829802274566, 0.28977084389036595, 0.32830698508606554, 0.9179061147815708], + "count": [14957899] + } +} diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/transforms.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..ae74ff89a04800a928d0b5735b285c89a7c94a85 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/action/transforms.py @@ -0,0 +1,710 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Dataset transform wrappers for the Action project. + +This module provides the ``ActionTransformPipeline`` and spatial padding utilities. + +The reflection padding snaps each sample to the closest predefined resolution from +``VIDEO_RES_SIZE_INFO`` (matching VFM's approach), guaranteeing a bounded set of +output shapes that are all multiples of 16. + +See :func:`~.unified_dataset.wrap_dataset` for the convenience factory that +combines datasets with transforms, and :class:`~.unified_dataset.MapToIterableAdapter` +for the map-to-iterable wrapper. +""" + +from __future__ import annotations + +import torch +import torchvision.transforms.functional as transforms_F + +from cosmos_framework.utils import log +from cosmos_framework.data.generator.action.action_processing import ( + ActionNormalizer, + ActionProcessor, +) +from cosmos_framework.data.generator.action.json_formatter import ActionPromptJsonFormatter +from cosmos_framework.data.generator.action.viewpoint_utils import ViewpointTextInfo +from cosmos_framework.data.generator.augmentors.duration_fps_text_timestamps import DurationFPSTextTimeStamps +from cosmos_framework.data.generator.augmentors.idle_frames_text_info import IdleFramesTextInfo +from cosmos_framework.data.generator.augmentors.resolution_text_info import ResolutionTextInfo +from cosmos_framework.data.generator.augmentors.text_tokenizer import TextTokenizerTransform +from cosmos_framework.data.generator.utils import VIDEO_RES_SIZE_INFO +from cosmos_framework.data.generator.sequence_packing import SequencePlan +from cosmos_framework.utils.generator.data_utils import get_vision_data_resolution + + +def _should_append_idle_frame_info(mode: object) -> bool: + """Return whether idle-frame prompt metadata should be surfaced.""" + return mode != "inverse_dynamics" + + +def find_closest_target_size(h: int, w: int, resolution: str | int) -> tuple[int, int]: + """Find the closest predefined target size for a given input resolution. + + Looks up ``VIDEO_RES_SIZE_INFO[resolution]`` and selects the aspect ratio + whose ``H/W`` ratio is closest to the input ``h/w``. + + Args: + h: Input height in pixels. + w: Input width in pixels. + resolution: Resolution tier key (e.g. ``"256"``, ``"480"``, ``"720"``). + + Returns: + ``(target_w, target_h)`` from the predefined table. + + Raises: + ValueError: If *resolution* is not a key in ``VIDEO_RES_SIZE_INFO``. + """ + if isinstance(resolution, int): + resolution = str(resolution) + if resolution not in VIDEO_RES_SIZE_INFO: + raise ValueError( + f"Resolution '{resolution}' not found in VIDEO_RES_SIZE_INFO. Available: {list(VIDEO_RES_SIZE_INFO.keys())}" + ) + + candidates = VIDEO_RES_SIZE_INFO[resolution] + input_ratio = h / w + + best_key: str | None = None + best_diff = float("inf") + for aspect_key, (cand_w, cand_h) in candidates.items(): + cand_ratio = cand_h / cand_w + diff = abs(input_ratio - cand_ratio) + if diff < best_diff: + best_diff = diff + best_key = aspect_key + + assert best_key is not None + target_w, target_h = candidates[best_key] + return target_w, target_h + + +def reflection_pad_to_target( + data_dict: dict, + keys: list[str], + keep_aspect_ratio: bool, + target_w: int, + target_h: int, +) -> dict: + """Resize (aspect-preserving) and reflection-pad tensors to exact target size. + + For each key in *keys*, the tensor is: + + 1. Resized so its spatial dimensions fit within ``(target_h, target_w)`` + while preserving the aspect ratio (matching VFM's + ``ResizeLargestSideAspectPreserving``). + 2. Reflection-padded (or edge-padded when the padding exceeds the spatial + dimension) to reach exactly ``(target_h, target_w)`` (matching VFM's + ``ReflectionPadding``). + + After processing, the following entries are added to *data_dict*: + + - ``"image_size"``: ``torch.Tensor`` of shape ``(4,)`` containing + ``[target_h, target_w, orig_h_resized, orig_w_resized]`` where + ``target_h/w`` is the padded canvas size and ``orig_h/w_resized`` + is the original spatial size after aspect-preserving resize (i.e. + the content region before padding). After ``default_collate`` + this becomes ``(B, 4)``; the ``IterativeJointDataLoader`` then + splits it into per-sample ``(1, 4)`` tensors so the model can + index as ``data_batch["image_size"][i][0][0]``. + + Args: + data_dict: The sample dictionary (mutated in-place). + keys: Data-dict keys whose tensors should be resized and padded. + Tensors must have shape ``(C, H, W)`` or ``(C, T, H, W)``. + keep_aspect_ratio: Whether to keep the aspect ratio of the input tensor. + target_w: Target width in pixels. + target_h: Target height in pixels. + + Returns: + The mutated *data_dict*. + """ + orig_h_resized: int = 0 + orig_w_resized: int = 0 + + for key in keys: + if key not in data_dict: + continue + tensor = data_dict[key] + if not isinstance(tensor, torch.Tensor): + continue + + # Extract spatial dims + if tensor.ndim == 3: + orig_h, orig_w = tensor.shape[-2:] + elif tensor.ndim == 4: + orig_h, orig_w = tensor.shape[-2:] + else: + raise ValueError(f"Unexpected tensor ndim={tensor.ndim} for key '{key}', expected 3 or 4") + + # Step 1: aspect-preserving resize to fit within (target_h, target_w) + if keep_aspect_ratio: + # Prevent upscaling the video by setting the upper bound of scaling_ratio to 1.0. + scaling_ratio = min(target_w / orig_w, target_h / orig_h, 1.0) + orig_h_resized = int(scaling_ratio * orig_h + 0.5) + orig_w_resized = int(scaling_ratio * orig_w + 0.5) + assert orig_h_resized <= target_h and orig_w_resized <= target_w, ( + f"Resize error: orig ({orig_h}, {orig_w}) target ({target_h}, {target_w}) " + f"computed ({orig_h_resized}, {orig_w_resized})" + ) + else: + orig_h_resized = target_h + orig_w_resized = target_w + + if orig_h_resized != orig_h or orig_w_resized != orig_w: + tensor = transforms_F.resize( + tensor, + size=[orig_h_resized, orig_w_resized], + interpolation=transforms_F.InterpolationMode.BICUBIC, + antialias=True, + ) + + # Step 2: padding to exact target size (bottom and right only) + if orig_w_resized != target_w or orig_h_resized != target_h: + padding_right = target_w - orig_w_resized + padding_bottom = target_h - orig_h_resized + padding = [0, 0, padding_right, padding_bottom] + + if padding_right >= orig_w_resized or padding_bottom >= orig_h_resized: + tensor = transforms_F.pad(tensor, padding, padding_mode="edge") + else: + tensor = transforms_F.pad(tensor, padding, padding_mode="reflect") + + data_dict[key] = tensor + + # image_size: shape (4,) — [target_h, target_w, orig_h_resized, orig_w_resized]. + # Matches VFM's item_dataset convention. default_collate stacks to (B, 4); + # IterativeJointDataLoader._get_next_sample slices to (1, 4) per sample so + # the model can index [i][0][0]. + data_dict["image_size"] = torch.tensor( + [target_h, target_w, orig_h_resized, orig_w_resized], dtype=torch.float + ) # [4] + + return data_dict + + +def remove_reflection_padding( + tensor: torch.Tensor, + image_size: torch.Tensor | list[torch.Tensor] | None, +) -> torch.Tensor: + """Remove reflection padding added by :func:`reflection_pad_to_target`. + + Content is at top-left; crops to ``(orig_h_resized, orig_w_resized)``. + + Args: + tensor: Tensor whose last two dimensions are the padded spatial dims. + Supports any leading dimensions, e.g. ``(C, T, H, W)`` or + ``(C, H, W)``. + image_size: Spatial metadata using the convention produced by + :func:`reflection_pad_to_target`. Accepted forms are ``None`` (no + crop), a tensor with shape ``(4,)`` or ``(1, 4)``, or a non-empty + list whose first element has one of those tensor shapes. The four + values are ``[target_h, target_w, orig_h_resized, + orig_w_resized]``, where ``orig_h/w_resized`` is the original + spatial size after aspect-preserving resize (i.e. the content + region before padding). This matches the convention stored by + :func:`reflection_pad_to_target` and VFM's ``ReflectionPadding``. + + Returns: + Cropped tensor of shape ``(..., orig_h_resized, orig_w_resized)``. + """ + if image_size is None: + return tensor + if isinstance(image_size, list): + if not image_size: + raise ValueError("Expected at least one image_size entry") + image_size = image_size[0] # [1,4] or [4] + if image_size.ndim == 2 and image_size.shape[0] == 1: + image_size = image_size[0] # [4] + if image_size.ndim != 1: + raise ValueError(f"Expected image_size shape [4] or [1,4], got {tuple(image_size.shape)}") + + target_h = int(image_size[0].item()) + target_w = int(image_size[1].item()) + orig_h_resized = int(image_size[2].item()) + orig_w_resized = int(image_size[3].item()) + + if orig_h_resized == target_h and orig_w_resized == target_w: + return tensor + + return tensor[..., :orig_h_resized, :orig_w_resized].contiguous() + + +def build_sequence_plan_from_mode( + mode: str, + video_length: int, + action_length: int, + has_text: bool = True, + video_temporal_downsample: int = 4, + num_history_actions: int = 0, +) -> SequencePlan: + """Build a SequencePlan based on the training mode. + + This function determines whether action should be included and computes the + appropriate condition frame indexes for vision and action based on the mode. + + Args: + mode: Training mode. One of: + - "forward_dynamics": Predict video given first frame and all actions + - "inverse_dynamics": Predict actions given all video frames + - "wam": Jointly denoise video and actions given the first frame + video_length: Number of video frames (including the conditioning frame). + action_length: Number of action steps (typically video_length - 1). + has_text: Whether text conditioning is available. Defaults to True. + video_temporal_downsample: Temporal downsampling factor of the video + tokenizer. Used to compute condition frame indexes for inverse + dynamics mode. Defaults to 4. + + Returns: + SequencePlan instance with appropriate settings. + Use ``sequence_plan.has_action`` to check if action should be included. + + Raises: + ValueError: If mode is not one of the supported modes. + + Example: + >>> sequence_plan = build_sequence_plan_from_mode( + ... mode="wam", + ... video_length=5, + ... action_length=4, + ... ) + >>> sequence_plan.has_action + True + >>> sequence_plan.as_dict() + {'has_text': True, 'has_vision': True, 'has_action': True, + 'condition_frame_indexes_vision': [0], 'condition_frame_indexes_action': []} + """ + valid_modes = ["forward_dynamics", "inverse_dynamics", "wam"] + if mode not in valid_modes: + raise ValueError(f"Invalid mode: {mode!r}. Must be one of {valid_modes}") + + # Determine condition frame indexes based on mode + # forward_dynamics/wam: first frame is clean (conditioning) + # inverse_dynamics: all frames are provided as context + if mode in ["forward_dynamics", "wam"]: + condition_frame_indexes_vision = [0] + elif mode == "inverse_dynamics": + # All frames are observed for inverse dynamics + condition_frame_indexes_vision = list(range(0, (video_length - 1) // video_temporal_downsample + 1)) + else: + condition_frame_indexes_vision = [] + + # For action conditioning indexes: + # forward_dynamics: all action steps are clean (conditioning) + # inverse_dynamics/wam: action is supervised (predicted) + # History frames (prepended) are always conditioning. + # + # `base_action_length` is the number of *predicted* action steps, i.e. + # `action_length` minus the prepended history block. There are three + # supported alignments between the action stream and the video stream + # (`video_length` counts the leading conditioning frame at index 0): + # + # Case A (dense video, action = video_length - 1) + # Standard forward-dynamics / WAM layout: one action per gap + # between consecutive video frames, no explicit initial-state + # action. Conditioning actions are only the prepended history. + # + # Case B (dense video, action = video_length) + # `use_state=True` layout: one extra action is prepended to + # encode the initial state, so history + one initial-state + # action are conditioning. + # + # Case C (subsampled video, general action_length > video_length) + # Video is subsampled by an integer factor while the action + # stream stays dense. `has_initial_state` mirrors Case B: it is + # True iff `(base_action_length - 1)` divides evenly by + # `(video_length - 1)`, i.e. the extra initial-state action is + # present. + base_action_length = action_length - num_history_actions + has_initial_state = video_length > 1 and (base_action_length - 1) % (video_length - 1) == 0 + if mode == "forward_dynamics": + condition_frame_indexes_action = list(range(action_length)) + elif base_action_length == video_length - 1: + # Case A: only the history block is conditioning. + condition_frame_indexes_action = list(range(num_history_actions)) + elif base_action_length == video_length: + # Case B: history block + one initial-state action. + condition_frame_indexes_action = list(range(num_history_actions + 1)) + else: + # Case C: same rule as A/B based on whether an initial-state action exists. + condition_frame_indexes_action = list( + range(num_history_actions + 1 if has_initial_state else num_history_actions) + ) + + # `action_start_frame_offset` shifts the action stream so that the first + # non-conditioning action aligns with video frame index 1 (the first + # frame the model must predict). The `-num_history_actions` term + # reserves room for the history block; the additional `+1` (i.e. + # `1 - num_history_actions`) is applied only when there is no + # initial-state action, so the offset skips past the first action + # slot that is instead consumed by the initial state. + if base_action_length == video_length - 1: + action_start_frame_offset = 1 - num_history_actions # Case A + elif base_action_length == video_length: + action_start_frame_offset = -num_history_actions # Case B + else: + # Case C: same rule as A/B based on whether an initial-state action exists. + action_start_frame_offset = -num_history_actions if has_initial_state else 1 - num_history_actions + + return SequencePlan( + has_text=has_text, + has_vision=True, + has_action=True, + condition_frame_indexes_vision=condition_frame_indexes_vision, + condition_frame_indexes_action=condition_frame_indexes_action, + action_start_frame_offset=action_start_frame_offset, + ) + + +class VideoResize: + """Resize and reflection-pad video-aligned tensors for a single sample. + + Resolution is supplied at call time. When ``resolution`` is ``None``, the + tier is auto-detected from the sample's ``"video"`` spatial dimensions. + + Args: + pad_keys: Data-dict keys whose values should be resized and padded. + Pass an empty list to disable padding entirely. Defaults to + ``["video"]``. + keep_aspect_ratio: Whether to resize aspect-preservingly to the closest + predefined target size before padding. Defaults to ``True``. + log_prefix: Prefix used in debug logging. + """ + + def __init__( + self, + pad_keys: list[str] | None = None, + keep_aspect_ratio: bool = True, + log_prefix: str = "VideoResize", + ) -> None: + self.pad_keys = pad_keys if pad_keys is not None else ["video"] + self.keep_aspect_ratio = keep_aspect_ratio + self.log_prefix = log_prefix + + def __call__(self, data_dict: dict, resolution: str | int | None) -> dict: + """Resize and pad a sample in-place. + + Args: + data_dict: Sample dictionary containing a ``"video"`` entry. + resolution: Resolution tier key (e.g. ``"256"``, ``"480"``, + ``"720"``). When ``None``, auto-detected from video dimensions. + + Returns: + The same dictionary, mutated in-place with padded tensors and an + ``"image_size"`` entry. + """ + video = data_dict.get("video") + assert isinstance(video, torch.Tensor), "video is required for reflection padding" + h, w = video.shape[-2:] + + if resolution is None: + resolution = get_vision_data_resolution((h, w)) + + if self.keep_aspect_ratio: + target_w, target_h = find_closest_target_size(h, w, resolution) + else: + target_w = int(resolution) + target_h = int(resolution) + reflection_pad_to_target(data_dict, self.pad_keys, self.keep_aspect_ratio, target_w, target_h) + + return data_dict + + def _log_shapes(self, data_dict: dict, when: str) -> None: + """Log tensor shapes for the configured pad keys.""" + for key in self.pad_keys: + val = data_dict.get(key) + if isinstance(val, torch.Tensor): + log.debug(f"{self.log_prefix}: {when} padding '{key}' shape = {tuple(val.shape)}") + + +class ActionTransformPipeline: + """A composable transform pipeline that chains ``VideoResize``, text + tokenization, and automatic sequence plan construction. + + Reflection padding snaps each sample to the closest predefined aspect + ratio from ``VIDEO_RES_SIZE_INFO[resolution]``, resizes + (aspect-preserving) to fit within the target, then reflection-pads to + the exact target size. This guarantees a bounded set of output shapes + (5 per resolution tier), all multiples of 16. Resolution is supplied + at call time via the required ``resolution`` argument to ``__call__``; + when ``resolution`` is ``None``, the tier is auto-detected from the + video's spatial dimensions via ``get_vision_data_resolution``. + + Text tokenization is enabled when ``tokenizer_config`` is provided. + + When the data dictionary contains a ``"mode"`` key, the pipeline automatically + builds a ``SequencePlan`` via :func:`build_sequence_plan_from_mode` and attaches + it as ``data_dict["sequence_plan"]``. + + Args: + pad_keys: Data-dict keys whose values should be resized and padded. Pass + an empty list to disable padding entirely. Defaults to ``["video"]``. + tokenizer_config: A lazy-instantiable config dict for the VLM tokenizer. When + ``None``, text tokenization is skipped. Defaults to ``None``. + cfg_dropout_rate: Probability of replacing the caption with an empty string for + classifier-free guidance. Only used when text tokenization is enabled. + Defaults to ``0.0``. + caption_key: The data-dict key that contains the input caption string. + Defaults to ``"ai_caption"``. + text_token_key: The data-dict key where tokenized text IDs will be stored. + Defaults to ``"text_token_ids"``. + video_temporal_downsample: Temporal downsampling factor of the video tokenizer. + Used when building a ``SequencePlan`` for ``"inverse_dynamics"`` mode. + Defaults to 4. + max_action_dim: Target action dimension to pad to. The ``"action"`` tensor + in every sample is padded along its last dimension via + :func:`pad_action_to_max_dim`. Defaults to 32. + action_channel_masking: When ``True`` (default), the original action + dimension is stored in ``"raw_action_dim"`` so that the model masks + loss/noise/velocity on zero-padded action channels. When ``False``, + ``"raw_action_dim"`` is set to ``None`` and the model treats all + ``max_action_dim`` channels equally (original main-branch behavior). + append_viewpoint_info: Whether to append viewpoint type metadata to the + caption (via ``ViewpointTextInfo`` augmentor). Requires that + samples contain a ``"viewpoint"`` key. Defaults to ``True``. + append_duration_fps_timestamps: Whether to append duration and FPS metadata to the + caption (matching VFM's ``DurationFPSTextTimeStamps`` augmentor). + Defaults to ``True``. + append_resolution_info: Whether to append resolution metadata to the + caption (matching VFM's ``ResolutionTextInfo`` augmentor). + Defaults to ``True``. + append_idle_frames: Whether to append the idle-frame count out of the + total action frames to the caption (Pi0.7-style metadata, via + ``IdleFramesTextInfo`` augmentor). The dataset is responsible for + populating ``data_dict["idle_frames"]``; samples without it are + silently skipped. Idle-frame text is skipped only for + ``"inverse_dynamics"`` mode. Defaults to ``False`` so existing + experiments are unaffected. + idle_frames_dropout: Per-field dropout rate for the idle-frame segment. + With this probability the augmentor leaves the caption unchanged + (matching Pi0.7's ~5% per-component dropout). Independent of the + global ``cfg_dropout_rate``, which empties the whole caption. + Defaults to 0.05. + format_prompt_as_json: Whether to replace the plain text prompt with a + structured JSON-compatible dictionary before tokenization. When + enabled, legacy string metadata appenders are skipped and the JSON + formatter owns viewpoint, action, resolution, duration, FPS, and + idle-frame fields. Defaults to ``False``. + """ + + def __init__( + self, + pad_keys: list[str] | None = None, + keep_aspect_ratio: bool = True, + tokenizer_config: dict | None = None, + cfg_dropout_rate: float = 0.0, + caption_key: str = "ai_caption", + text_token_key: str = "text_token_ids", + video_temporal_downsample: int = 4, + max_action_dim: int = 32, + action_channel_masking: bool = True, + append_viewpoint_info: bool = True, + append_duration_fps_timestamps: bool = True, + append_resolution_info: bool = True, + append_idle_frames: bool = False, + idle_frames_dropout: float = 0.05, + format_prompt_as_json: bool = False, + ) -> None: + self.caption_key: str = caption_key + self.video_temporal_downsample: int = video_temporal_downsample + self.max_action_dim: int = max_action_dim + self.action_channel_masking: bool = action_channel_masking + self.action_processor: ActionProcessor = ActionProcessor( + max_action_dim=max_action_dim, + action_channel_masking=action_channel_masking, + ) + + # --- Spatial resize/padding stage (resolution supplied at call time) --- + self.video_resize: VideoResize = VideoResize( + pad_keys=pad_keys, + keep_aspect_ratio=keep_aspect_ratio, + log_prefix="ActionTransformPipeline", + ) + self.pad_keys: list[str] = self.video_resize.pad_keys + self.keep_aspect_ratio: bool = self.video_resize.keep_aspect_ratio + + self.prompt_json_formatter: ActionPromptJsonFormatter | None = None + if format_prompt_as_json: + self.prompt_json_formatter = ActionPromptJsonFormatter(caption_key=caption_key) + + # --- Viewpoint text augmentor (runs after ai_caption, before duration/FPS) --- + self.viewpoint_augmentor: ViewpointTextInfo | None = None + if append_viewpoint_info and self.prompt_json_formatter is None: + self.viewpoint_augmentor = ViewpointTextInfo( + input_keys=[caption_key, "viewpoint"], + output_keys=[caption_key], + args={"caption_key": caption_key, "viewpoint_key": "viewpoint", "enabled": True}, + ) + + # --- Duration/FPS text augmentor (runs before tokenization) --- + self.duration_fps_augmentor: DurationFPSTextTimeStamps | None = None + if append_duration_fps_timestamps and self.prompt_json_formatter is None: + self.duration_fps_augmentor = DurationFPSTextTimeStamps( + input_keys=[caption_key, "video", "conditioning_fps"], + output_keys=[caption_key], + args={"caption_key": caption_key, "video_key": "video", "fps_key": "conditioning_fps"}, + ) + + # --- Resolution text augmentor (runs before tokenization) --- + self.resolution_info_augmentor: ResolutionTextInfo | None = None + if append_resolution_info and self.prompt_json_formatter is None: + self.resolution_info_augmentor = ResolutionTextInfo( + input_keys=[caption_key, "video", "image_size"], + output_keys=[caption_key], + args={"caption_key": caption_key, "video_key": "video", "enabled": True}, + ) + + # --- IdleFrames text augmentor (Pi0.7-style episode metadata) --- + # Runs after resolution info, before tokenization. Per-field dropout is + # independent from the tokenizer's global cfg_dropout_rate. + self.idle_frames_augmentor: IdleFramesTextInfo | None = None + if append_idle_frames and self.prompt_json_formatter is None: + self.idle_frames_augmentor = IdleFramesTextInfo( + input_keys=[caption_key, "idle_frames", "action"], + output_keys=[caption_key], + args={ + "caption_key": caption_key, + "idle_frames_key": "idle_frames", + "action_key": "action", + "dropout_rate": idle_frames_dropout, + "enabled": True, + }, + ) + + # --- Text tokenizer augmentor --- + self.text_tokenizer: TextTokenizerTransform | None = None + if tokenizer_config is not None: + self.text_tokenizer = TextTokenizerTransform( + input_keys=[caption_key], + output_keys=[text_token_key], + args={ + "tokenizer_config": tokenizer_config, + "cfg_dropout_rate": cfg_dropout_rate, + }, + ) + + def __call__( + self, + data_dict: dict, + resolution: str | None, + action_normalizer: ActionNormalizer | None = None, + ) -> dict: + """Apply the transform pipeline to a single data dictionary. + + Resolution is required at call time and is the only source of truth + for this sample. When ``resolution`` is ``None``, the tier is + auto-detected from the video's spatial dimensions. + + The pipeline runs in order: + + 1. Resize + reflection-pad spatial dimensions to the closest + predefined target from ``VIDEO_RES_SIZE_INFO[resolution]``. + 2. Format the caption as a structured JSON prompt (if enabled). + 3. Otherwise, append viewpoint type metadata to caption (if enabled). + 4. Append duration/FPS metadata to caption (if enabled). + 5. Append resolution metadata to caption (if enabled). + 6. Append idle-frame metadata (Pi0.7-style) to caption unless the + sample is in inverse dynamics mode (if enabled). + 7. Tokenize caption text (if enabled). + 8. Build a ``SequencePlan`` from the ``"mode"`` key (if present). + 9. Preserve the canonical unnormalized and unpadded action as + ``"action_raw"``, normalize real channels, pad ``"action"`` to + ``max_action_dim``, and attach ``"action_processing_record"``. + + Args: + data_dict: A sample dictionary as returned by a Action dataset. + resolution: Resolution tier key (e.g. ``"256"``, ``"480"``, ``"720"``) + for this sample. When ``None``, auto-detected from video dimensions. + action_normalizer: Optional source-provided action normalizer. When + present, only unpadded real action channels are normalized + before model-space channel padding. + + Returns: + The same dictionary, mutated in-place with padded tensors, + ``image_size``, tokenized text IDs, a ``"sequence_plan"`` entry, + and action processing metadata added. + """ + mode = data_dict.get("mode") + assert mode is not None, "mode is required" + + # 1. Resize + reflection-pad spatial dimensions to the closest predefined target from ``VIDEO_RES_SIZE_INFO[resolution]``. + data_dict = self.video_resize(data_dict, resolution) + + # 2. Format the caption as structured JSON when requested; otherwise run the legacy string appenders. + if self.prompt_json_formatter is not None: + data_dict = self.prompt_json_formatter(data_dict) + else: + # The relabeling is only rendered by the JSON formatter. Drop it + # here so that enabling ``annotation_mode`` without + # ``format_prompt_as_json`` degrades to the plain caption instead of + # leaking a dict into the collate function. + data_dict.pop("relabel_prompt", None) + + # 3. Append viewpoint type metadata to caption (if enabled). + if self.viewpoint_augmentor is not None: + result = self.viewpoint_augmentor(data_dict) + if result is not None: + data_dict = result + + # 4. Append duration/FPS metadata to caption (if enabled). + if self.duration_fps_augmentor is not None: + result = self.duration_fps_augmentor(data_dict) + if result is not None: + data_dict = result + + # 5. Append resolution metadata to caption (if enabled). + if self.resolution_info_augmentor is not None: + result = self.resolution_info_augmentor(data_dict) + if result is not None: + data_dict = result + + # 6. Append idle-frame metadata to caption (if enabled for this mode). + if self.idle_frames_augmentor is not None and _should_append_idle_frame_info(mode): + result = self.idle_frames_augmentor(data_dict) + if result is not None: + data_dict = result + + # 7. Tokenize caption text (if enabled). + if self.text_tokenizer is not None: + data_dict = self.text_tokenizer(data_dict) + + # 8. Build a ``SequencePlan`` from the ``"mode"`` key (if present). + video = data_dict.get("video") + action = data_dict.get("action") + assert video is not None, "video is required" + video_length = video.shape[1] # [C,T,H,W] -> T + action_length = action.shape[0] if isinstance(action, torch.Tensor) else max(video_length - 1, 0) + + # Prepend history action frames (ground-truth conditioning) if present. + history_action = data_dict.pop("history_action", None) + residual_gate = data_dict.get("residual_gate") + num_history_actions = 0 + if history_action is not None and isinstance(action, torch.Tensor): + num_history_actions = history_action.shape[0] + action = torch.cat([history_action, action], dim=0) + action_length += num_history_actions + if isinstance(residual_gate, torch.Tensor): + residual_gate = torch.cat( + [torch.zeros((num_history_actions, 1), dtype=residual_gate.dtype), residual_gate], dim=0 + ) + data_dict["residual_gate"] = residual_gate + + sequence_plan = build_sequence_plan_from_mode( + mode=mode, + video_length=video_length, + action_length=action_length, + video_temporal_downsample=self.video_temporal_downsample, + num_history_actions=num_history_actions, + ) + data_dict["sequence_plan"] = sequence_plan + + assert isinstance(action, torch.Tensor), "action tensor is required for action modes" + data_dict = self.action_processor.preprocess_action( + data_dict, + action, + action_normalizer=action_normalizer, + ) + + return data_dict diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/joint_dataloader.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/joint_dataloader.py new file mode 100644 index 0000000000000000000000000000000000000000..0c1c1a788adb462930b1cf392bc7aef6ffafef14 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/joint_dataloader.py @@ -0,0 +1,1271 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +import math +import queue +import threading +from collections import deque +from collections.abc import Iterator, Mapping +from dataclasses import dataclass +from typing import Any, ClassVar, Dict, Union + +import numpy as np +import torch +import webdataset +from torch.utils.data.dataloader import default_collate + +from cosmos_framework.utils.lazy_config import instantiate +from cosmos_framework.utils import log +from cosmos_framework.model.generator.tokenizers.uniae.frame_math import ( + get_uniae_chunk_frames, + get_uniae_latent_num_frames, + normalize_uniae_chunk_frames, +) +from cosmos_framework.utils.generator.data_utils import read_positive_int_metadata + +_TIMING_KEYS = {"_sample_time", "_aug_time", "_pre_aug_time", "_aug_step_times"} +_BATCH_TIMING_KEYS = { + "_worker_batch_time", + "_worker_aug_time", + "_worker_io_time", + "_worker_aug_step_times", + "_worker_id", +} + + +def custom_collate_fn(batch): + """ + Collate function that works like default_collate for all keys other than "text_token_ids", "images", and "video". + For "text_token_ids", "images", and "video" it simply returns them in a list, instead of stacking them as a tensor. + """ + list_collate_keys = { + "text_token_ids", + "images", + "video", + "action", + "action_raw", + "domain_id", + "sequence_plan", + "sound", + "raw_action_dim", + "image_size", + "action_processing_record", + "residual_gate", + "residual_release_event", + } + + # Data keys where a per-sample value of ``None`` is a meaningful signal + # (e.g. audio extraction failed for that sample → ``sound=None`` paired + # with ``plan.has_sound=False``). These keys must be kept as a list with + # ``None`` placeholders so the model can align per-sample data 1:1 with + # per-sample plans. Dropping the entire key on any None would leave the + # remaining sound tensors mis-aligned with the plans whose ``has_sound`` + # flag was set BEFORE collation, causing ``sequence_packing`` to index + # past the end of ``x0_tokens_sound``. + sparse_data_keys = {"sound"} + + # Handle the case where the batch is already a dictionary (e.g. column-wise batching) + if isinstance(batch, dict): + return {key: (value if key in list_collate_keys else default_collate(value)) for key, value in batch.items()} + + # Handle standard list of samples + elem = batch[0] + if isinstance(elem, dict): + # Some Action datasets add optional metadata keys (for example + # ``additional_view_description`` for concat-view captions) only for a + # subset of samples. PyTorch can batch such samples together when + # DataLoader batch_size > 1; collating only elem's keys and indexing + # every sample by that key turns the optional field into a fatal + # KeyError. Use the union of keys and skip optional keys that are not + # present in every sample. Required training keys still fail loudly via + # downstream assertions if actually missing. + result = {} + keys = set().union(*(d.keys() for d in batch)) + for key in keys: + if key in _TIMING_KEYS: + continue + values = [d.get(key) for d in batch] + if key == "action_processing_record": + result[key] = values + continue + if any(value is None for value in values): + # Sparse data keys keep their None placeholders to preserve + # 1:1 alignment with sequence_plan. Other (optional metadata) + # keys not present in every sample are dropped. + if key in sparse_data_keys: + result[key] = values + continue + if key in list_collate_keys: + result[key] = values + else: + result[key] = default_collate(values) + result.update(_aggregate_worker_timing(batch)) + return result + else: + return default_collate(batch) + + +def _aggregate_worker_timing(samples: list[dict]) -> dict: + """Extract per-sample timing keys, aggregate into per-batch scalars.""" + info: dict[str, float | int] = {} + if "_sample_time" in samples[0]: + info["_worker_batch_time"] = sum(s.get("_sample_time", 0.0) for s in samples) + if "_aug_time" in samples[0]: + aug_total = sum(s.get("_aug_time", 0.0) for s in samples) + info["_worker_aug_time"] = aug_total + if "_worker_batch_time" in info: + info["_worker_io_time"] = info["_worker_batch_time"] - aug_total + if "_aug_step_times" in samples[0]: + agg: dict[str, float] = {} + for s in samples: + for step_name, t in s.get("_aug_step_times", {}).items(): + agg[step_name] = agg.get(step_name, 0.0) + t + info["_worker_aug_step_times"] = agg + worker_info = torch.utils.data.get_worker_info() + info["_worker_id"] = worker_info.id if worker_info is not None else 0 + return info + + +@dataclass +class _PackingMetrics: + """Per-batch packing statistics collected during the packing loop. + + Also serves as the single source of truth for packing-related metric names + via ``STATS_SPEC``, which the dataloading monitor callback consumes to + drive accumulation and logging. + """ + + current_sequence_length: int = 0 + num_samples: int = 0 + dropped_count: int = 0 + from_buffer: int = 0 + from_workers: int = 0 + + STATS_SPEC: ClassVar[list[tuple[str, str, str]]] = [ + # (batch_key, wandb_suffix, aggregation_type) + ("_num_tokens", "token_fraction", "scalar"), + ("_num_samples", "samples_per_batch", "list"), + ("_from_buffer", "from_buffer", "list"), + ("_from_workers", "from_workers", "list"), + ("_buffer_size", "buffer_size", "list"), + ("_dropped_count", "dropped", "scalar"), + ] + + def attach_to(self, output_batch: dict, buffer_size: int) -> None: + """Write packing statistics into the output batch dict.""" + output_batch["_num_tokens"] = self.current_sequence_length + output_batch["_num_samples"] = self.num_samples + output_batch["_from_buffer"] = self.from_buffer + output_batch["_from_workers"] = self.from_workers + output_batch["_buffer_size"] = buffer_size + output_batch["_dropped_count"] = self.dropped_count + + +@dataclass +class _AsyncBatchBuildResult: + """The outcome of building one packed batch.""" + + sequence_id: int + batch: dict[str, Any] | None = None + error: BaseException | None = None + end_of_stream: bool = False + + +class _AsyncBatchBuilder: + """Build one requested batch at a time on a persistent daemon thread. + + The caller submits one sequence ID, the daemon advances the existing + packing iterator once, and the caller receives that exact batch object + from the result queue. A second request is rejected until the first result + is consumed, so at most one future batch is built at a time. + """ + + def __init__(self, batch_iterator: Iterator[dict[str, Any]], timeout_s: float) -> None: + self._batch_iterator: Iterator[dict[str, Any]] = batch_iterator + self._timeout_s: float = timeout_s + self._requests: queue.Queue[int | None] = queue.Queue() + self._results: queue.Queue[_AsyncBatchBuildResult | None] = queue.Queue() + self._outstanding_sequence_id: int | None = None + self._closed: bool = False + self._thread: threading.Thread = threading.Thread(target=self._run, name="async-batch-builder", daemon=True) + self._thread.start() + + @property + def is_alive(self) -> bool: + return self._thread.is_alive() + + def request_batch(self, sequence_id: int) -> None: + """Ask the daemon thread to build exactly one batch.""" + if self._closed: + raise RuntimeError("Cannot request a batch after the async batch builder is closed.") + if self._outstanding_sequence_id is not None: + raise RuntimeError( + "Cannot request another batch while async batch building is already in progress " + f"for sequence_id={self._outstanding_sequence_id}." + ) + self._outstanding_sequence_id = sequence_id + self._requests.put(sequence_id) + + def get_batch(self) -> dict[str, Any]: + """Wait for and return the exact batch object produced for the outstanding request.""" + sequence_id = self._outstanding_sequence_id + if sequence_id is None: + raise RuntimeError("No async batch building request is outstanding.") + if self._closed: + raise RuntimeError("Async batch builder was closed while waiting for a batch.") + + try: + result = self._results.get(timeout=self._timeout_s) + except queue.Empty as error: + producer_alive = self.is_alive + # A timed-out request may still be running in the daemon thread, so it cannot be + # safely abandoned or retried. Close the builder and make the timeout terminal. + self.close() + raise TimeoutError( + f"Timed out waiting for async batch building sequence_id={sequence_id}; " + f"producer_alive={producer_alive}." + ) from error + + if self._closed or result is None: + raise RuntimeError("Async batch builder was closed while waiting for a batch.") + if result.sequence_id != sequence_id: + raise RuntimeError( + "Async batch builder returned an unexpected result: " + f"expected sequence_id={sequence_id}, got sequence_id={result.sequence_id}." + ) + self._outstanding_sequence_id = None + + if result.error is not None: + raise RuntimeError(f"Async batch building failed for sequence_id={sequence_id}.") from result.error + if result.end_of_stream: + raise StopIteration + if result.batch is None: + raise RuntimeError(f"Async batch builder returned no batch for sequence_id={sequence_id}.") + return result.batch + + def _run(self) -> None: + """Build one batch for each request and publish its result by reference.""" + while True: + sequence_id = self._requests.get() + if sequence_id is None or self._closed: + return + + result = _AsyncBatchBuildResult(sequence_id=sequence_id) + try: + result.batch = next(self._batch_iterator) + except StopIteration: + result.end_of_stream = True + except BaseException as error: + result.error = error + + if self._closed: + return + # queue.Queue stores object references within this process. The batch is neither + # copied nor serialized here; the consumer receives the exact dictionary above. + self._results.put(result) + if result.end_of_stream or result.error is not None: + return + + def close(self) -> None: + """Permanently close the builder and perform a bounded join of its daemon thread.""" + if not self._closed: + self._closed = True + self._requests.put(None) + self._results.put(None) + if self._thread is not threading.current_thread(): + self._thread.join(timeout=min(1.0, self._timeout_s)) + + +class JointDataLoader(webdataset.WebLoader): + r""" + A joint dataloader that supports loading both images and videos. + """ + + _DEFAULT_LOOKAHEAD_LIMIT: ClassVar[int] = 10 + + def __init__( + self, + dataloaders: Dict[str, Dict[str, Union[torch.utils.data.DataLoader, webdataset.WebLoader, int]]], + tokenizer_spatial_compression_factor: int, + tokenizer_temporal_compression_factor: int, + patch_spatial: int, + max_sequence_length: int | None, + max_samples_per_batch: int | None, + sound_latent_fps: float = 0, + audio_sample_rate: int = 48000, + prewarm: bool = True, + default_lookahead_limit: int = _DEFAULT_LOOKAHEAD_LIMIT, + lookahead_limits: Dict[str, int] | None = None, + uniae_chunk_frames: int | Mapping[str, int] | None = None, + uniae_pad_frames: int | None = None, + ): + """ + Initialize the JointDataLoader with multiple datasets. + + The effective mini-batch size can be controlled with either max_sequence_length or + max_samples_per_batch. To use max_sequence_length, max_samples_per_batch needs to be None. + Vice versa, to use max_samples_per_batch, max_sequence_length needs to be None. + max_sequence_length and max_samples_per_batch cannot both be None simultaneously. + + Args: + dataloaders: key - dataset_name; value - {"dataloader": dataloader, "ratio": data_ratio} + tokenizer_spatial_compression_factor: The spatial compression factor of the tokenizer. + tokenizer_temporal_compression_factor: The temporal compression factor of the tokenizer. + patch_spatial: Spatial pathification factor. + max_samples_per_batch: Max number of samples per packed batch (alternative to max_sequence_length). + sound_latent_fps: Sound tokenizer latent rate in Hz (e.g. 25). If 0, sound tokens are not counted. + audio_sample_rate: Audio sample rate in Hz (e.g. 48000). Used with sound_latent_fps to estimate + sound token count. + default_lookahead_limit: Packing-loop look-ahead fallback for dataloaders not in + ``lookahead_limits``. + lookahead_limits: Optional ``{dataset_name: int}`` per-dataloader override. + uniae_chunk_frames: Optional UniAE full chunk size, or resolution-keyed chunk sizes. + uniae_pad_frames: Optional UniAE boundary padding frames per chunk. + + Example: + joint_loader = IterativeJointDataLoader( + dataloaders{ + "image_data": { + "dataloader": webdataset.WebLoader(...), + "ratio": 4, + }, + "video_data": { + "dataloader": torch.utils.data.DataLoader(...), + "ratio": 1, + }, + } + ) + """ + self.dataloader_list, self.dataset_name_list, self.data_ratios = [], [], [] + self.lookahead_limits: list[int] = [] + self.tokenizer_spatial_compression_factor = tokenizer_spatial_compression_factor + self.tokenizer_temporal_compression_factor = tokenizer_temporal_compression_factor + self.patch_spatial = patch_spatial + self.max_sequence_length = max_sequence_length + self.max_samples_per_batch = max_samples_per_batch + self.sound_latent_fps = sound_latent_fps + self.audio_sample_rate = audio_sample_rate + self.default_lookahead_limit = int(default_lookahead_limit) + self.uniae_pad_frames = int(uniae_pad_frames) if uniae_pad_frames is not None else None + self.uniae_chunk_frames = self._normalize_uniae_chunk_frames(uniae_chunk_frames) + + assert (self.max_sequence_length is None) != (self.max_samples_per_batch is None), ( + "Exactly one of max_sequence_length or max_samples_per_batch must be None, but not both." + ) + + _lookahead_overrides: Dict[str, int] = dict(lookahead_limits) if lookahead_limits else {} + unknown = set(_lookahead_overrides) - set(dataloaders) + assert not unknown, f"lookahead_limits references unknown dataloaders {unknown}; valid: {sorted(dataloaders)}" + + for dataset_name, dataloader_data in dataloaders.items(): + if dataloader_data is None: + continue + assert set(dataloader_data.keys()) == {"dataloader", "ratio"}, f"Invalid config: {dataloader_data}" + if dataloader_data["ratio"] <= 0: + continue + self.dataset_name_list.append(dataset_name) + self.dataloader_list.append(instantiate(dataloader_data["dataloader"], collate_fn=custom_collate_fn)) + self.data_ratios.append(dataloader_data["ratio"]) + self.lookahead_limits.append(int(_lookahead_overrides.get(dataset_name, self.default_lookahead_limit))) + + self.global_id = 0 + self.ratio_sum = sum(self.data_ratios) + + total = self.ratio_sum if self.ratio_sum > 0 else 1.0 + lines = [f"JointDataLoader: {len(self.dataset_name_list)} streams"] + for name, ratio in zip(self.dataset_name_list, self.data_ratios): + lines.append(f" {name}: ratio={ratio:.4g} ({ratio / total:.1%})") + log.info("\n".join(lines)) + + self.data_len = 0 + self.dataloaders = [iter(dataloader) for dataloader in self.dataloader_list] + self.buffers = [deque() for _ in range(len(self.dataloader_list))] + for data in self.dataloader_list: + self.data_len += len(data) + + # Pre-warm all dataloaders: force worker process spawning and first + # batch loading so that slow dataset initialisation (e.g. action + # datasets with spawn workers) happens here rather than mid-training + # where it would cause NCCL collective timeouts. + if prewarm: + self._prewarm_dataloaders() + else: + log.info( + "JointDataLoader: prewarm DISABLED (debug mode); first iteration may incur per-stream cold-load cost" + ) + + def _normalize_uniae_chunk_frames( + self, uniae_chunk_frames: int | Mapping[str, int] | None + ) -> int | dict[str, int] | None: + return normalize_uniae_chunk_frames( + uniae_chunk_frames, + pad_frames=self.uniae_pad_frames, + temporal_compression_factor=self.tokenizer_temporal_compression_factor, + temporal_divisibility_name="tokenizer_temporal_compression_factor", + ) + + def _get_uniae_chunk_frames(self, spatial_shape: tuple[int, int]) -> int: + assert self.uniae_chunk_frames is not None + return get_uniae_chunk_frames(self.uniae_chunk_frames, spatial_shape=spatial_shape) + + def _compute_vision_latent_t_shape(self, T: int, H: int, W: int) -> int: + if T < 1: + raise ValueError(f"Vision media must contain at least one frame, got {T}.") + if T == 1 or self.uniae_chunk_frames is None: + return 1 + (T - 1) // self.tokenizer_temporal_compression_factor + + assert self.uniae_pad_frames is not None + return get_uniae_latent_num_frames( + T, + self.uniae_chunk_frames, + pad_frames=self.uniae_pad_frames, + temporal_compression_factor=self.tokenizer_temporal_compression_factor, + spatial_shape=(H, W), + ) + + def _prewarm_dataloaders(self) -> None: + """Force all dataloader iterators to spawn workers and produce one batch. + + The first ``next()`` call on an ``InfiniteDataLoader`` iterator triggers + ``DataLoader.__iter__()`` which spawns worker processes. For action + dataloaders using ``multiprocessing_context='spawn'``, each worker must + fully initialise heavy datasets (BridgeOrigLeRobotDataset, embodiment_a, etc.) + from scratch. If this happens lazily during training, the resulting + delay (potentially minutes) causes NCCL collective timeouts when faster + ranks enter the forward pass while slower ranks are still loading data. + + By pulling one batch from every dataloader here — before any training + iteration — we ensure all workers are alive and warmed up. The fetched + samples are pushed into the per-dataloader buffer so they are consumed + normally by the first iteration that selects that dataloader. + + A ``dist.barrier()`` at the end synchronises all ranks so that training + only begins once every rank has finished pre-warming. + """ + import time + + for i, (name, dl_iter) in enumerate(zip(self.dataset_name_list, self.dataloaders)): + t0 = time.monotonic() + try: + batch = next(dl_iter) + except StopIteration: + log.warning(f"Pre-warm: dataloader {name!r} is empty, skipping") + continue + elapsed = time.monotonic() - t0 + + # Split the collated batch into individual samples and push them + # into the buffer — identical to the splitting logic in + # _get_next_sample — so the samples are not wasted. + is_image_batch = "images" in batch + input_images_or_videos = batch["images" if is_image_batch else "video"] + batch_size = len(input_images_or_videos) + + for j in range(batch_size): + sample = {} + for k, v in batch.items(): + if k in _BATCH_TIMING_KEYS: + sample[k] = v + elif isinstance(v, list) and k in self._MULTI_ITEM_KEYS: + elem = v[j] + if isinstance(elem, list): + sample[k] = elem + else: + sample[k] = v[j : j + 1] + elif isinstance(v, list): + sample[k] = v[j] + elif isinstance(v, torch.Tensor) and v.dim() > 0: + sample[k] = v[j : j + 1] + else: + sample[k] = v[j : j + 1] + self.buffers[i].append(sample) + + log.info( + f"Pre-warm: dataloader {name!r} ready — {batch_size} samples buffered in {elapsed:.1f}s", + rank0_only=False, + ) + + # Synchronise so training only starts once every rank is warmed up. + if torch.distributed.is_initialized(): + log.info("Pre-warm: waiting at barrier for all ranks …") + torch.distributed.barrier() + log.info("Pre-warm: all ranks ready") + + def _compute_num_tokens_per_sample(self, data_batch: dict) -> int: + """ + This function computes the number of tokens per sample in the data batch. + This includes text + vision generation tokens + action tokens. + + Args: + data_batch (dict): The data batch containing the text tokens. + + Returns: + int: The number of tokens per sample. + """ + + # The token sequence we have is + # [] + # The spatial dimension of image tokens is compressed by + # vae spatial downsampling factor + pathification + # The temporal dimension of image tokens is compressed by + # vae temporal downsampling factor + # Action tokens have 1 token per time step (no spatial dimension) + + has_text_tokens = "text_token_ids" in data_batch + num_tokens = 0 + if has_text_tokens: + text_token_ids = data_batch["text_token_ids"] + if isinstance(text_token_ids, list): + num_text_tokens = text_token_ids[0].shape[0] + else: + num_text_tokens = text_token_ids.shape[1] + num_tokens += num_text_tokens + 1 + + # Vision part + is_image_batch = "images" in data_batch + input_images_or_videos = data_batch["images" if is_image_batch else "video"] + if "enable_per_camera_vae_encoding" in data_batch: + sample_n_views_values = read_positive_int_metadata(data_batch, "sample_n_views", expected_count=1) + frames_per_view_values = read_positive_int_metadata( + data_batch, + "num_video_frames_per_view", + expected_count=1, + ) + if sample_n_views_values is None or frames_per_view_values is None: + raise ValueError( + "sample_n_views and num_video_frames_per_view are required when per-camera VAE encoding is enabled." + ) + sample_n_views = sample_n_views_values[0] + frames_per_view = frames_per_view_values[0] + else: + sample_n_views = None + frames_per_view = None + + # iterate over all the media in the batch + for media in input_images_or_videos if isinstance(input_images_or_videos, list) else [input_images_or_videos]: + if is_image_batch: + _, H, W = media.shape + T = 1 + else: + _, T, H, W = media.shape + + latent_h_shape = H // self.tokenizer_spatial_compression_factor + latent_w_shape = W // self.tokenizer_spatial_compression_factor + patch_h_shape = math.ceil(latent_h_shape / self.patch_spatial) + patch_w_shape = math.ceil(latent_w_shape / self.patch_spatial) + if sample_n_views is not None and frames_per_view is not None and not is_image_batch: + # The multiview dataset resizes every camera to the same H/W and + # selects the same synchronized frame count before concatenating + # the camera-major clips along T. + expected_frames = sample_n_views * frames_per_view + if T != expected_frames: + raise ValueError( + "Multiview vision length must equal sample_n_views * num_video_frames_per_view: " + f"got T={T}, sample_n_views={sample_n_views}, num_video_frames_per_view={frames_per_view}." + ) + latent_t_shape = sample_n_views * self._compute_vision_latent_t_shape(frames_per_view, H, W) + else: + latent_t_shape = self._compute_vision_latent_t_shape(T, H, W) + + num_vision_tokens = patch_h_shape * patch_w_shape * latent_t_shape + if has_text_tokens: + num_vision_tokens += 2 + num_tokens += num_vision_tokens + + # Action part: each action time step is 1 token. + # Action tensor shape is (T_action, D) per sample; stored as a single-element list. + if "action" in data_batch: + list_of_actions = data_batch["action"] + for action in list_of_actions: + # skip None actions + if action is None: + continue + num_action_tokens = action.shape[0] + num_tokens += num_action_tokens + + # Sound part — estimate sound tokens from audio waveform length + if self.sound_latent_fps > 0 and "sound" in data_batch: + sound_data = data_batch["sound"] + if isinstance(sound_data, list) and len(sound_data) > 0: + first_sound = sound_data[0] + # Unwrap nested list if needed + if isinstance(first_sound, list): + first_sound = first_sound[0] + if first_sound is not None and isinstance(first_sound, torch.Tensor): + num_audio_samples = first_sound.shape[-1] + audio_duration = num_audio_samples / self.audio_sample_rate + num_sound_tokens = int(audio_duration * self.sound_latent_fps) + num_tokens += num_sound_tokens + + return num_tokens + + # Keys whose value per sample is a list of tensors to be flattened into one list in the batch + _FLATTEN_LIST_KEYS = {"image_size"} + + def _update_output_batch(self, output_batch: dict, output: dict): + for key, value in output.items(): + if key in _BATCH_TIMING_KEYS: + if key not in output_batch: + output_batch[key] = value + elif key in self._FLATTEN_LIST_KEYS and isinstance(value, list): + if key not in output_batch: + output_batch[key] = value + else: + output_batch[key].extend(value) + elif key not in output_batch: + output_batch[key] = [value] + else: + output_batch[key].append(value) + + def __len__(self) -> int: + return self.data_len + + # Keys where each sample may hold multiple tensors (e.g. multiple video + # clips in a packed sequence). Kept as single-element lists per sample + # via v[i:i+1] so that _update_output_batch yields list[list[Tensor]]. + _MULTI_ITEM_KEYS = {"text_token_ids", "images", "video", "action", "action_raw", "sound"} + + def _get_next_sample(self, index_id: int) -> dict: + """Pop the next single-sample dict from the buffer for the given dataloader. + + If the buffer is empty, fetches the next collated batch from the inner + dataloader and splits it into individual samples. + + Splitting rules: + - Multi-item list values (keys in ``_MULTI_ITEM_KEYS``): sliced + via ``v[i:i+1]`` to yield a single-element list ``[tensor]``. + A packed sequence can contain multiple items per key. + - Per-sequence metadata list values (all other list keys, e.g. + ``sequence_plan``, ``domain_id``): direct-indexed via ``v[i]`` + to yield the bare element. + - Tensor values ``(B, ...)``: sliced to ``(1, ...)`` via + ``v[i : i + 1]`` to preserve the batch dimension. + + After ``_update_output_batch`` accumulates samples, the packed output + batch has the following shapes: + - Multi-item keys (``text_token_ids``, ``video``, ``images``, + ``action_raw``, ``action``): ``list[list[Tensor]]`` — each inner + list has one element from one sub-sample. + - Per-sequence metadata keys (``sequence_plan``, ``domain_id``, + ``dataset_name``, etc.): ``list[element]`` — flat list. + - Tensor-origin keys: ``list[Tensor(1, ...)]``. + + Args: + index_id: Index of the dataloader to fetch from. + + Returns: + A single-sample dictionary. + """ + buffer = self.buffers[index_id] + if not buffer: + try: + batch = next(self.dataloaders[index_id]) + except StopIteration: + raise + + is_image_batch = "images" in batch + input_images_or_videos = batch["images" if is_image_batch else "video"] + batch_size = len(input_images_or_videos) + + for i in range(batch_size): + sample = {} + for k, v in batch.items(): + if k in _BATCH_TIMING_KEYS: + sample[k] = v + elif isinstance(v, list) and k in self._MULTI_ITEM_KEYS: + # For multi-item keys (images, video, etc.), the collated + # value is a list with one element per sample. If the element + # is itself a list (e.g. image editing: [src, tgt]), use v[i] + # directly to avoid wrapping it in a redundant single-element + # list. Otherwise keep the v[i:i+1] slice so that + # _update_output_batch produces list[list[Tensor]]. + elem = v[i] + if isinstance(elem, list): + sample[k] = elem + else: + sample[k] = v[i : i + 1] + elif isinstance(v, list): + sample[k] = v[i] + else: + sample[k] = v[i : i + 1] + buffer.append(sample) + + return buffer.popleft() + + def set_start_iteration(self, iteration: int): + self.global_id = iteration + + def __iter__(self): + raise NotImplementedError("__iter__ function is not implemented yet") + + +class IterativeJointDataLoader(JointDataLoader): + r""" + An iterative joint dataloader that supports loading multiple modalities. + + The behavior depends on the ``seed`` parameter: + + - **seed is not None** (Default): + The modality is randomly selected at each iteration based on the probability distribution + derived from the ratios. The random state is seeded with ``seed + global_id``, ensuring + that all ranks select the same modality at the same iteration (assuming synchronized global_id). + This prevents load imbalance due to mixed resolutions across ranks. + + - **seed is None**: + The modality selection follows a deterministic round-robin pattern based on the ratios. + For example, with 2 modalities (image and video) and ratio 2:1: + - Iterations 0, 1: all ranks process images + - Iteration 2: all ranks process videos + - ... and so on. + This also ensures all ranks process the same modality at the same iteration. + + ``enable_async_batch_building=True`` advances this same batch iterator on + one daemon thread and builds exactly one future batch. The default keeps + the original calling-thread behavior. + """ + + def __init__( + self, + dataloaders: Dict[str, Dict[str, Union[torch.utils.data.DataLoader, webdataset.WebLoader, int]]], + tokenizer_spatial_compression_factor: int, + tokenizer_temporal_compression_factor: int, + patch_spatial: int, + max_sequence_length: int | None = None, + max_samples_per_batch: int | None = None, + sound_latent_fps: float = 0, + audio_sample_rate: int = 48000, + seed: int | None = 42, + prewarm: bool = True, + default_lookahead_limit: int = JointDataLoader._DEFAULT_LOOKAHEAD_LIMIT, + lookahead_limits: Dict[str, int] | None = None, + uniae_chunk_frames: int | Mapping[str, int] | None = None, + uniae_pad_frames: int | None = None, + enable_async_batch_building: bool = False, + async_batch_building_timeout_s: float = 1200.0, + ) -> None: + if async_batch_building_timeout_s <= 0: + raise ValueError(f"async_batch_building_timeout_s must be positive, got {async_batch_building_timeout_s}.") + # Keep PyTorch/WebDataset/Lance worker creation on the main thread. + # The packer thread starts only after constructor prewarm has completed. + if enable_async_batch_building and not prewarm: + raise ValueError("enable_async_batch_building=True requires prewarm=True.") + + super().__init__( + dataloaders, + tokenizer_spatial_compression_factor, + tokenizer_temporal_compression_factor, + patch_spatial, + max_sequence_length, + max_samples_per_batch, + sound_latent_fps=sound_latent_fps, + audio_sample_rate=audio_sample_rate, + prewarm=prewarm, + default_lookahead_limit=default_lookahead_limit, + lookahead_limits=lookahead_limits, + uniae_chunk_frames=uniae_chunk_frames, + uniae_pad_frames=uniae_pad_frames, + ) + self.seed = seed + # Calculate probabilities for random sampling + total_ratio = sum(self.data_ratios) + self.data_probs = np.array([ratio / total_ratio for ratio in self.data_ratios]) + # Async batch builder state + self.enable_async_batch_building: bool = enable_async_batch_building + self.async_batch_building_timeout_s: float = float(async_batch_building_timeout_s) + self._async_batch_builder: _AsyncBatchBuilder | None = None + + def __iter__(self) -> Iterator[dict[str, Any]]: + if not self.enable_async_batch_building: + return self._iter_synchronous() + return self._iter_asynchronous() + + def _iter_synchronous(self) -> Iterator[dict[str, Any]]: + """Run the existing packing path on the calling thread.""" + while True: + if self.seed is not None: + rng = np.random.RandomState(self.seed + self.global_id) + index_id = rng.choice(len(self.dataloader_list), p=self.data_probs) + else: + data_id = self.global_id % self.ratio_sum + index_id = self._get_dataloader_index(data_id) + + metrics = _PackingMetrics() + output_batch = dict() + skipped_samples = deque() + lookahead_limit = self.lookahead_limits[index_id] + lookahead_count = 0 + + while True: + # Check max samples limit first + if self.max_samples_per_batch is not None and metrics.num_samples >= self.max_samples_per_batch: + break + + # If we have started packing and tried lookahead_limit times to find a fitting sample but failed, stop. + if len(output_batch) > 0 and lookahead_count >= lookahead_limit: + break + + had_buffer = len(self.buffers[index_id]) > 0 + try: + output = self._get_next_sample(index_id) + except StopIteration: + break # No more data in this dataloader + + if had_buffer: + metrics.from_buffer += 1 + else: + metrics.from_workers += 1 + + num_tokens_in_current_sample = self._compute_num_tokens_per_sample(output) + + if ( + self.max_sequence_length is not None + and metrics.current_sequence_length + num_tokens_in_current_sample >= self.max_sequence_length + ): + if len(output_batch) == 0: + # This case happens when current_sequence_length = 0 and num_tokens_in_current_sample > self.max_sequence_length + # In this case, we should simply discard the current sample and get the next sample. + log.info( + f"Discarding oversized sample with {num_tokens_in_current_sample} tokens. Max sequence length: {self.max_sequence_length}", + rank0_only=False, + ) + metrics.dropped_count += 1 + continue + + # current_sequence_length > 0 and selected sample is too large to fit in the remaining space. + # Instead of stopping immediately (creating large padding), we buffer this large sample + # and try to find a smaller one that fits in the remaining space. + skipped_samples.append(output) + lookahead_count += 1 + continue + + metrics.current_sequence_length += num_tokens_in_current_sample + metrics.num_samples += 1 + output["dataset_name"] = self.dataset_name_list[index_id] + self._update_output_batch(output_batch, output) + + # Add back skipped samples to the buffer for the next batch. + # appendleft puts item at HEAD. So we insert S3, then S2, then S1. + for sample in reversed(skipped_samples): + self.buffers[index_id].appendleft(sample) + + if len(output_batch) == 0: + return + + metrics.attach_to(output_batch, buffer_size=len(self.buffers[index_id])) + self.global_id += 1 + yield output_batch + + def _start_async_batch_builder(self) -> _AsyncBatchBuilder: + """Create the async builder and request its first batch.""" + if self._async_batch_builder is not None: + raise RuntimeError("Async batch building has already started.") + async_batch_builder = _AsyncBatchBuilder( + self._iter_synchronous(), + timeout_s=self.async_batch_building_timeout_s, + ) + self._async_batch_builder = async_batch_builder + async_batch_builder.request_batch(self.global_id) + return async_batch_builder + + def _iter_asynchronous(self) -> Iterator[dict[str, Any]]: + """Yield each completed batch while the async builder builds its replacement.""" + async_batch_builder = self._async_batch_builder or self._start_async_batch_builder() + + while True: + try: + batch = async_batch_builder.get_batch() + except StopIteration: + break + + # Request one replacement before yielding. The request queue contains only a + # sequence ID, and the result queue returns this exact batch object by reference. + async_batch_builder.request_batch(self.global_id) + yield batch + + def set_start_iteration(self, iteration: int) -> None: + """Set the batch sequence and eagerly request the first async batch.""" + if self._async_batch_builder is not None: + raise RuntimeError("set_start_iteration must be called before async batch building starts.") + self.global_id = iteration + if self.enable_async_batch_building: + self._start_async_batch_builder() + + def close(self) -> None: + """Permanently stop the optional async batch builder.""" + if self._async_batch_builder is not None: + # Keep the closed builder reference: its bounded join may return while the daemon + # is still blocked in data loading, so starting a replacement could race with it. + self._async_batch_builder.close() + + def _get_dataloader_index(self, data_id: float) -> int: + """Maps global id to the corresponding dataloader index based on ratio.""" + for i, r in enumerate(self.data_ratios): + if data_id < r: + return i + data_id -= r + raise ValueError("Invalid data_id") + + +class RankPartitionedDataLoader: + """Assigns each rank to exactly one dataset based on ratios. + + For N GPUs with datasets having ratios r_1:r_2:...:r_k, the first + N * r_1 / sum(r) ranks are assigned dataset 1, the next N * r_2 / sum(r) + ranks are assigned dataset 2, etc. Each rank instantiates a single + PyTorch DataLoader for its assigned dataset. + + The sharding information (``shard_world_size`` and ``shard_rank``) is set + on each dataset so that it shards data only across ranks that share the + same dataset, rather than across the full world. + + Example: + With 128 GPUs and datasets ``{"video": {"dataset": ..., "ratio": 3}, + "image": {"dataset": ..., "ratio": 1}}``: + + - Ranks 0-95 -> video (shard_world_size=96, shard_rank=0..95) + - Ranks 96-127 -> image (shard_world_size=32, shard_rank=0..31) + """ + + def __init__( + self, + datasets: dict[str, dict[str, Any]], + **dataloader_kwargs: Any, + ): + """ + Args: + datasets: Mapping of dataset name to config dict with keys: + + - ``"dataset"`` (required): a lazy config or dataset instance. + - ``"ratio"`` (required): positive int weight. + - ``"dataloader_kwargs"`` (optional): dict of keyword arguments + that override the top-level ``**dataloader_kwargs`` for this + dataset only (e.g. different ``num_workers`` or ``batch_size``). + + **dataloader_kwargs: Default kwargs forwarded to + ``torch.utils.data.DataLoader``. ``collate_fn`` defaults to + ``custom_collate_fn`` if not given. + """ + world_size = torch.distributed.get_world_size() + rank = torch.distributed.get_rank() + log.info(f"RankPartitionedDataLoader: world_size: {world_size} and rank: {rank}", rank0_only=False) + + _VALID_KEYS = {"dataset", "ratio", "dataloader_kwargs"} + names: list[str] = [] + dataset_configs: list[Any] = [] + ratios: list[int] = [] + per_dataset_kwargs: list[dict[str, Any]] = [] + for name, cfg in datasets.items(): + extra = set(cfg.keys()) - _VALID_KEYS + assert not extra, f"Dataset {name!r}: unexpected keys {extra}. Allowed: {_VALID_KEYS}" + if cfg["ratio"] <= 0: + log.warning( + f"RankPartitionedDataLoader: Skipping dataset {name} with ratio {cfg['ratio']}", rank0_only=False + ) + continue + names.append(name) + dataset_configs.append(cfg["dataset"]) + ratios.append(cfg["ratio"]) + per_dataset_kwargs.append(cfg.get("dataloader_kwargs", {})) + + assert len(names) > 0, "No datasets with positive ratios provided." + assert world_size >= len(names), ( + f"world_size ({world_size}) must be >= number of datasets ({len(names)}) " + f"so each dataset gets at least one rank." + ) + + total_ratio = sum(ratios) + ideal = [r / total_ratio * world_size for r in ratios] + allocations = [max(1, int(q)) for q in ideal] + remaining = world_size - sum(allocations) + if remaining > 0: + remainders = sorted(range(len(ratios)), key=lambda i: ideal[i] - allocations[i], reverse=True) + for j in range(remaining): + allocations[remainders[j]] += 1 + elif remaining < 0: + deficit = -remaining + while deficit > 0: + best = max( + (i for i in range(len(allocations)) if allocations[i] > 1), + key=lambda i: (allocations[i] - ideal[i], allocations[i]), + ) + allocations[best] -= 1 + deficit -= 1 + + expected_ratios = [r / total_ratio for r in ratios] + actual_ratios = [a / world_size for a in allocations] + lines = [f"RankPartitionedDataLoader allocation ({world_size} GPUs):"] + start = 0 + for i, (name, alloc) in enumerate(zip(names, allocations)): + end = start + alloc - 1 + lines.append( + f" {name} (ratio {ratios[i]}): ranks {start}-{end} ({alloc} GPUs) " + f"| expected {expected_ratios[i]:.2%}, actual {actual_ratios[i]:.2%}" + ) + start += alloc + log.info("\n".join(lines), rank0_only=False) + + cumulative = 0 + my_dataset_idx = -1 + for i, alloc in enumerate(allocations): + if rank < cumulative + alloc: + my_dataset_idx = i + break + cumulative += alloc + assert my_dataset_idx >= 0 + + shard_rank = rank - cumulative + shard_world_size = allocations[my_dataset_idx] + + dataset: Any = instantiate(dataset_configs[my_dataset_idx]) + dataset.shard_world_size = shard_world_size + dataset.shard_rank = shard_rank + dataset.shard_id = my_dataset_idx + + merged_kwargs = {**dataloader_kwargs, **per_dataset_kwargs[my_dataset_idx]} + merged_kwargs.setdefault("collate_fn", custom_collate_fn) + self.dataloader = torch.utils.data.DataLoader(dataset, **merged_kwargs) + self.dataset_name = names[my_dataset_idx] + self.dataset = dataset + + def __iter__(self): + return iter(self.dataloader) + + def __len__(self) -> int: + return len(self.dataloader) + + +class PackingDataLoader(JointDataLoader): + """Packs multiple samples from a single dataloader into token-budget-constrained batches. + + Unlike the other ``JointDataLoader`` subclasses which manage multiple + dataloaders with configurable ratios, this class wraps a single dataloader + and greedily packs consecutive samples until the token budget + (``max_sequence_length``) or sample count limit (``max_samples_per_batch``) + is reached. + """ + + def __init__( + self, + dataloader: torch.utils.data.DataLoader | webdataset.WebLoader, + tokenizer_spatial_compression_factor: int, + tokenizer_temporal_compression_factor: int, + patch_spatial: int, + max_sequence_length: int | None = None, + max_samples_per_batch: int | None = None, + sound_latent_fps: float = 0, + audio_sample_rate: int = 48000, + dataset_name: str = "default", + lookahead_limit: int = JointDataLoader._DEFAULT_LOOKAHEAD_LIMIT, + uniae_chunk_frames: int | Mapping[str, int] | None = None, + uniae_pad_frames: int | None = None, + ): + """ + Args: + dataloader: A single dataloader (or lazy config) to draw samples from. + tokenizer_spatial_compression_factor: Spatial compression factor of the tokenizer. + tokenizer_temporal_compression_factor: Temporal compression factor of the tokenizer. + patch_spatial: Spatial patchification factor. + max_sequence_length: Max total tokens per packed batch. Mutually exclusive with + ``max_samples_per_batch``. + max_samples_per_batch: Max number of samples per packed batch. Mutually exclusive + with ``max_sequence_length``. + sound_latent_fps: Sound tokenizer latent rate in Hz. If 0, sound tokens are not counted. + audio_sample_rate: Audio sample rate in Hz. + dataset_name: Name tag attached to every sample in the output batch. + lookahead_limit: Packing-loop look-ahead for the wrapped dataloader. + uniae_chunk_frames: Optional UniAE full chunk size, or resolution-keyed chunk sizes. + uniae_pad_frames: Optional UniAE boundary padding frames per chunk. + """ + wrapped = {dataset_name: {"dataloader": dataloader, "ratio": 1}} + super().__init__( + dataloaders=wrapped, + tokenizer_spatial_compression_factor=tokenizer_spatial_compression_factor, + tokenizer_temporal_compression_factor=tokenizer_temporal_compression_factor, + patch_spatial=patch_spatial, + max_sequence_length=max_sequence_length, + max_samples_per_batch=max_samples_per_batch, + sound_latent_fps=sound_latent_fps, + audio_sample_rate=audio_sample_rate, + lookahead_limits={dataset_name: int(lookahead_limit)}, + uniae_chunk_frames=uniae_chunk_frames, + uniae_pad_frames=uniae_pad_frames, + ) + + def __iter__(self): + inner = self.dataloader_list[0] + ds_name = getattr(inner, "dataset_name", self.dataset_name_list[0]) + + while True: + current_sequence_length = 0 + num_samples = 0 + output_batch: dict = {} + + skipped_samples: deque = deque() + # PackingDataLoader wraps a single dataloader, so lookahead_limits has one entry. + lookahead_limit = self.lookahead_limits[0] + lookahead_count = 0 + + while True: + if self.max_samples_per_batch is not None and num_samples >= self.max_samples_per_batch: + break + + if len(output_batch) > 0 and lookahead_count >= lookahead_limit: + break + + try: + output = self._get_next_sample(0) + except StopIteration: + break + + num_tokens_in_current_sample = self._compute_num_tokens_per_sample(output) + + if ( + self.max_sequence_length is not None + and current_sequence_length + num_tokens_in_current_sample >= self.max_sequence_length + ): + if len(output_batch) == 0: + # This case happens when current_sequence_length = 0 and num_tokens_in_current_sample > self.max_sequence_length + # In this case, we should simply discard the current sample and get the next sample. + log.error( + f"PackingDataLoader: Discarding oversized sample with {num_tokens_in_current_sample} tokens. Max sequence length: {self.max_sequence_length}", + rank0_only=False, + ) + continue + + skipped_samples.append(output) + lookahead_count += 1 + continue + + current_sequence_length += num_tokens_in_current_sample + num_samples += 1 + # Allows the dataset name to be overridden by the sample itself. + output["dataset_name"] = output.get("dataset_name", ds_name) + self._update_output_batch(output_batch, output) + + for sample in reversed(skipped_samples): + self.buffers[0].appendleft(sample) + + if len(output_batch) == 0: + return + + self.global_id += 1 + yield output_batch + + +class RandomJointDataLoader(JointDataLoader): + r""" + A random joint dataloader that supports loading multiple modalities with stochastic sampling. + + In this dataloader, the modality is randomly selected at each iteration based on the + probability distribution derived from the ratios. Each rank independently samples a + modality, so different ranks may process different modalities at the same iteration. + + For example, with 2 modalities (image and video) and ratio 2:1: + - Each iteration has 66.7% probability of selecting images + - Each iteration has 33.3% probability of selecting videos + - The selection is independent across iterations and ranks + + Note: Unlike IterativeJointDataLoader, this does not guarantee synchronized modality + selection across ranks. + """ + + def __init__( + self, + dataloaders: Dict[str, Dict[str, Union[torch.utils.data.DataLoader, webdataset.WebLoader, int]]], + tokenizer_spatial_compression_factor: int, + tokenizer_temporal_compression_factor: int, + patch_spatial: int, + max_sequence_length: int | None = None, + max_samples_per_batch: int | None = None, + sound_latent_fps: float = 0, + audio_sample_rate: int = 48000, + default_lookahead_limit: int = JointDataLoader._DEFAULT_LOOKAHEAD_LIMIT, + lookahead_limits: Dict[str, int] | None = None, + uniae_chunk_frames: int | Mapping[str, int] | None = None, + uniae_pad_frames: int | None = None, + ): + super().__init__( + dataloaders, + tokenizer_spatial_compression_factor, + tokenizer_temporal_compression_factor, + patch_spatial, + max_sequence_length, + max_samples_per_batch, + sound_latent_fps=sound_latent_fps, + audio_sample_rate=audio_sample_rate, + default_lookahead_limit=default_lookahead_limit, + lookahead_limits=lookahead_limits, + uniae_chunk_frames=uniae_chunk_frames, + uniae_pad_frames=uniae_pad_frames, + ) + + # Convert data ratios to probabilities + self.data_ratios = np.array([ratio / sum(self.data_ratios) for ratio in self.data_ratios]) + + def __iter__(self): + while True: + index_id = np.random.choice(len(self.dataloader_list), p=self.data_ratios) + + metrics = _PackingMetrics() + output_batch = dict() + skipped_samples = deque() + lookahead_limit = self.lookahead_limits[index_id] + lookahead_count = 0 + + while True: + # Check max samples limit first + if self.max_samples_per_batch is not None and metrics.num_samples >= self.max_samples_per_batch: + break + + # If we have started packing and tried lookahead_limit times to find a fitting sample but failed, stop. + if len(output_batch) > 0 and lookahead_count >= lookahead_limit: + break + + had_buffer = len(self.buffers[index_id]) > 0 + try: + output = self._get_next_sample(index_id) + except StopIteration: + break # No more data in this dataloader + + if had_buffer: + metrics.from_buffer += 1 + else: + metrics.from_workers += 1 + + num_tokens_in_current_sample = self._compute_num_tokens_per_sample(output) + + if ( + self.max_sequence_length is not None + and metrics.current_sequence_length + num_tokens_in_current_sample >= self.max_sequence_length + ): + if len(output_batch) == 0: + # This case happens when current_sequence_length = 0 and num_tokens_in_current_sample > self.max_sequence_length + # In this case, we should simply discard the current sample and get the next sample. + log.info( + f"Discarding oversized sample with {num_tokens_in_current_sample} tokens. Max sequence length: {self.max_sequence_length}", + rank0_only=False, + ) + metrics.dropped_count += 1 + continue + + # current_sequence_length > 0 and selected sample is too large to fit in the remaining space. + # Instead of stopping immediately (creating large padding), we buffer this large sample + # and try to find a smaller one that fits in the remaining space. + skipped_samples.append(output) + lookahead_count += 1 + continue + + metrics.current_sequence_length += num_tokens_in_current_sample + metrics.num_samples += 1 + output["dataset_name"] = self.dataset_name_list[index_id] + self._update_output_batch(output_batch, output) + + # Add back skipped samples to the buffer for the next batch. + # appendleft puts item at HEAD. So we insert S3, then S2, then S1. + for sample in reversed(skipped_samples): + self.buffers[index_id].appendleft(sample) + + if len(output_batch) == 0: + return + + metrics.attach_to(output_batch, buffer_size=len(self.buffers[index_id])) + yield output_batch diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/modality.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/modality.py new file mode 100644 index 0000000000000000000000000000000000000000..a559f4d0d2409d702a78676a19f5a3538e9059bf --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/modality.py @@ -0,0 +1,256 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Modality utility helpers for VFM sequence packing.""" + +from dataclasses import dataclass, field + +import torch + + +def _empty_long_tensor() -> torch.Tensor: + return torch.empty(0, dtype=torch.long) # [0] + + +def _empty_float_tensor() -> torch.Tensor: + return torch.empty(0, dtype=torch.float32) # [0] + + +@dataclass +class ModalitySpan: + """One contiguous packed span paired with its logical modality payload slice. + + Attributes: + sequence_start: First global packed-sequence index owned by this span. + sequence_len: Number of contiguous tokens in the packed sequence. + payload_index: Index into ``ModalityData.tokens`` for the backing payload tensor. + payload_start: First flattened token offset within the backing payload tensor. + payload_len: Number of flattened payload tokens covered by this span. + payload_shape: Logical payload slice shape. For example, vision frame spans use + ``(1, patch_h, patch_w)``, action spans use ``(tcf,)``, and sound spans use + ``(1, 1, 1)``. + """ + + sequence_start: int + sequence_len: int + payload_index: int + payload_start: int + payload_len: int + payload_shape: tuple[int, ...] + + +@dataclass +class ModalityDataBuilder: + """Append-only construction state for a single generation modality. + + Attributes: + spans: Contiguous packed spans pointing back into grouped payload tensors. + sequence_indexes: Global packed-sequence indexes for all tokens of this modality. + timesteps: Diffusion timesteps for noised tokens only. + mse_loss_indexes: Global packed-sequence indexes where MSE loss should be computed. + token_shapes: Shape metadata for each payload tensor. Vision and sound use + ``(T, H, W)``-style tuples; action uses ``(T,)``. + tokens: Original modality payload tensors, kept grouped by sample/item. + condition_mask: Per-payload masks where 1 indicates clean/conditioning tokens + and 0 indicates noised/supervised tokens. + noisy_frame_indexes: Per-payload indexes of noised frames. These are constructed + during packing to avoid GPU-to-CPU synchronization later. + """ + + spans: list[ModalitySpan] = field(default_factory=list) + sequence_indexes: list[int] = field(default_factory=list) + timesteps: list[float] = field(default_factory=list) + mse_loss_indexes: list[int] = field(default_factory=list) + # list[tuple[int,int,int]] for vision, list[tuple[int]] for action, list[tuple[int,int,int]] for sound + token_shapes: list[tuple[int, ...]] = field(default_factory=list) + tokens: list[torch.Tensor] = field(default_factory=list) + condition_mask: list[torch.Tensor] = field(default_factory=list) + noisy_frame_indexes: list[torch.Tensor] = field(default_factory=list) + + +@dataclass +class ModalityData: + """Finalized model-facing data for a single generation modality. + + Index-like fields are tensors after packing. Payload fields remain lists + because samples may have variable token shapes and because downstream code + mutates token payloads after noise injection and clean replay. + + Attributes: + sequence_indexes: Tensor of global packed-sequence indexes for all tokens of + this modality. + timesteps: Tensor of diffusion timesteps for noised tokens only. + mse_loss_indexes: Tensor of global packed-sequence indexes where MSE loss + should be computed. + spans: Contiguous packed spans pointing back into grouped payload tensors. + token_shapes: Shape metadata for each payload tensor. Vision and sound use + ``(T, H, W)``-style tuples; action uses ``(T,)``. + tokens: Original modality payload tensors, kept grouped by sample/item. + condition_mask: Per-payload masks where 1 indicates clean/conditioning tokens + and 0 indicates noised/supervised tokens. + noisy_frame_indexes: Per-payload indexes of noised frames. + domain_id: Domain IDs for multi-domain training. Only used for action. + raw_action_dim: Raw action dimensions. Only used for action-channel masking. + """ + + sequence_indexes: torch.Tensor = field(default_factory=_empty_long_tensor) + timesteps: torch.Tensor = field(default_factory=_empty_float_tensor) + mse_loss_indexes: torch.Tensor = field(default_factory=_empty_long_tensor) + spans: list[ModalitySpan] = field(default_factory=list) + # list[tuple[int,int,int]] for vision, list[tuple[int]] for action, list[tuple[int,int,int]] for sound + token_shapes: list[tuple[int, ...]] = field(default_factory=list) + tokens: list[torch.Tensor] = field(default_factory=list) + condition_mask: list[torch.Tensor] = field(default_factory=list) + noisy_frame_indexes: list[torch.Tensor] = field(default_factory=list) + domain_id: list[torch.Tensor] = field(default_factory=list) + raw_action_dim: list[torch.Tensor | None] | None = field(default_factory=list) + # Optional per-token gate for an action residual expert. + residual_gate: list[torch.Tensor] | None = None + + def __post_init__(self) -> None: + assert isinstance(self.sequence_indexes, torch.Tensor), "ModalityData.sequence_indexes must be finalized" + assert isinstance(self.timesteps, torch.Tensor), "ModalityData.timesteps must be finalized" + assert isinstance(self.mse_loss_indexes, torch.Tensor), "ModalityData.mse_loss_indexes must be finalized" + + def to_cuda(self) -> None: + """Move all tensor fields to CUDA in-place.""" + self.sequence_indexes = self.sequence_indexes.cuda() + self.timesteps = self.timesteps.cuda() + self.mse_loss_indexes = self.mse_loss_indexes.cuda() + self.tokens = [token.cuda() for token in self.tokens] + self.condition_mask = [cm.cuda() for cm in self.condition_mask] + self.noisy_frame_indexes = [ni.cuda() for ni in self.noisy_frame_indexes] + self.domain_id = [d.cuda() for d in self.domain_id] + # raw_action_dim is optional (e.g., when action-channel masking is disabled). + if self.raw_action_dim is not None: + self.raw_action_dim = [d.cuda() if d is not None else None for d in self.raw_action_dim] + if self.residual_gate is not None: + self.residual_gate = [gate.cuda() for gate in self.residual_gate] + + +def prepare_attention_mask_per_sample(split_lens, attn_modes, device="cpu"): + """Prepare dense attention mask for a single sample with multiple splits. + + Args: + split_lens: List of integers indicating length of each split within the sample + attn_modes: List of attention modes for each split ('causal', 'full', or 'noise') + device: Device to place the attention mask tensor on + + Returns: + Attention mask tensor of shape (sample_len, sample_len) with -inf for masked positions + """ + sample_len = sum(split_lens) + attention_mask = torch.zeros((sample_len, sample_len), dtype=torch.bool, device=device) # [sample_len,sample_len] + + # First pass: Set up basic attention patterns for each split + current_pos = 0 + for split_len, attn_mode in zip(split_lens, attn_modes): + assert attn_mode in ["causal", "full", "noise"], f"Invalid attention mode: {attn_mode}" + + split_start = current_pos + split_end = current_pos + split_len + + if attn_mode == "causal": + # Causal: lower triangular within split + full attention to previous splits + attention_mask[split_start:split_end, split_start:split_end] = torch.ones( + (split_len, split_len), device=device + ).tril() # [split_len,split_len] + attention_mask[split_start:split_end, :split_start] = 1 + else: # "full" or "noise" + # Full attention within split and to previous splits + attention_mask[split_start:split_end, split_start:split_end] = torch.ones( + (split_len, split_len), device=device + ) # [split_len,split_len] + attention_mask[split_start:split_end, :split_start] = 1 + + current_pos += split_len + + # Second pass: Handle noise mode - mask out noise columns except within same split + current_pos = 0 + for split_len, attn_mode in zip(split_lens, attn_modes): + if attn_mode == "noise": + split_start = current_pos + split_end = current_pos + split_len + + # Zero out the entire column for noise tokens + attention_mask[:, split_start:split_end] = 0 + # But allow self-attention within the noise split + attention_mask[split_start:split_end, split_start:split_end] = 1 + + current_pos += split_len + + # Convert boolean mask to float with -inf for masked positions + attention_mask = torch.zeros_like(attention_mask, dtype=torch.float).masked_fill_( + ~attention_mask, float("-inf") + ) # [sample_len,sample_len] + + return attention_mask + + +# ============================================================================ +# Tokenizer utilities +# ============================================================================ + + +def add_special_tokens(tokenizer): + """Add image-related special tokens to tokenizer if not already present. + + Args: + tokenizer: Tokenizer to add special tokens to + + Returns: + Tuple of (modified tokenizer, dict of new token IDs) + """ + # Collect existing special tokens + existing_special_tokens = [] + for key, value in tokenizer.special_tokens_map.items(): + if isinstance(value, str): + existing_special_tokens.append(value) + elif isinstance(value, list): + existing_special_tokens.extend(value) + + # Define image boundary tokens to add if missing + tokens_to_add = [] + if "<|vision_start|>" not in existing_special_tokens: + tokens_to_add.append("<|vision_start|>") + if "<|vision_end|>" not in existing_special_tokens: + tokens_to_add.append("<|vision_end|>") + + # Add new tokens to tokenizer vocabulary + if tokens_to_add: + tokenizer.add_tokens(tokens_to_add) + + # Get token IDs for image boundary tokens + new_token_ids = { + "start_of_generation": tokenizer.convert_tokens_to_ids("<|vision_start|>"), + "end_of_generation": tokenizer.convert_tokens_to_ids("<|vision_end|>"), + } + + return tokenizer, new_token_ids + + +def compute_text_split_length( + num_caption_tokens: int, + special_tokens: dict[str, int], + has_generation: bool = True, +) -> int: + """Compute the total text split length without mutating any state. + + This is the number of token positions occupied by the text split in a + packed sequence: caption tokens + optional BOS + EOS + optional BOV. + + Args: + num_caption_tokens: Number of raw caption token IDs (before special tokens). + special_tokens: Dictionary of special token IDs (checked for ``"bos_token_id"``). + has_generation: Whether a start-of-generation (BOV) token follows text. + + Returns: + Total text split length (positions consumed in the packed sequence). + """ + n = num_caption_tokens + if "bos_token_id" in special_tokens: + n += 1 + n += 1 # EOS + if has_generation: + n += 1 # start-of-generation / BOV + return n diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/packers.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/packers.py new file mode 100644 index 0000000000000000000000000000000000000000..2bfa28b8d56a6a02f1722fa01ba2f50465007f11 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/packers.py @@ -0,0 +1,446 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Top-level input sequence packing orchestration.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import torch + +from cosmos_framework.data.generator.sequence_packing.sequence import PackedSequence, PackedSequenceBuilder, SequencePlan +from cosmos_framework.data.generator.sequence_packing.temporal_causal import pack_supertokens_temporal_causal + +if TYPE_CHECKING: + from cosmos_framework.model.generator.utils.data_and_condition import GenerationDataClean + + +def _get_optional_fps( + fps_values: torch.Tensor | list[torch.Tensor | float] | None, + index: int, +) -> float | None: + """Return an optional FPS value as a float. + + Args: + fps_values: Optional tensor/list of per-sample or per-item FPS values. + index: Entry to read from ``fps_values``. + + Returns: + FPS value as ``float`` when present, otherwise ``None``. + """ + if fps_values is None or index >= len(fps_values): + return None + fps_value = fps_values[index] # [] + if isinstance(fps_value, torch.Tensor): + return float(fps_value.item()) + return float(fps_value) + + +def pack_input_sequence( + sequence_plans: list[SequencePlan], + input_text_indexes: list[list[int]], + gen_data_clean: GenerationDataClean, + input_timesteps: torch.Tensor, + special_tokens: dict[str, int], + max_num_tokens: int | None = None, + latent_patch_size: int = 1, + skip_text_tokens: bool = False, + include_end_of_generation_token: bool = False, + unified_3d_mrope_reset_spatial_ids: bool = True, + unified_3d_mrope_temporal_modality_margin: int = 0, + enable_fps_modulation: bool = False, + base_fps: float = 24.0, + sound_base_temporal_compression_factor: int | None = None, + temporal_compression_factor: int = 4, + vision_temporal_position_mode: str = "latent_index", + video_temporal_causal: bool = False, + action_dim: int = 32, + initial_mrope_temporal_offset: int | float = 0, + num_behavior_prefix_tokens: int = 0, + num_online_memory_prefix_tokens: int = 0, + num_proprio_prefix_tokens: int = 0, +) -> PackedSequence: + """ + Pack a sequence of input strings and VAE latents into a packed tensor format. + Uses SequencePlan to determine which modalities are present for each sample, + and maintains separate indices for text, vision, action, and sound to handle variable modality presence. + + Args: + sequence_plans: List of SequencePlan items describing which modalities are present. + input_text_indexes: List of text token ID sequences (only for samples where has_text=True). + gen_data_clean: GenerationDataClean containing vision, action, and sound tensors. + - x0_tokens_vision: Vision tensors for samples where has_vision=True + - x0_tokens_action: Action tensors for samples where has_action=True + - x0_tokens_sound: Sound tensors (list of [C, T]) for samples where has_sound=True + input_timesteps: Diffusion timesteps for each sample. Shape (B,) or (B, 1) for + teacher_forcing/none (all frames share the same sigma), or (B, T_max) for + diffusion_forcing (per-frame independent sigma). Entries are extracted per + sample as a float (numel==1) or Tensor(T_max,) for per-frame indexing. + special_tokens: Dictionary containing special token IDs (eos_token_id, start_of_generation, end_of_generation) + max_num_tokens: Maximum number of tokens in the packed sequence + latent_patch_size: Patch size used by the network to pack latents + skip_text_tokens: If True, skip packing text tokens + include_end_of_generation_token: If True, append end-of-generation token + unified_3d_mrope_reset_spatial_ids: If True (default), spatial (H, W) indices + start from 0 for each vision segment. If False, spatial indices are offset + by the temporal offset (Qwen2VL-style). + unified_3d_mrope_temporal_modality_margin: Extra temporal offset inserted between + text and generation modalities. + enable_fps_modulation: If True, scale temporal position IDs based on video FPS + to reflect real time. Requires fps_vision in gen_data_clean. + Uses the same flag as diffusion_expert_config.enable_fps_modulation. + base_fps: Base FPS for normalization (default 24.0). + Uses the same value as diffusion_expert_config.base_fps. + sound_base_temporal_compression_factor: Base temporal compression factor for sound FPS scaling. + ``None`` preserves the current behavior where sound advances at ``base_fps`` positions/sec. + temporal_compression_factor: VAE temporal compression factor (default 4). + Obtained from the VAE tokenizer at runtime. + vision_temporal_position_mode: Temporal coordinates used for unified_3d_mrope vision tokens. + "latent_index" keeps legacy positions; "uniae_source_right_edge" uses + per-latent positions from gen_data_clean.temporal_positions_vision. + video_temporal_causal: If True, pack vision and optional action as temporal-causal + supertokens instead of separate modality blocks. + action_dim: Action feature dimension used when temporal-causal packing creates + null action tokens. + initial_mrope_temporal_offset: Initial temporal cursor for each sample, used by + autoregressive inference to seed mRoPE positions. + num_behavior_prefix_tokens: Number of learned causal condition slots to + reserve before text for each action-bearing sample. Zero preserves + every existing Cosmos packing layout. + + Returns: + PackedSequence containing all packed tensors and metadata. See PackedSequence for field details. + """ + del max_num_tokens + + assert special_tokens is not None, "Special tokens must be provided" + assert isinstance(input_timesteps, torch.Tensor), "input_timesteps must be a tensor" + if input_timesteps.is_cuda: + raise ValueError("input_timesteps must be on CPU, not CUDA") + if isinstance(input_text_indexes, torch.Tensor): + raise ValueError("input_text_tokens must be a list, not a tensor") + + supported_vision_temporal_position_modes = {"latent_index", "uniae_source_right_edge"} + if vision_temporal_position_mode not in supported_vision_temporal_position_modes: + raise ValueError( + "Unsupported vision_temporal_position_mode: " + f"{vision_temporal_position_mode}. Supported modes: {supported_vision_temporal_position_modes}." + ) + has_any_vision = any(plan.has_vision for plan in sequence_plans) + explicit_vision_temporal_positions_active = vision_temporal_position_mode != "latent_index" and has_any_vision + if explicit_vision_temporal_positions_active: + if gen_data_clean.temporal_positions_vision is None: + raise ValueError( + f"vision_temporal_position_mode={vision_temporal_position_mode} requires " + "gen_data_clean.temporal_positions_vision." + ) + if gen_data_clean.x0_tokens_vision is not None and len(gen_data_clean.temporal_positions_vision) != len( + gen_data_clean.x0_tokens_vision + ): + raise ValueError( + "temporal_positions_vision must have one entry per x0_tokens_vision item, " + f"got {len(gen_data_clean.temporal_positions_vision)} positions for " + f"{len(gen_data_clean.x0_tokens_vision)} vision items." + ) + if video_temporal_causal: + raise NotImplementedError( + "video_temporal_causal=True is not wired for explicit UniAE vision temporal positions yet." + ) + if any(plan.has_action for plan in sequence_plans): + raise NotImplementedError("Action packing is not wired for explicit UniAE vision temporal positions yet.") + if initial_mrope_temporal_offset != 0: + raise NotImplementedError( + "Autoregressive mRoPE temporal offsets are not wired for explicit UniAE vision temporal positions yet." + ) + use_float_mrope_positions = enable_fps_modulation or explicit_vision_temporal_positions_active + + # Initialize mutable builder state for sequence construction. + seq_builder = PackedSequenceBuilder(uses_single_timestep=input_timesteps.numel() == 1) + + # Configure 3D mRoPE on the builder. + seq_builder._mrope_reset_spatial = unified_3d_mrope_reset_spatial_ids + + # Maintain separate indices for each modality + idx_text = 0 + idx_vision = 0 + idx_action = 0 + idx_sound = 0 + null_action_flags: list[bool] = [] # collected from TC path; asserted consistent after the loop + + # Validate: all samples must have text (causal split is always required for two-way attention). + # CFG dropout only drops text *content*, not the structural text split. + if not skip_text_tokens: + for plan in sequence_plans: + assert plan.has_text, "All sequence plans must have has_text=True when skip_text_tokens=False" + + # Pack each sample based on its sequence plan + for sample_idx, sequence_plan in enumerate(sequence_plans): + sample_len = 0 + + # mRoPE temporal offset resets per sample. + # initial_mrope_temporal_offset is non-zero only for AR inference (frame N seeds at N*tcf). + seq_builder.begin_sample(initial_mrope_temporal_offset) + + _ts = input_timesteps[sample_idx] + input_timestep = _ts.item() if _ts.numel() == 1 else _ts # float (TF) or Tensor(T_max,) (DF) + + # Pack text tokens if has_text=True and not skipped + if sequence_plan.has_text and not skip_text_tokens: + text_ids = input_text_indexes[idx_text] + idx_text += 1 + + has_generation_for_sample = sequence_plan.has_vision or sequence_plan.has_action or sequence_plan.has_sound + text_sample_len = seq_builder.pack_text_tokens( + text_ids, + special_tokens, + has_generation=has_generation_for_sample, + use_float_positions=use_float_mrope_positions, + num_behavior_prefix_tokens=( + num_behavior_prefix_tokens if sequence_plan.has_action else 0 + ), + num_online_memory_prefix_tokens=( + num_online_memory_prefix_tokens if sequence_plan.has_action else 0 + ), + num_proprio_prefix_tokens=( + num_proprio_prefix_tokens if sequence_plan.has_action else 0 + ), + ) + sample_len += text_sample_len + + # End of text modality, add an offset as the boundary between text and vision. + seq_builder.advance_mrope_temporal_offset(unified_3d_mrope_temporal_modality_margin) + + # Save temporal offset before vision for action tokens (action uses same offset as vision start) + vision_start_temporal_offset = seq_builder.mrope_temporal_offset + + # Pack vision (and optionally action) tokens + if video_temporal_causal and sequence_plan.has_vision: + # Temporal causal path: when sequence_plan.has_action=True, interleaved supertokens + # [action_t, vision_t]; when False, supertokens are just vision patches. + input_vision_tokens = gen_data_clean.x0_tokens_vision[idx_vision] + idx_vision += 1 + + vision_fps = _get_optional_fps(gen_data_clean.fps_vision, idx_vision - 1) + + input_action_tokens_tc: torch.Tensor | None = None + action_fps_tc = None + if sequence_plan.has_action: + input_action_tokens_tc = gen_data_clean.x0_tokens_action[idx_action] + action_fps_tc = _get_optional_fps(gen_data_clean.fps_action, idx_action) + idx_action += 1 + + supertoken_split_len, null_flag = pack_supertokens_temporal_causal( + seq_builder=seq_builder, + input_vision_tokens=input_vision_tokens, + input_action_tokens=input_action_tokens_tc, + condition_frame_indexes_vision=sequence_plan.condition_frame_indexes_vision, + input_timestep=input_timestep, + latent_patch_size=latent_patch_size, + temporal_compression_factor=temporal_compression_factor, + action_dim=action_dim, + vision_fps=vision_fps, + action_fps=action_fps_tc, + enable_fps_modulation=enable_fps_modulation, + base_fps=base_fps, + pack_action_tokens=sequence_plan.has_action, + ) + null_action_flags.append(null_flag) + # We assume all samples in a batch share the same has_action layout, so + # stamp the supertoken layout constant directly here. This is the + # single source of truth read by downstream attention / KV-cache + # code (no recomputation in the network). + seq_builder.num_action_tokens_per_supertoken = ( + temporal_compression_factor if sequence_plan.has_action else 0 + ) + sample_len += supertoken_split_len + vision_split_len = supertoken_split_len + action_split_len = 0 # Already absorbed into supertoken_split_len + + else: + # Standard path: vision and action packed separately + if sequence_plan.has_vision: + # Determine how many vision items this sample owns. + # For multi-item samples (e.g. image editing), num_vision_items_per_sample + # records [2, 2, ...]; for standard T2I/T2V it is None (1 item per sample). + num_vis = ( + gen_data_clean.num_vision_items_per_sample[sample_idx] + if gen_data_clean.num_vision_items_per_sample is not None + else 1 + ) + + vision_split_len = 0 + # Per-item split lengths for multi-control attention routing. + # Only tracked when control_weights are present (inference-only); + # skipped during training to avoid unnecessary side effects. + track_item_split_lens = gen_data_clean.control_weights is not None + sample_item_split_lens: list[int] = [] + # Controlnet-style transfer: when set, all vision items share the same + # temporal mRoPE grid. We snapshot the offset before the loop and + # rewind to it before each item, so every item produces identical + # temporal IDs. Each pack_vision_tokens call still advances the + # offset by latent_t internally; in shared-grid mode the post-loop + # offset equals snapshot + latent_t (single-clip semantics for + # downstream EOV / next-modality tokens). + shared_grid = sequence_plan.share_vision_temporal_positions and num_vis > 1 + items_temporal_offset_snapshot = seq_builder.mrope_temporal_offset + shared_latent_t: int | None = None + shared_patch_h: int | None = None + shared_patch_w: int | None = None + shared_temporal_positions: torch.Tensor | None = None + # FPS is recorded per-sample (shape [B]); for multi-item samples + # (transfer / image-edit) every vision item in this sample shares + # the same conditioning FPS, so we read by sample_idx, not by the + # flat idx_vision counter (which would alias to a neighbor sample's + # fps and corrupt RoPE FPS modulation). + sample_vision_fps = _get_optional_fps(gen_data_clean.fps_vision, sample_idx) + + for item_idx in range(num_vis): + flat_vision_idx = idx_vision + input_vision_tokens = gen_data_clean.x0_tokens_vision[flat_vision_idx] # [1,C,T,H,W] + vision_temporal_positions: torch.Tensor | None = None + if explicit_vision_temporal_positions_active: + assert gen_data_clean.temporal_positions_vision is not None + vision_temporal_positions = gen_data_clean.temporal_positions_vision[flat_vision_idx] # [T] + if vision_temporal_positions.shape[0] != input_vision_tokens.shape[2]: + raise ValueError( + "vision_temporal_positions must match latent_t for each vision item, " + f"got {vision_temporal_positions.shape[0]} positions and " + f"latent_t={input_vision_tokens.shape[2]} for item {flat_vision_idx}." + ) + idx_vision += 1 + + # Determine conditioning for this vision item. + # For multi-item mode: all items except the last are fully conditioned + # (all frames are clean); the last item uses the SequencePlan's + # condition_frame_indexes_vision (typically [] = fully generated). + if num_vis > 1 and item_idx < num_vis - 1: + # Conditioning item (e.g. source image): mark all frames as clean + latent_t = input_vision_tokens.shape[2] + item_condition_frames = list(range(latent_t)) + else: + # Generation item (single-item mode or last item in multi-item) + item_condition_frames = sequence_plan.condition_frame_indexes_vision + + if shared_grid: + item_latent_t = input_vision_tokens.shape[2] + item_latent_h = input_vision_tokens.shape[3] + item_latent_w = input_vision_tokens.shape[4] + if shared_latent_t is None: + shared_latent_t = item_latent_t + shared_patch_h = item_latent_h + shared_patch_w = item_latent_w + else: + assert item_latent_t == shared_latent_t, ( + f"share_vision_temporal_positions requires equal latent_t across items, " + f"got item {item_idx} latent_t={item_latent_t} vs first={shared_latent_t}" + ) + assert item_latent_h == shared_patch_h and item_latent_w == shared_patch_w, ( + f"share_vision_temporal_positions requires equal spatial grid across items, " + f"got item {item_idx} (H,W)=({item_latent_h},{item_latent_w}) " + f"vs first=({shared_patch_h},{shared_patch_w})" + ) + if vision_temporal_positions is not None: + if shared_temporal_positions is None: + shared_temporal_positions = vision_temporal_positions + else: + comparison_temporal_positions = vision_temporal_positions.to( + device=shared_temporal_positions.device + ) # [T] + assert torch.allclose(comparison_temporal_positions, shared_temporal_positions), ( + "share_vision_temporal_positions requires equal explicit temporal positions " + f"across vision items, got item {item_idx} positions " + f"{vision_temporal_positions.tolist()} vs first " + f"{shared_temporal_positions.tolist()}." + ) + # Rewind so this item starts at the same temporal offset as item 0. + seq_builder.set_mrope_temporal_offset(items_temporal_offset_snapshot) + + item_split_len = seq_builder.pack_vision_tokens( + input_vision_tokens=input_vision_tokens, + condition_frame_indexes_vision=item_condition_frames, + input_timestep=input_timestep, + latent_patch_size=latent_patch_size, + vision_fps=sample_vision_fps, + enable_fps_modulation=enable_fps_modulation, + base_fps=base_fps, + temporal_compression_factor=temporal_compression_factor, + vision_temporal_positions=vision_temporal_positions, + ) + vision_split_len += item_split_len + if track_item_split_lens: + sample_item_split_lens.append(item_split_len) + + if track_item_split_lens: + seq_builder.vision_item_split_lens.append(sample_item_split_lens) + sample_len += vision_split_len + + else: + vision_split_len = 0 + + # Pack action tokens if has_action=True + if sequence_plan.has_action: + input_action_tokens = gen_data_clean.x0_tokens_action[idx_action] + action_fps = _get_optional_fps(gen_data_clean.fps_action, idx_action) + idx_action += 1 + + action_split_len = seq_builder.pack_action_tokens( + input_action_tokens=input_action_tokens, + condition_frame_indexes_action=sequence_plan.condition_frame_indexes_action, + input_timestep=input_timestep, + action_temporal_offset=vision_start_temporal_offset, + enable_fps_modulation=enable_fps_modulation, + base_fps=base_fps, + action_fps=action_fps, + base_temporal_compression_factor=temporal_compression_factor, + action_start_frame_offset=sequence_plan.action_start_frame_offset, + ) + sample_len += action_split_len + else: + action_split_len = 0 + + # Pack sound tokens if has_sound=True + if sequence_plan.has_sound: + input_sound_tokens = gen_data_clean.x0_tokens_sound[idx_sound] + sound_fps = _get_optional_fps(gen_data_clean.fps_sound, idx_sound) + idx_sound += 1 + + sound_split_len = seq_builder.pack_sound_tokens( + input_sound_tokens=input_sound_tokens, + condition_frame_indexes_sound=sequence_plan.condition_frame_indexes_sound, + input_timestep=input_timestep, + sound_temporal_offset=vision_start_temporal_offset, + enable_fps_modulation=enable_fps_modulation, + base_fps=base_fps, + sound_fps=sound_fps, + sound_base_temporal_compression_factor=sound_base_temporal_compression_factor, + ) + sample_len += sound_split_len + else: + sound_split_len = 0 + + # Add end-of-generation token if needed + eov_len = 0 + has_any_generation = sequence_plan.has_vision or sequence_plan.has_action or sequence_plan.has_sound + if include_end_of_generation_token and has_any_generation: + eov_len = seq_builder.append_end_of_generation_token( + token_id=special_tokens["end_of_generation"], + use_float_mrope_positions=use_float_mrope_positions, + ) + sample_len += eov_len + + combined_split_len = vision_split_len + action_split_len + sound_split_len + eov_len + seq_builder.finish_sample(combined_split_len, sample_len) + + # Assert consistent null_action_supertokens across all TC samples, then set once + if null_action_flags: + assert len(set(null_action_flags)) == 1, ( + f"Inconsistent null_action_supertokens across samples: {null_action_flags}. " + "All samples in a batch must have the same structure (all training or all AR inference)." + ) + seq_builder.null_action_supertokens = null_action_flags[0] + + # Finalize and return packed data + return seq_builder.finalize( + gen_data_clean=gen_data_clean, + ) diff --git a/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/sequence.py b/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/sequence.py new file mode 100644 index 0000000000000000000000000000000000000000..8fd04852c192485b9ffe2fad687d1054e08e4355 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/data/generator/sequence_packing/sequence.py @@ -0,0 +1,1203 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Sequence builder/output and plan helpers for VFM sequence packing.""" + +from __future__ import annotations + +import math +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +import torch + +from cosmos_framework.data.generator.sequence_packing.modality import ModalityData, ModalityDataBuilder, ModalitySpan +from cosmos_framework.data.generator.sequence_packing.mrope import ( + get_3d_mrope_ids_text_tokens, + get_3d_mrope_ids_vae_tokens, +) +from cosmos_framework.data.generator.sequence_packing.runtime import ( + SequencePackMetadata, + prepare_sequence_pack_metadata, +) + +if TYPE_CHECKING: + from cosmos_framework.model.generator.utils.data_and_condition import GenerationDataClean + + +def _empty_long_tensor() -> torch.Tensor: + return torch.empty(0, dtype=torch.long) # [0] + + +@dataclass +class PackedSequenceBuilder: + """Mutable construction state for sequence packing. + + Attributes: + sample_lens: Length of each sample in the packed sequence. + split_lens: Length of each attention split. Each sample contributes a causal + text split and a full generation split. + attn_modes: Attention mode for each split, such as ``"causal"`` or ``"full"``. + is_image_batch: Whether this batch contains images rather than videos. + uses_single_timestep: Whether all noised tokens share one input timestep scalar. + sequence_length: Total packed sequence length. Filled during finalization. + current_seq_index: Next global packed-sequence index to append. + text_ids: Text token IDs accumulated during packing, including special tokens. + text_indexes: Global packed-sequence indexes for text tokens. + position_ids: mRoPE position ID blocks accumulated as ``[3, N]`` tensors. + label_ids: Label IDs for text cross-entropy loss. + ce_loss_indexes: Global packed-sequence indexes for text cross-entropy loss. + ce_loss_weights: Per-token weights for text cross-entropy loss. + _mrope_temporal_offset: Running temporal cursor for per-sample mRoPE generation. + _mrope_reset_spatial: Whether spatial mRoPE IDs reset for each segment. + null_action_supertokens: Whether temporal-causal supertoken 0 contains null + action tokens. + num_action_tokens_per_supertoken: Number of action tokens prefixing each + temporal-causal vision supertoken. + vision: Vision modality construction state, or ``None`` if no vision was appended. + action: Action modality construction state, or ``None`` if no action was appended. + sound: Sound modality construction state, or ``None`` if no sound was appended. + vision_item_split_lens: Per-sample per-vision-item token counts for multi-control + transfer. + control_weights: Per-sample per-control weights for multi-control weighted V-scaling. + """ + + # Sequence structure + sample_lens: list[int] = field(default_factory=list) + split_lens: list[int] = field(default_factory=list) + attn_modes: list[str] = field(default_factory=list) + is_image_batch: bool = False + uses_single_timestep: bool = False + sequence_length: int = 0 + + # Build-time tracking (used during packing, not after finalize) + current_seq_index: int = 0 + + # Text modality append state + text_ids: list[int] = field(default_factory=list) + text_indexes: list[int] = field(default_factory=list) + # Learned non-text condition slots that share the causal/understanding + # attention split with text. Zeva reserves one such slot per action-bearing + # sample and overwrites it with the projected task context. + behavior_indexes: list[int] = field(default_factory=list) + online_memory_indexes: list[int] = field(default_factory=list) + proprio_indexes: list[int] = field(default_factory=list) + position_ids: list[torch.Tensor] = field(default_factory=list) + + # Loss computation - Cross Entropy (text) + label_ids: list[int] = field(default_factory=list) + ce_loss_indexes: list[int] = field(default_factory=list) + ce_loss_weights: list[float] = field(default_factory=list) + + # Build-time mRoPE tracking (used during packing, not after finalize). + # position_ids accumulates (3, N) tensors and finalize() produces a + # (3, total_seq_len) tensor. + # Running temporal index for mRoPE position ID generation within a single sample. + # Reset to 0 at the start of each sample, then advanced by text and vision helpers + # as segments are packed. Action reuses the pre-vision snapshot (parallel temporal + # range) without advancing it. Float when FPS modulation is enabled. + # E.g. offset=0 -> text(4 tokens) -> offset=4 -> vision(3 frames) -> offset=7. + _mrope_temporal_offset: int | float = 0 + _mrope_reset_spatial: bool = True + + # Temporal causal: whether supertoken 0's action slot contains null tokens. + # True for all training calls and AR frame 0; False for AR frame N>0 (real actions). + # Used by three_way_attention to zero out V for null action tokens (inline when attention_meta.null_action_supertokens=True). + null_action_supertokens: bool = False + + # Temporal causal: number of action tokens prefixing each vision supertoken. + # Equals temporal_compression_factor when actions are packed inline; 0 when + # action_gen=False or for non-temporal-causal layouts. Single source of truth + # for downstream attention/KV-cache code (per-supertoken layout is + # num_action_tokens_per_supertoken + H_p * W_p). + num_action_tokens_per_supertoken: int = 0 + + # Generation modality construction state + vision: ModalityDataBuilder | None = None + action: ModalityDataBuilder | None = None + sound: ModalityDataBuilder | None = None + + def ensure_vision(self) -> ModalityDataBuilder: + """Return the vision builder, creating it on first use. + + Returns: + Vision ``ModalityDataBuilder`` for subsequent append operations. + """ + if self.vision is None: + self.vision = ModalityDataBuilder() + return self.vision + + def ensure_action(self) -> ModalityDataBuilder: + """Return the action builder, creating it on first use. + + Returns: + Action ``ModalityDataBuilder`` for subsequent append operations. + """ + if self.action is None: + self.action = ModalityDataBuilder() + return self.action + + def ensure_sound(self) -> ModalityDataBuilder: + """Return the sound builder, creating it on first use. + + Returns: + Sound ``ModalityDataBuilder`` for subsequent append operations. + """ + if self.sound is None: + self.sound = ModalityDataBuilder() + return self.sound + + # Multi-control transfer: per-sample list of per-vision-item token counts. + # For a multi-control transfer sample with N controls + 1 noisy target, + # vision_item_split_lens[i] = [L_ctrl0, L_ctrl1, ..., L_ctrlN-1, L_noisy]. + # Used by cosmos3_vfm_network.py to derive gen-relative control/noisy ranges + # for multi_control_two_way_attention. + vision_item_split_lens: list[list[int]] = field(default_factory=list) + + # Per-sample per-control weights for multi-control weighted V-scaling. + # Parallel to vision_item_split_lens[i][:-1] (excludes noisy item). + # None for non-transfer or standard single-control samples. + control_weights: list[list[float]] | None = None + + @property + def mrope_temporal_offset(self) -> int | float: + """Current per-sample temporal cursor used for mRoPE position generation.""" + return self._mrope_temporal_offset + + def set_mrope_temporal_offset(self, temporal_offset: int | float) -> None: + """Set the per-sample temporal cursor used for mRoPE position generation. + + Args: + temporal_offset: New mRoPE temporal cursor value. + """ + self._mrope_temporal_offset = temporal_offset + + def advance_mrope_temporal_offset(self, delta: int | float) -> None: + """Advance the per-sample temporal cursor by ``delta``. + + Args: + delta: Amount to add to the current mRoPE temporal cursor. + """ + self._mrope_temporal_offset += delta + + def begin_sample(self, initial_mrope_temporal_offset: int | float) -> None: + """Reset per-sample position cursors before appending sample tokens. + + Args: + initial_mrope_temporal_offset: Initial mRoPE temporal cursor for this sample. + """ + self._mrope_temporal_offset = initial_mrope_temporal_offset + + def pack_text_tokens( + self, + text_ids: list[int], + special_tokens: dict[str, int], + has_generation: bool, + use_float_positions: bool = False, + num_behavior_prefix_tokens: int = 0, + num_online_memory_prefix_tokens: int = 0, + num_proprio_prefix_tokens: int = 0, + ) -> int: + """Pack text tokens into the sequence. + + Args: + text_ids: List of text token IDs (integers). + special_tokens: Dictionary of special token IDs. + has_generation: Whether there's media/action after text. + use_float_positions: If True, generate float position IDs for 3D mRoPE + (for consistency with FPS-modulated vision tokens). + + Returns: + Text sample length. + """ + if num_behavior_prefix_tokens < 0: + raise ValueError("num_behavior_prefix_tokens must be non-negative") + if num_online_memory_prefix_tokens < 0: + raise ValueError("num_online_memory_prefix_tokens must be non-negative") + if num_proprio_prefix_tokens < 0: + raise ValueError("num_proprio_prefix_tokens must be non-negative") + + # Reserve learned causal-prompt slots before BOS, matching Zeva's + # [causal prompt | image | language] prefix order. They are deliberately not + # represented by tokenizer IDs and therefore do not participate in CE. + if num_behavior_prefix_tokens: + behavior_position_ids, self._mrope_temporal_offset = get_3d_mrope_ids_text_tokens( + num_tokens=num_behavior_prefix_tokens, + temporal_offset=self._mrope_temporal_offset, + use_float_positions=use_float_positions, + ) + behavior_start = self.current_seq_index + self.behavior_indexes.extend( + range(behavior_start, behavior_start + num_behavior_prefix_tokens) + ) + self._append_position_ids(behavior_position_ids, num_behavior_prefix_tokens) + self.current_seq_index += num_behavior_prefix_tokens + + if num_online_memory_prefix_tokens: + online_position_ids, self._mrope_temporal_offset = get_3d_mrope_ids_text_tokens( + num_tokens=num_online_memory_prefix_tokens, + temporal_offset=self._mrope_temporal_offset, + use_float_positions=use_float_positions, + ) + online_start = self.current_seq_index + self.online_memory_indexes.extend( + range(online_start, online_start + num_online_memory_prefix_tokens) + ) + self._append_position_ids(online_position_ids, num_online_memory_prefix_tokens) + self.current_seq_index += num_online_memory_prefix_tokens + + if num_proprio_prefix_tokens: + proprio_position_ids, self._mrope_temporal_offset = get_3d_mrope_ids_text_tokens( + num_tokens=num_proprio_prefix_tokens, + temporal_offset=self._mrope_temporal_offset, + use_float_positions=use_float_positions, + ) + proprio_start = self.current_seq_index + self.proprio_indexes.extend(range(proprio_start, proprio_start + num_proprio_prefix_tokens)) + self._append_position_ids(proprio_position_ids, num_proprio_prefix_tokens) + self.current_seq_index += num_proprio_prefix_tokens + + # Prepend BOS token if available + if "bos_token_id" in special_tokens: + shifted_text_ids = [special_tokens["bos_token_id"]] + text_ids + else: + shifted_text_ids = text_ids + + span_token_ids = shifted_text_ids + [special_tokens["eos_token_id"]] + # Add start-of-generation token, but only if there's media/action present. + if has_generation: + span_token_ids.append(special_tokens["start_of_generation"]) + + text_split_len = len(span_token_ids) + split_len = ( + num_behavior_prefix_tokens + + num_online_memory_prefix_tokens + + num_proprio_prefix_tokens + + text_split_len + ) + expected_split_len = len(text_ids) + if "bos_token_id" in special_tokens: + expected_split_len += 1 + expected_split_len += 1 # EOS + if has_generation: + expected_split_len += 1 # start-of-generation / BOV + assert text_split_len == expected_split_len + + position_ids, self._mrope_temporal_offset = get_3d_mrope_ids_text_tokens( + num_tokens=text_split_len, + temporal_offset=self._mrope_temporal_offset, + use_float_positions=use_float_positions, + ) # position_ids: [3,text_split_len] + + span_start, _ = self.append_text_span(span_token_ids, position_ids) + + # Configure loss computation for text tokens + self.ce_loss_indexes.extend(range(span_start, span_start + len(shifted_text_ids))) + self.ce_loss_weights.extend([1.0] * len(shifted_text_ids)) + self.label_ids.extend(text_ids[1:] + [special_tokens["eos_token_id"]]) + + self.attn_modes.append("causal") + self.split_lens.append(split_len) + + return split_len + + def pack_vision_tokens( + self, + input_vision_tokens: torch.Tensor, + condition_frame_indexes_vision: list[int], + input_timestep: float | torch.Tensor, + latent_patch_size: int = 1, + vision_fps: float | None = None, + enable_fps_modulation: bool = False, + base_fps: float = 24.0, + temporal_compression_factor: int = 4, + vision_temporal_positions: torch.Tensor | None = None, + ) -> int: + """Pack vision tokens into the sequence. + + Args: + input_vision_tokens: Vision latent tokens (C, T, H, W). + condition_frame_indexes_vision: Indexes of conditioning frames. + input_timestep: Diffusion timestep. Either a float (teacher_forcing/none — all frames + share the same sigma) or a Tensor(T_max,) (diffusion_forcing — per-frame sigma; + indexed as input_timestep[frame_idx] for each noisy frame). + latent_patch_size: Patch size for latent patchification. + vision_fps: Frames per second of the video. Used when enable_fps_modulation=True. + enable_fps_modulation: If True, scale temporal position IDs based on video FPS. + base_fps: Base FPS for normalization (default 24.0). + temporal_compression_factor: VAE temporal compression factor (default 4). + vision_temporal_positions: Optional explicit temporal coordinate per latent + frame, shape ``(T,)``. Used by UniAE to account for kept boundary latents. + + Returns: + Vision split length. + """ + vision = self.ensure_vision() + + # Compute position IDs for image patches + _, _, latent_t, latent_h, latent_w = input_vision_tokens.shape + if latent_patch_size < 1: + raise ValueError(f"latent_patch_size must be >= 1, got {latent_patch_size}") + # Use ceil to support latent dims not divisible by patch size (padding handled in network) + patch_h = math.ceil(latent_h / latent_patch_size) + patch_w = math.ceil(latent_w / latent_patch_size) + vision.token_shapes.append((latent_t, patch_h, patch_w)) + vision.tokens.append(input_vision_tokens) + vision_payload_index = len(vision.tokens) - 1 + + # Supervise vision tokens based on conditioning frames + condition_set = {idx for idx in condition_frame_indexes_vision if 0 <= idx < latent_t} + + vision_condition_mask = torch.zeros( + (latent_t, 1, 1), device=input_vision_tokens.device, dtype=input_vision_tokens.dtype + ) # [T,1,1] + for frame_idx in condition_set: + vision_condition_mask[frame_idx, 0, 0] = 1.0 + vision.condition_mask.append(vision_condition_mask) + + vision_noisy_frame_indexes = torch.tensor( + [idx for idx in range(latent_t) if idx not in condition_set], + device=input_vision_tokens.device, + dtype=torch.long, + ) # [N_noisy_frames] + vision.noisy_frame_indexes.append(vision_noisy_frame_indexes) + + frame_token_stride = patch_h * patch_w + effective_fps = vision_fps if enable_fps_modulation else None + if vision_temporal_positions is not None: + vision_temporal_positions = vision_temporal_positions.to(device="cpu", dtype=torch.float32) # [T] + + vision_mrope_ids, self._mrope_temporal_offset = get_3d_mrope_ids_vae_tokens( + grid_t=latent_t, + grid_h=patch_h, + grid_w=patch_w, + temporal_offset=self._mrope_temporal_offset, + reset_spatial_indices=self._mrope_reset_spatial, + fps=effective_fps, + base_fps=base_fps, + temporal_compression_factor=temporal_compression_factor, + temporal_positions=vision_temporal_positions, + actual_temporal_compression_factor=temporal_compression_factor, + ) # vision_mrope_ids: [3,N_vision_tokens] + vision_mrope_ids = vision_mrope_ids.reshape(3, latent_t, frame_token_stride) # [3,T,H*W] + + vision_split_len = 0 + for frame_idx in range(latent_t): + position_ids = vision_mrope_ids[:, frame_idx, :] # [3,H*W] + frame_indexes = self.append_vision_span( + frame_token_stride, + position_ids, + payload_index=vision_payload_index, + payload_start=frame_idx * frame_token_stride, + payload_shape=(1, patch_h, patch_w), + ) + vision_split_len += frame_token_stride + + if frame_idx in condition_set: + continue + vision.mse_loss_indexes.extend(frame_indexes) + if isinstance(input_timestep, torch.Tensor): + frame_ts = input_timestep[frame_idx].item() + else: + frame_ts = input_timestep + vision.timesteps.extend([frame_ts] * frame_token_stride) + + return vision_split_len + + def pack_action_tokens( + self, + input_action_tokens: torch.Tensor, + condition_frame_indexes_action: list[int], + input_timestep: float, + action_temporal_offset: int | float = 0, + enable_fps_modulation: bool = False, + base_fps: float = 24.0, + action_fps: float | None = None, + base_temporal_compression_factor: int | None = None, + action_start_frame_offset: int = 1, + ) -> int: + """Pack action tokens into the sequence. + + Args: + input_action_tokens: Action latent tokens (T, D). + condition_frame_indexes_action: Indexes of conditioning action steps. + input_timestep: Diffusion timestep. + action_temporal_offset: Temporal offset for action mRoPE IDs (typically + the vision start offset so action aligns temporally with vision). + enable_fps_modulation: If True, scale temporal position IDs based on FPS. + base_fps: Base FPS for normalization (default 24.0). + action_fps: Frames per second of the action data. Used when enable_fps_modulation=True. + base_temporal_compression_factor: Base temporal compression factor for FPS scaling. + Should be set to the vision temporal compression factor (e.g. 4) so that action + tokens advance at frame rate (4x finer) relative to vision latent frames. + Only affects behavior when FPS modulation is enabled. + action_start_frame_offset: Frame offset for aligning action[0] with the + corresponding vision frame. Default 1 aligns action[0] with vision frame 1. + + Returns: + Number of action tokens added. + """ + action_split_len = input_action_tokens.shape[0] + + action = self.ensure_action() + + # Add token indexes and loss information + action.token_shapes.append((action_split_len,)) + action.tokens.append(input_action_tokens) + action_payload_index = len(action.tokens) - 1 + + condition_set = {idx for idx in condition_frame_indexes_action if 0 <= idx < action_split_len} + + action_condition_mask = torch.zeros( + (action_split_len, 1), device=input_action_tokens.device, dtype=input_action_tokens.dtype + ) # [T_action,1] + for frame_idx in condition_set: + action_condition_mask[frame_idx, 0] = 1.0 + action.condition_mask.append(action_condition_mask) + + action_noisy_frame_indexes = torch.tensor( + [idx for idx in range(action_split_len) if idx not in condition_set], + device=input_action_tokens.device, + dtype=torch.long, + ) # [N_noisy_action_frames] + action.noisy_frame_indexes.append(action_noisy_frame_indexes) + + # Action tokens use a 1x1 spatial grid with start_frame_offset=1 by default, + # so action[0] (null token) aligns with vision frame 1, not frame 0. + effective_fps = action_fps if enable_fps_modulation else None + + action_mrope_ids, _ = get_3d_mrope_ids_vae_tokens( + grid_t=action_split_len, + grid_h=1, + grid_w=1, + temporal_offset=action_temporal_offset, + reset_spatial_indices=self._mrope_reset_spatial, + fps=effective_fps, + base_fps=base_fps, + temporal_compression_factor=1, # Action is at frame rate (no temporal compression) + base_temporal_compression_factor=base_temporal_compression_factor, + start_frame_offset=action_start_frame_offset, # Align action[0] with vision frame action_start_frame_offset + ) # action_mrope_ids: [3,N_action_tokens] + # Note: we don't update _mrope_temporal_offset here because action tokens + # share the temporal space with vision tokens (they run in parallel). + + for frame_idx in range(action_split_len): + position_ids = action_mrope_ids[:, frame_idx : frame_idx + 1] # [3,1] + frame_indexes = self.append_action_span( + 1, + position_ids, + payload_index=action_payload_index, + payload_start=frame_idx, + payload_shape=(1,), + ) + + if frame_idx in condition_set: + continue + action.mse_loss_indexes.extend(frame_indexes) + action.timesteps.extend([input_timestep]) + + return action_split_len + + def pack_sound_tokens( + self, + input_sound_tokens: torch.Tensor, + condition_frame_indexes_sound: list[int], + input_timestep: float, + sound_temporal_offset: int | float = 0, + enable_fps_modulation: bool = False, + base_fps: float = 24.0, + sound_fps: float | None = None, + sound_base_temporal_compression_factor: int | None = None, + ) -> int: + """Pack sound/audio tokens into the sequence. + + Sound latents have shape [C, T] where C is channels and T is temporal frames. + Sound tokens are added to the unified generation split to maintain SequencePack's + 2-split invariant (causal + full). + + Args: + input_sound_tokens: Sound latent tokens (C, T). + condition_frame_indexes_sound: Indexes of conditioning frames. + [] means all frames are noised/supervised. + All frames specified means all frames are clean (no MSE supervision). + input_timestep: Diffusion timestep. + sound_temporal_offset: Temporal offset for m-RoPE position IDs (aligned with vision start). + enable_fps_modulation: If True, scale temporal positions by FPS ratio. + base_fps: Base FPS for normalization (default 24.0). + sound_fps: Sound latent FPS (e.g., 25.0). Used for FPS-aware m-RoPE positions. + sound_base_temporal_compression_factor: Base temporal compression factor for sound FPS scaling. + ``None`` preserves the current behavior where sound advances at ``base_fps`` positions/sec. + + Returns: + Number of sound tokens added. + """ + # Sound latent shape: [C, T] → T tokens + _, sound_split_len = input_sound_tokens.shape + + sound = self.ensure_sound() + + # Add token indexes - sound uses (T, 1, 1) shape for compatibility with 3D RoPE + sound.token_shapes.append((sound_split_len, 1, 1)) + sound.tokens.append(input_sound_tokens) + sound_payload_index = len(sound.tokens) - 1 + + # Supervise sound tokens based on conditioning frames + condition_set = {idx for idx in condition_frame_indexes_sound if 0 <= idx < sound_split_len} + + # Condition mask: shape (T, 1) — 1 = clean/conditioning, 0 = noised/supervised + sound_condition_mask = torch.zeros( + (sound_split_len, 1), device=input_sound_tokens.device, dtype=input_sound_tokens.dtype + ) # [T_sound,1] + for frame_idx in condition_set: + sound_condition_mask[frame_idx, 0] = 1.0 + sound.condition_mask.append(sound_condition_mask) + + sound_noisy_frame_indexes = torch.tensor( + [idx for idx in range(sound_split_len) if idx not in condition_set], + device=input_sound_tokens.device, + dtype=torch.long, + ) # [N_noisy_sound_frames] + sound.noisy_frame_indexes.append(sound_noisy_frame_indexes) + + # Sound tokens use a 1x1 spatial grid, aligned with vision temporal positions. + # sound[0] aligns with vision frame 0 (start_frame_offset=0, unlike action which offsets by 1). + effective_fps = sound_fps if enable_fps_modulation else None + + sound_mrope_ids, _ = get_3d_mrope_ids_vae_tokens( + grid_t=sound_split_len, + grid_h=1, + grid_w=1, + temporal_offset=sound_temporal_offset, + reset_spatial_indices=self._mrope_reset_spatial, + fps=effective_fps, + base_fps=base_fps, + temporal_compression_factor=1, # Sound latent is already at sound_latent_fps (no further compression) + base_temporal_compression_factor=sound_base_temporal_compression_factor, + start_frame_offset=0, # Sound[0] aligns with vision frame 0 + ) # sound_mrope_ids: [3,N_sound_tokens] + # Note: we don't update _mrope_temporal_offset here because sound tokens + # share the temporal space with vision tokens (they run in parallel). + + # Add to MSE loss indexes and timesteps for non-conditioning frames + for frame_idx in range(sound_split_len): + position_ids = sound_mrope_ids[:, frame_idx : frame_idx + 1] # [3,1] + frame_indexes = self.append_sound_span( + 1, + position_ids, + payload_index=sound_payload_index, + payload_start=frame_idx, + payload_shape=(1, 1, 1), + ) + + if frame_idx in condition_set: + continue + sound.mse_loss_indexes.extend(frame_indexes) + sound.timesteps.extend([input_timestep]) + + return sound_split_len + + def _append_position_ids(self, position_ids: torch.Tensor, span_len: int) -> None: + """Append one block of position IDs. + + Args: + position_ids: Position ID tensor with shape ``[3, span_len]``. + span_len: Number of token positions described by ``position_ids``. + """ + assert position_ids.shape[-1] == span_len, ( + f"position_ids last dimension must match span_len={span_len}; got {tuple(position_ids.shape)}" + ) + self.position_ids.append(position_ids) + + def _append_modality_span( + self, + modality: ModalityDataBuilder, + span_len: int, + position_ids: torch.Tensor, + *, + payload_index: int, + payload_start: int, + payload_shape: tuple[int, ...], + ) -> list[int]: + """Append one modality span and return its global sequence indexes. + + Args: + modality: Modality builder receiving sequence indexes and span metadata. + span_len: Number of contiguous tokens to append. + position_ids: Position ID tensor with shape ``[3, span_len]``. + payload_index: Index into ``modality.tokens`` for the backing payload tensor. + payload_start: First flattened token offset within the backing payload tensor. + payload_shape: Logical payload slice shape represented by this span. + + Returns: + Global packed-sequence indexes covered by the appended span. + """ + assert payload_index >= 0, f"payload_index must be non-negative, got {payload_index}" + assert payload_start >= 0, f"payload_start must be non-negative, got {payload_start}" + payload_len = 1 + for dim in payload_shape: + assert dim > 0, f"payload_shape dimensions must be positive, got {payload_shape}" + payload_len *= dim + assert payload_len == span_len, ( + f"payload_shape={payload_shape} describes {payload_len} tokens, but span_len={span_len}" + ) + + span_start = self.current_seq_index + span_indexes = list(range(span_start, span_start + span_len)) + modality.spans.append( + ModalitySpan( + sequence_start=span_start, + sequence_len=span_len, + payload_index=payload_index, + payload_start=payload_start, + payload_len=payload_len, + payload_shape=payload_shape, + ) + ) + modality.sequence_indexes.extend(span_indexes) + self._append_position_ids(position_ids, span_len) + self.current_seq_index += span_len + return span_indexes + + def append_text_span( + self, + token_ids: list[int], + position_ids: torch.Tensor, + ) -> tuple[int, int]: + """Append one contiguous text span. + + Args: + token_ids: Text token IDs to append. + position_ids: Position ID tensor with shape ``[3, len(token_ids)]``. + + Returns: + Tuple of ``(start_index, span_len)`` for the appended span. + """ + span_start = self.current_seq_index + span_len = len(token_ids) + self.text_ids.extend(token_ids) + self.text_indexes.extend(range(span_start, span_start + span_len)) + self._append_position_ids(position_ids, span_len) + self.current_seq_index += span_len + return span_start, span_len + + def append_vision_span( + self, + span_len: int, + position_ids: torch.Tensor, + *, + payload_index: int, + payload_start: int, + payload_shape: tuple[int, int, int], + ) -> list[int]: + """Append one contiguous vision span. + + Args: + span_len: Number of contiguous vision tokens to append. + position_ids: Position ID tensor with shape ``[3, span_len]``. + payload_index: Index into ``vision.tokens`` for the backing payload tensor. + payload_start: First flattened token offset within the backing vision payload. + payload_shape: Logical vision slice shape, usually ``(1, patch_h, patch_w)``. + + Returns: + Global packed-sequence indexes covered by the appended vision span. + """ + return self._append_modality_span( + self.ensure_vision(), + span_len, + position_ids, + payload_index=payload_index, + payload_start=payload_start, + payload_shape=payload_shape, + ) + + def append_action_span( + self, + span_len: int, + position_ids: torch.Tensor, + *, + payload_index: int, + payload_start: int, + payload_shape: tuple[int], + ) -> list[int]: + """Append one contiguous action span. + + Args: + span_len: Number of contiguous action tokens to append. + position_ids: Position ID tensor with shape ``[3, span_len]``. + payload_index: Index into ``action.tokens`` for the backing payload tensor. + payload_start: First flattened token offset within the backing action payload. + payload_shape: Logical action slice shape, usually ``(span_len,)``. + + Returns: + Global packed-sequence indexes covered by the appended action span. + """ + return self._append_modality_span( + self.ensure_action(), + span_len, + position_ids, + payload_index=payload_index, + payload_start=payload_start, + payload_shape=payload_shape, + ) + + def append_sound_span( + self, + span_len: int, + position_ids: torch.Tensor, + *, + payload_index: int, + payload_start: int, + payload_shape: tuple[int, int, int], + ) -> list[int]: + """Append one contiguous sound span. + + Args: + span_len: Number of contiguous sound tokens to append. + position_ids: Position ID tensor with shape ``[3, span_len]``. + payload_index: Index into ``sound.tokens`` for the backing payload tensor. + payload_start: First flattened token offset within the backing sound payload. + payload_shape: Logical sound slice shape, usually ``(1, 1, 1)``. + + Returns: + Global packed-sequence indexes covered by the appended sound span. + """ + return self._append_modality_span( + self.ensure_sound(), + span_len, + position_ids, + payload_index=payload_index, + payload_start=payload_start, + payload_shape=payload_shape, + ) + + def append_end_of_generation_token( + self, + token_id: int, + use_float_mrope_positions: bool, + ) -> int: + """Append an end-of-generation text token. + + Args: + token_id: Token ID for the end-of-generation marker. + use_float_mrope_positions: Whether to write float position IDs for this token. + + Returns: + Span length for the appended end-of-generation token. + """ + eov_dtype = torch.float32 if use_float_mrope_positions else torch.long + position_ids = torch.full((3, 1), self._mrope_temporal_offset, dtype=eov_dtype) # [3,1] + self._mrope_temporal_offset += 1 + + _, span_len = self.append_text_span([token_id], position_ids) + return span_len + + def finish_sample(self, generation_split_len: int, sample_len: int) -> None: + """Record the non-causal generation split and total sample length. + + Args: + generation_split_len: Length of the full-attention generation split. + sample_len: Total number of tokens appended for this sample. + """ + self.attn_modes.append("full") + self.split_lens.append(generation_split_len) + self.sample_lens.append(sample_len) + + def _finalize_modality( + self, + modality: ModalityDataBuilder | None, + *, + domain_id: list[torch.Tensor] | None = None, + raw_action_dim: list[torch.Tensor | None] | None = None, + residual_gate: list[torch.Tensor] | None = None, + include_raw_action_dim: bool = False, + ) -> ModalityData | None: + """Finalize one modality builder into model-facing modality data. + + Args: + modality: Modality builder to finalize, or ``None`` if no tokens were appended. + domain_id: Optional action domain IDs to attach to finalized action data. + raw_action_dim: Optional raw action dimensions for action-channel masking. + include_raw_action_dim: Whether to include ``raw_action_dim`` in the finalized data. + + Returns: + Finalized ``ModalityData`` or ``None`` when the modality has no sequence indexes. + """ + if modality is None or len(modality.sequence_indexes) == 0: + return None + + kwargs = { + "sequence_indexes": torch.tensor(modality.sequence_indexes, dtype=torch.long), # [N_modality_tokens] + "timesteps": torch.tensor(modality.timesteps, dtype=torch.float32), # [N_modality_noisy_tokens] + "mse_loss_indexes": torch.tensor(modality.mse_loss_indexes, dtype=torch.long), # [N_modality_noisy_tokens] + "spans": list(modality.spans), + "token_shapes": list(modality.token_shapes), + "tokens": modality.tokens, + "condition_mask": list(modality.condition_mask), + "noisy_frame_indexes": list(modality.noisy_frame_indexes), + } + if domain_id is not None: + kwargs["domain_id"] = domain_id + if include_raw_action_dim: + kwargs["raw_action_dim"] = raw_action_dim + if residual_gate is not None: + kwargs["residual_gate"] = residual_gate + return ModalityData(**kwargs) + + def finalize( + self, + gen_data_clean: GenerationDataClean, + ) -> "PackedSequence": + """Convert all lists to tensors and compute derived values. + + Args: + gen_data_clean: GenerationDataClean for metadata (e.g., action domain IDs). + + Returns: + New PackedSequence instance with tensors instead of lists. + """ + # Compute sequence length + sequence_length = sum(self.sample_lens) + sample_lens = self.sample_lens.copy() + split_lens = self.split_lens.copy() + attn_modes = self.attn_modes.copy() + + # Prepare loss-related tensors (cross-entropy) + label_ids: torch.Tensor | None = None + ce_loss_indexes: torch.Tensor | None = None + ce_loss_weights: torch.Tensor | None = None + if self.label_ids and len(self.label_ids) > 0: + label_ids = torch.tensor(self.label_ids) # [N_ce_tokens] + ce_loss_indexes = torch.tensor(self.ce_loss_indexes) # [N_ce_tokens] + ce_loss_weights = torch.tensor(self.ce_loss_weights) # [N_ce_tokens] + + # The condition_mask and noisy_frame_indexes are kept as lists to support variable shapes. + + vision = self._finalize_modality(self.vision) + action_domain_id = None + if self.action is not None: + if gen_data_clean.action_domain_id is not None: + action_domain_id = gen_data_clean.action_domain_id + else: + default_action_domain_id = torch.zeros(1, dtype=torch.long) # [1] + action_domain_id = [default_action_domain_id] * len(self.action.token_shapes) + action = self._finalize_modality( + self.action, + domain_id=action_domain_id, + raw_action_dim=gen_data_clean.raw_action_dim, + residual_gate=gen_data_clean.action_residual_gate, + include_raw_action_dim=True, + ) + sound = self._finalize_modality(self.sound) + + # Finalize position IDs. + assert isinstance(self.position_ids, list) + assert all(isinstance(position_id, torch.Tensor) for position_id in self.position_ids) + if len(self.position_ids) > 0: + position_ids = torch.cat(self.position_ids, dim=1) # [3,actual_seq_len] + else: + position_ids = torch.empty((3, 0), dtype=torch.long) # [3,0] + + return PackedSequence( + # Sequence structure + sequence_length=sequence_length, + sample_lens=sample_lens, + split_lens=split_lens, + attn_modes=attn_modes, + is_image_batch=gen_data_clean.is_image_batch, + uses_single_timestep=self.uses_single_timestep, + # Text modality (converted to tensors) + text_ids=torch.tensor(self.text_ids, dtype=torch.long), # [N_text_tokens] + text_indexes=torch.tensor(self.text_indexes, dtype=torch.long), # [N_text_tokens] + behavior_indexes=torch.tensor(self.behavior_indexes, dtype=torch.long), + online_memory_indexes=torch.tensor(self.online_memory_indexes, dtype=torch.long), + proprio_indexes=torch.tensor(self.proprio_indexes, dtype=torch.long), + position_ids=position_ids, # [3,seq_len] + # Loss computation - Cross Entropy + label_ids=label_ids, + ce_loss_indexes=ce_loss_indexes, + ce_loss_weights=ce_loss_weights, + # Generation modalities + vision=vision, + action=action, + sound=sound, + # Temporal causal + null_action_supertokens=self.null_action_supertokens, + num_action_tokens_per_supertoken=self.num_action_tokens_per_supertoken, + # Multi-control transfer + vision_item_split_lens=list(self.vision_item_split_lens), + control_weights=gen_data_clean.control_weights, + ) + + +@dataclass +class PackedSequence: + """Finalized model-facing packed sequence. + + The object remains mutable for model-side payload replacement, clean replay, + and in-place device transfer. Build-only cursor and mRoPE state live on + ``PackedSequenceBuilder``. + + Attributes: + sample_lens: Length of each sample in the packed sequence. + split_lens: Length of each attention split. Each sample contributes a causal + text split and a full generation split. + attn_modes: Attention mode for each split, such as ``"causal"`` or ``"full"``. + is_image_batch: Whether this batch contains images rather than videos. + uses_single_timestep: Whether all noised tokens share one input timestep scalar. + sequence_length: Total length of the packed sequence. + text_ids: Tensor of all text token IDs, including special tokens. + text_indexes: Tensor of global packed-sequence indexes for text tokens. + position_ids: Tensor of mRoPE position IDs for all packed tokens with shape + ``[3, sequence_length]``. + label_ids: Optional tensor of label IDs for text cross-entropy loss. + ce_loss_indexes: Optional tensor of global packed-sequence indexes for text + cross-entropy loss. + ce_loss_weights: Optional tensor of per-token weights for text cross-entropy loss. + null_action_supertokens: Whether temporal-causal supertoken 0 contains null + action tokens. + num_action_tokens_per_supertoken: Number of action tokens prefixing each + temporal-causal vision supertoken. + vision: Finalized vision modality data, or ``None`` if no vision is present. + action: Finalized action modality data, or ``None`` if no action is present. + sound: Finalized sound modality data, or ``None`` if no sound is present. + vision_item_split_lens: Per-sample per-vision-item token counts for multi-control + transfer. + control_weights: Per-sample per-control weights for multi-control weighted V-scaling. + """ + + # Sequence structure + sample_lens: list[int] = field(default_factory=list) + split_lens: list[int] = field(default_factory=list) + attn_modes: list[str] = field(default_factory=list) + is_image_batch: bool = False + uses_single_timestep: bool = False + sequence_length: int = 0 + + # Text modality + text_ids: torch.Tensor = field(default_factory=_empty_long_tensor) + text_indexes: torch.Tensor = field(default_factory=_empty_long_tensor) + behavior_indexes: torch.Tensor = field(default_factory=_empty_long_tensor) + online_memory_indexes: torch.Tensor = field(default_factory=_empty_long_tensor) + proprio_indexes: torch.Tensor = field(default_factory=_empty_long_tensor) + position_ids: torch.Tensor = field(default_factory=_empty_long_tensor) + + # Loss computation - Cross Entropy (text) + label_ids: torch.Tensor | None = None + ce_loss_indexes: torch.Tensor | None = None + ce_loss_weights: torch.Tensor | None = None + + # Temporal causal: whether supertoken 0's action slot contains null tokens. + # True for all training calls and AR frame 0; False for AR frame N>0 (real actions). + # Used by three_way_attention to zero out V for null action tokens (inline when attention_meta.null_action_supertokens=True). + null_action_supertokens: bool = False + + # Temporal causal: number of action tokens prefixing each vision supertoken. + # Equals temporal_compression_factor when actions are packed inline; 0 when + # action_gen=False or for non-temporal-causal layouts. Single source of truth + # for downstream attention/KV-cache code (per-supertoken layout is + # num_action_tokens_per_supertoken + H_p * W_p). + num_action_tokens_per_supertoken: int = 0 + + # Generation modalities - NAMED FIELDS for type safety + vision: ModalityData | None = None + action: ModalityData | None = None + sound: ModalityData | None = None + + # Multi-control transfer: per-sample list of per-vision-item token counts. + # For a multi-control transfer sample with N controls + 1 noisy target, + # vision_item_split_lens[i] = [L_ctrl0, L_ctrl1, ..., L_ctrlN-1, L_noisy]. + # Used by cosmos3_vfm_network.py to derive gen-relative control/noisy ranges + # for multi_control_two_way_attention. + vision_item_split_lens: list[list[int]] = field(default_factory=list) + + # Per-sample per-control weights for multi-control weighted V-scaling. + # Parallel to vision_item_split_lens[i][:-1] (excludes noisy item). + # None for non-transfer or standard single-control samples. + control_weights: list[list[float]] | None = None + + def __post_init__(self) -> None: + self._sequence_pack_metadata: SequencePackMetadata | None = None + assert isinstance(self.text_ids, torch.Tensor), "PackedSequence.text_ids must be finalized" + assert isinstance(self.text_indexes, torch.Tensor), "PackedSequence.text_indexes must be finalized" + assert isinstance(self.behavior_indexes, torch.Tensor), "PackedSequence.behavior_indexes must be finalized" + assert isinstance(self.online_memory_indexes, torch.Tensor), "PackedSequence.online_memory_indexes must be finalized" + assert isinstance(self.proprio_indexes, torch.Tensor), "PackedSequence.proprio_indexes must be finalized" + assert isinstance(self.position_ids, torch.Tensor), "PackedSequence.position_ids must be finalized" + if self.label_ids is not None: + assert isinstance(self.label_ids, torch.Tensor), "PackedSequence.label_ids must be finalized" + if self.ce_loss_indexes is not None: + assert isinstance(self.ce_loss_indexes, torch.Tensor), "PackedSequence.ce_loss_indexes must be finalized" + if self.ce_loss_weights is not None: + assert isinstance(self.ce_loss_weights, torch.Tensor), "PackedSequence.ce_loss_weights must be finalized" + for modality in [self.vision, self.action, self.sound]: + assert modality is None or isinstance(modality, ModalityData), ( + "PackedSequence modality fields must be finalized ModalityData" + ) + + def to_cuda(self) -> None: + """Move all tensor fields to CUDA in-place.""" + self.text_ids = self.text_ids.cuda() + self.text_indexes = self.text_indexes.cuda() + self.behavior_indexes = self.behavior_indexes.cuda() + self.online_memory_indexes = self.online_memory_indexes.cuda() + self.proprio_indexes = self.proprio_indexes.cuda() + self.position_ids = self.position_ids.cuda() + if isinstance(self.label_ids, torch.Tensor): + self.label_ids = self.label_ids.cuda() + if isinstance(self.ce_loss_indexes, torch.Tensor): + self.ce_loss_indexes = self.ce_loss_indexes.cuda() + if isinstance(self.ce_loss_weights, torch.Tensor): + self.ce_loss_weights = self.ce_loss_weights.cuda() + if self.vision is not None: + self.vision.to_cuda() + if self.action is not None: + self.action.to_cuda() + if self.sound is not None: + self.sound.to_cuda() + self.prepare_sequence_pack_metadata() + + def prepare_sequence_pack_metadata(self) -> None: + """Validate and prepare device-specific metadata for this layout.""" + understanding_indexes = torch.cat( + (self.behavior_indexes, self.online_memory_indexes, self.proprio_indexes, self.text_indexes) + ).sort().values + self._sequence_pack_metadata = prepare_sequence_pack_metadata( + sample_lens=self.sample_lens, + split_lens=self.split_lens, + attn_modes=self.attn_modes, + packed_und_token_indexes=understanding_indexes, + device=self.text_indexes.device, + ) + + def get_sequence_pack_metadata(self) -> SequencePackMetadata | None: + """Return metadata prepared after the packed input reached its device.""" + return self._sequence_pack_metadata + + +@dataclass +class SequencePlan: + """Plan describing which modalities are present in a sample. + + This dataclass tracks the presence of different modalities (text, vision, action) + and their conditioning configurations for a dataset sample. Unlike SequencePlan + which holds the actual tensor data, this class provides a lightweight summary + of what modalities exist and how they should be conditioned. + + Attributes: + has_text: Whether text/caption tokens are present for this sample. + Used for text-conditioned generation (e.g., text-to-image/video). + has_vision: Whether vision input (image or video latents) is present. + Defaults to False. + condition_frame_indexes_vision: Indexes of latent vision frames that are clean/conditioning. + [] means all frames are noised/supervised. + All frames specified means all frames are clean (no MSE supervision). + For multi-item samples (e.g. image editing where each sample has multiple + separately-encoded images), this applies to each vision item individually. + The number of items per sample is tracked by + ``GenerationDataClean.num_vision_items_per_sample``. + share_vision_temporal_positions: Whether all vision items in this sample share + the same temporal mRoPE grid. + has_action: Whether action input is present for robotics/embodied AI tasks. + Defaults to False. + condition_frame_indexes_action: Indexes of action steps that are clean/conditioning. + [] means all steps are noised/supervised. + All steps specified means all steps are clean (no MSE supervision). + action_start_frame_offset: Frame offset for aligning action[0] to vision frames. + has_sound: Whether sound/audio input is present. + condition_frame_indexes_sound: Indexes of sound frames that are clean/conditioning. + [] means all frames are noised/supervised. + All frames specified means all frames are clean (no MSE supervision). + """ + + # -- understanding (text conditioning) -- + has_text: bool + + # -- vision modality -- + has_vision: bool = False + condition_frame_indexes_vision: list[int] = field(default_factory=list) + # If True, all vision items in this sample share the same temporal mRoPE grid + # (controlnet-style transfer: target frame i is spatio-temporally aligned with + # control frame i). Each item gets the same temporal_offset; spatial reset + # behavior is unchanged. Requires num_vision_items_per_sample > 1, equal latent_t, + # and equal fps across items. Default False preserves single-clip and + # image-editing semantics where items represent distinct time states. + share_vision_temporal_positions: bool = False + + # -- action modality -- + has_action: bool = False + condition_frame_indexes_action: list[int] = field(default_factory=list) + action_start_frame_offset: int = 1 + + # -- sound modality -- + has_sound: bool = False + condition_frame_indexes_sound: list[int] = field(default_factory=list) + + def as_dict(self) -> dict: + return { + "has_text": self.has_text, + "has_vision": self.has_vision, + "has_action": self.has_action, + "has_sound": self.has_sound, + "condition_frame_indexes_vision": self.condition_frame_indexes_vision, + "condition_frame_indexes_action": self.condition_frame_indexes_action, + "condition_frame_indexes_sound": self.condition_frame_indexes_sound, + "share_vision_temporal_positions": self.share_vision_temporal_positions, + } + + +def build_sequence_plans_from_data_batch( + data_batch: dict, + input_video_key, + input_image_key: str, +) -> list[SequencePlan]: + """Build or retrieve sequence plans from a data batch dictionary. + + This function extracts sequence plans from the data batch if they exist, + otherwise creates default SequencePlan objects for each sample + in the batch. + + Args: + data_batch: Dictionary containing the data batch from the dataloader. + Expected keys include 'video' or other tensors to determine batch size. + If 'sequence_plan' key exists, those plans are returned directly. + input_video_key: Data-batch key used to find video tensors when inferring batch size. + input_image_key: Data-batch key used to find image tensors when inferring batch size. + + Returns: + List of SequencePlan objects, one per sample in the batch. + """ + # For new modalities, please generate the sequence_plan in the dataset class!!!! + + # If sequence_plan already exists in data_batch, return it + if "sequence_plan" in data_batch: + return data_batch["sequence_plan"] + + assert "action" not in data_batch or data_batch["action"] is None, "Action data SHOULD have sequence_plans!" + assert "sound" not in data_batch or data_batch["sound"] is None, "Sound data SHOULD have sequence_plans!" + + # Determine batch size from available tensors + batch_size = 0 + for key in [input_video_key, input_image_key]: + if key in data_batch: + val = data_batch[key] + if isinstance(val, torch.Tensor): + batch_size = val.shape[0] + break + elif isinstance(val, list): + batch_size = len(val) + break + + if batch_size == 0: + raise ValueError( + f"Cannot determine batch size from data_batch. Expected {input_video_key}, {input_image_key}, or similar key." + ) + + # Build default SequencePlan objects + return [ + SequencePlan( + has_text=True, # Has text prompt! + has_vision=True, + condition_frame_indexes_vision=[], # No conditioning frames! + ) + for _ in range(batch_size) + ] diff --git a/releases/bridge-native-v3/code/cosmos_framework/inference/common/public_model_config.py b/releases/bridge-native-v3/code/cosmos_framework/inference/common/public_model_config.py new file mode 100644 index 0000000000000000000000000000000000000000..66ae50d92970775e3ef48b863f97a8aab3e24645 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/inference/common/public_model_config.py @@ -0,0 +1,361 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +from __future__ import annotations + +import copy +import importlib.util +from typing import Any + +_PUBLIC_TARGET_KEY = "_target" +_PUBLIC_TYPE_KEY = "_type" +_CLASS_NAME_KEY = "class_name" +_CONFIG_NAME_KEY = "config_name" +_TYPE_KEY = "_type" +_TARGET_KEY = "_target_" + +_PUBLIC_VFM_URI_PREFIX = "cosmos3://vfm/" + +_TARGET_ALIASES = { + "projects.cosmos3.vfm.configs.base.defaults.vlm.create_qwen2_tokenizer_with_download": "create_qwen2_tokenizer_with_download", + "projects.cosmos3.vfm.configs.base.defaults.vlm.create_vlm_config": "create_vlm_config", + "projects.cosmos3.vfm.models.mot.unified_mot.Nemotron3DenseVLMoTConfig.from_json_file": "nemotron3_dense_vl_mot_config_from_json_file", + "projects.cosmos3.vfm.models.mot.unified_mot.Nemotron3DenseVLTextForCausalLM": "nemotron3_dense_vl_text_for_causal_lm", + "projects.cosmos3.vfm.models.mot.unified_mot.Qwen3VLMoTConfig.from_json_file": "qwen3_vl_mot_config_from_json_file", + "projects.cosmos3.vfm.models.mot.unified_mot.Qwen3VLTextForCausalLM": "qwen3_vl_text_for_causal_lm", + "projects.cosmos3.vfm.models.omni_mot_model.OmniMoTModel": "omni_mot_model", + "projects.cosmos3.vfm.processors.build_processor_lazy": "build_processor_lazy", + "projects.cosmos3.vfm.tokenizers.audio.avae.AVAEInterface": "avae_interface", + "projects.cosmos3.vfm.tokenizers.wan2pt2_vae_4x16x16.Wan2pt2VAEInterface": "wan2pt2_vae_interface", +} + +# The Zeva training branch exposes config classes under the +# cosmos_framework.configs.* package path (mirrors of projects.cosmos3.vfm.*). +# Map them to the same public aliases so exported HF configs stay identical. +_CF_TYPE_ALIASES = { + "cosmos_framework.configs.base.defaults.model_config.ZevaPolicyConfig": "zeva_policy_config", + "cosmos_framework.configs.base.defaults.model_config.BehaviorStage2Config": "behavior_stage2_config", + "cosmos_framework.configs.base.defaults.model_config.ProprioConditionConfig": "proprio_condition_config", + "cosmos_framework.configs.base.defaults.model_config.DiffusionExpertConfig": "diffusion_expert_config", + "cosmos_framework.configs.base.defaults.model_config.FixedStepSamplerConfig": "fixed_step_sampler_config", + "cosmos_framework.configs.base.defaults.model_config.LBLConfig": "lbl_config", + "cosmos_framework.configs.base.defaults.model_config.OmniMoTModelConfig": "omni_mot_model_config", + "cosmos_framework.configs.base.defaults.model_config.RectifiedFlowInferenceConfig": "rectified_flow_inference_config", + "cosmos_framework.configs.base.defaults.model_config.RectifiedFlowTrainingConfig": "rectified_flow_training_config", + "cosmos_framework.configs.base.defaults.activation_checkpointing.ActivationCheckpointingConfig": "activation_checkpointing_config", + "cosmos_framework.configs.base.defaults.compile.CompileConfig": "compile_config", + "cosmos_framework.configs.base.defaults.ema.EMAConfig": "ema_config", + "cosmos_framework.configs.base.defaults.parallelism.ParallelismConfig": "parallelism_config", + "cosmos_framework.configs.base.defaults.quantization.QuantizationConfig": "quantization_config", + "cosmos_framework.configs.base.defaults.vlm.PretrainedWeightsConfig": "pretrained_weights_config", + "cosmos_framework.configs.base.defaults.vlm.VLMConfig": "vlm_config", + "cosmos_framework.model.generator.tokenizers.wan2pt2_vae_4x16x16.Wan2pt2VAEInterface": "wan2pt2_vae_interface", + "cosmos_framework.model.generator.mot.unified_mot.Qwen3VLMoTConfig.from_json_file": "qwen3_vl_mot_config_from_json_file", + "cosmos_framework.model.generator.mot.unified_mot.Qwen3VLTextForCausalLM": "qwen3_vl_text_for_causal_lm", + "cosmos_framework.model.generator.omni_mot_model.OmniMoTModel": "omni_mot_model", + "cosmos_framework.configs.base.defaults.reasoner.create_qwen2_tokenizer_with_download": "create_qwen2_tokenizer_with_download", + "cosmos_framework.configs.base.defaults.reasoner.create_vlm_config": "create_vlm_config", +} + +_TYPE_ALIASES = { + # Zeva branch (canonicalized under projects.cosmos3.vfm.configs.base.*) + "projects.cosmos3.vfm.configs.base.defaults.model_config.ZevaPolicyConfig": "zeva_policy_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.BehaviorStage2Config": "behavior_stage2_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.ProprioConditionConfig": "proprio_condition_config", + "projects.cosmos3.vfm.configs.base.defaults.activation_checkpointing.ActivationCheckpointingConfig": "activation_checkpointing_config", + "projects.cosmos3.vfm.configs.base.defaults.compile.CompileConfig": "compile_config", + "projects.cosmos3.vfm.configs.base.defaults.ema.EMAConfig": "ema_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.DiffusionExpertConfig": "diffusion_expert_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.FixedStepSamplerConfig": "fixed_step_sampler_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.LBLConfig": "lbl_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.OmniMoTModelConfig": "omni_mot_model_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.RectifiedFlowInferenceConfig": "rectified_flow_inference_config", + "projects.cosmos3.vfm.configs.base.defaults.model_config.RectifiedFlowTrainingConfig": "rectified_flow_training_config", + "projects.cosmos3.vfm.configs.base.defaults.parallelism.ParallelismConfig": "parallelism_config", + "projects.cosmos3.vfm.configs.base.defaults.quantization.QuantizationConfig": "quantization_config", + "projects.cosmos3.vfm.configs.base.defaults.vlm.PretrainedWeightsConfig": "pretrained_weights_config", + "projects.cosmos3.vfm.configs.base.defaults.vlm.VLMConfig": "vlm_config", +} + +# Config objects can be serialized as either `_type` or `_target_` depending on +# whether they came from structured config metadata or LazyCall construction. +_TARGET_ALIASES.update(_TYPE_ALIASES) +_TARGET_ALIASES.update(_CF_TYPE_ALIASES) +_TYPE_ALIASES.update(_CF_TYPE_ALIASES) + +_ALIAS_TARGETS = {alias: target for target, alias in _TARGET_ALIASES.items()} +_ALIAS_TYPES = {alias: target for target, alias in _TYPE_ALIASES.items()} + + +def build_public_model_config(model_config: dict[str, Any]) -> dict[str, Any]: + """Build public HF model metadata from the internal LazyConfig model dict.""" + + return _to_public_model_config(model_config) + + +def restore_model_config_from_public_model_config(model_config: dict[str, Any]) -> dict[str, Any]: + """Restore the internal LazyConfig model dict from public HF model metadata.""" + + return _from_public_model_config(model_config) + + +def model_config_uses_public_aliases(model_config: Any) -> bool: + """Return whether a model config uses public aliases.""" + + return _has_public_alias(model_config) + + +def load_model_config_from_hf_config(config_dict: dict[str, Any]) -> dict[str, Any]: + """Load internal model config from either legacy or public HF config.""" + + if "model" in config_dict: + model_config = config_dict["model"] + if model_config_uses_public_aliases(model_config): + return restore_model_config_from_public_model_config(model_config) + return model_config + raise KeyError("HF config must contain 'model'") + + +def _has_key(obj: Any, key: str) -> bool: + if isinstance(obj, dict): + return key in obj or any(_has_key(value, key) for value in obj.values()) + if isinstance(obj, list): + return any(_has_key(value, key) for value in obj) + return False + + +def _has_public_alias(obj: Any) -> bool: + if isinstance(obj, dict): + for key, value in obj.items(): + if key in {_PUBLIC_TARGET_KEY, _CLASS_NAME_KEY, _CONFIG_NAME_KEY}: + return True + if key == _PUBLIC_TYPE_KEY and _is_type_alias(value): + return True + if _has_public_alias(value): + return True + elif isinstance(obj, list): + return any(_has_public_alias(value) for value in obj) + return False + + +def _to_public_model_config(obj: Any) -> Any: + if isinstance(obj, list): + return [_to_public_model_config(item) for item in obj] + if isinstance(obj, dict): + data = {} + for key, value in obj.items(): + if key == _TARGET_KEY: + data[_PUBLIC_TARGET_KEY] = _target_to_alias(value) + elif key == _TYPE_KEY: + data[_PUBLIC_TYPE_KEY] = _type_to_alias(value) + else: + data[key] = _to_public_model_config(value) + return data + if isinstance(obj, str): + return _to_public_string(obj) + return copy.deepcopy(obj) + + +def _from_public_model_config(obj: Any) -> Any: + if isinstance(obj, list): + return [_from_public_model_config(item) for item in obj] + if isinstance(obj, dict): + data = {} + for key, value in obj.items(): + if key in {_PUBLIC_TARGET_KEY, _CLASS_NAME_KEY}: + data[_TARGET_KEY] = _alias_to_runtime_target(value) + elif key == _CONFIG_NAME_KEY or (key == _PUBLIC_TYPE_KEY and _is_type_alias(value)): + data[_TYPE_KEY] = _alias_to_runtime_type(value) + else: + data[key] = _from_public_model_config(value) + return data + if isinstance(obj, str): + return _from_public_string(obj) + return copy.deepcopy(obj) + + +def _target_to_alias(target: Any) -> str: + if not isinstance(target, str): + raise TypeError(f"Expected target path string, got {type(target)}") + canonical = _canonicalize_module_path(target) + try: + return _TARGET_ALIASES[canonical] + except KeyError as exc: + raise ValueError(f"No public alias registered for target path: {target}") from exc + + +def _type_to_alias(tp: Any) -> str: + if not isinstance(tp, str): + raise TypeError(f"Expected type path string, got {type(tp)}") + canonical = _canonicalize_module_path(tp) + try: + return _TYPE_ALIASES[canonical] + except KeyError as exc: + raise ValueError(f"No public alias registered for type path: {tp}") from exc + + +def _alias_to_runtime_target(alias: Any) -> str: + if not isinstance(alias, str): + raise TypeError(f"Expected target alias string, got {type(alias)}") + try: + return _runtime_module_path(_ALIAS_TARGETS[alias]) + except KeyError as exc: + raise ValueError(f"Unknown Cosmos target alias: {alias}") from exc + + +def _alias_to_runtime_type(alias: Any) -> str: + if not isinstance(alias, str): + raise TypeError(f"Expected type alias string, got {type(alias)}") + try: + return _runtime_module_path(_ALIAS_TYPES[alias]) + except KeyError as exc: + raise ValueError(f"Unknown Cosmos type alias: {alias}") from exc + + +def _is_type_alias(value: Any) -> bool: + return isinstance(value, str) and value in _ALIAS_TYPES + + +def _canonicalize_module_path(path: str) -> str: + replacements = ( + # vlm → reasoner rename (upstream i4). Longer/more-specific rules first + # so the reasoner subtree isn't shadowed by the general vfm rules below. + ("cosmos_framework.configs.base.defaults.reasoner.", "projects.cosmos3.vfm.configs.base.defaults.vlm."), + ("cosmos_framework.configs.base.reasoner.", "projects.cosmos3.vfm.configs.base.vlm."), + ("cosmos_framework.model.generator.reasoner.", "projects.cosmos3.vfm.models.vlm."), + ("cosmos_framework.data.generator.reasoner.", "projects.cosmos3.vfm.datasets.vlm."), + ("cosmos_framework.data.generator.augmentors.reasoner.", "projects.cosmos3.vfm.datasets.augmentors.vlm."), + ("cosmos_framework.utils.generator.reasoner.", "projects.cosmos3.vfm.utils.vlm."), + ("cosmos3._src.vfm.", "projects.cosmos3.vfm."), + ("cosmos_framework.configs.base.", "projects.cosmos3.vfm.configs.base."), + ("cosmos_framework.model.generator.tokenizers.", "projects.cosmos3.vfm.tokenizers."), + ("cosmos_framework.model.generator.diffusion.", "projects.cosmos3.vfm.diffusion."), + ("cosmos_framework.model.generator.", "projects.cosmos3.vfm.models."), + ("cosmos_framework.data.generator.processors.", "projects.cosmos3.vfm.processors."), + ("cosmos.model.vfm.tokenizers.", "projects.cosmos3.vfm.tokenizers."), + ("cosmos.model.vfm.diffusion.", "projects.cosmos3.vfm.diffusion."), + ("cosmos.model.vfm.", "projects.cosmos3.vfm.models."), + ("cosmos.configs.base.", "projects.cosmos3.vfm.configs.base."), + ) + for old, new in replacements: + if path.startswith(old): + return new + path[len(old) :] + return path + + +def _runtime_module_path(canonical_path: str) -> str: + if _module_exists("cosmos_framework.model.generator"): + return _replace_vfm_module_prefix(canonical_path, package="cosmos_framework") + if _module_exists("cosmos.model.vfm"): + return _replace_vfm_module_prefix(canonical_path, package="cosmos") + if _module_exists("cosmos3._src.vfm"): + return canonical_path.replace("projects.cosmos3.vfm.", "cosmos3._src.vfm.", 1) + return canonical_path + + +def _replace_vfm_module_prefix(canonical_path: str, *, package: str) -> str: + replacements = ( + # vlm → reasoner (upstream rename). MUST precede the general vfm rules + # so the specific vlm→reasoner subtree isn't shadowed by them. + ("projects.cosmos3.vfm.configs.base.defaults.vlm.", f"{package}.configs.base.defaults.reasoner."), + ("projects.cosmos3.vfm.configs.base.vlm.", f"{package}.configs.base.reasoner."), + ("projects.cosmos3.vfm.models.vlm.", f"{package}.model.generator.reasoner."), + ("projects.cosmos3.vfm.datasets.vlm.", f"{package}.data.generator.reasoner."), + ("projects.cosmos3.vfm.datasets.augmentors.vlm.", f"{package}.data.generator.augmentors.reasoner."), + ("projects.cosmos3.vfm.utils.vlm.", f"{package}.utils.generator.reasoner."), + ("projects.cosmos3.vfm.configs.base.", f"{package}.configs.base."), + ("projects.cosmos3.vfm.models.", f"{package}.model.generator."), + ("projects.cosmos3.vfm.tokenizers.", f"{package}.model.generator.tokenizers."), + ("projects.cosmos3.vfm.diffusion.", f"{package}.model.generator.diffusion."), + ("projects.cosmos3.vfm.processors.", f"{package}.data.generator.processors."), + ("projects.cosmos3.vfm.datasets.", f"{package}.data.generator."), + ("projects.cosmos3.vfm.scripts.action.", f"{package}.data.generator.action_scripts."), + ("projects.cosmos3.vfm.utils.", f"{package}.utils.generator."), + ) + for old, new in replacements: + if canonical_path.startswith(old): + return new + canonical_path[len(old) :] + return canonical_path + + +def _to_public_string(value: str) -> str: + for prefix in ("projects/cosmos3/vfm/", "cosmos3/_src/vfm/"): + if value.startswith(prefix): + return _PUBLIC_VFM_URI_PREFIX + value[len(prefix) :] + for package in ("cosmos_framework", "cosmos"): + public_value = _public_string_from_runtime_file_prefix(value, package=package) + if public_value is not None: + return public_value + return value + + +def _public_string_from_runtime_file_prefix(value: str, *, package: str) -> str | None: + replacements = ( + # reasoner → vlm (inverse of the upstream rename). MUST precede the + # general vfm rules so the reasoner subtree isn't shadowed by them. + # Mirrors the module-path rules in ``_canonicalize_module_path``. + (f"{package}/configs/base/defaults/reasoner/", "configs/base/defaults/vlm/"), + (f"{package}/configs/base/reasoner/", "configs/base/vlm/"), + (f"{package}/model/generator/reasoner/", "models/vlm/"), + (f"{package}/data/generator/augmentors/reasoner/", "datasets/augmentors/vlm/"), + (f"{package}/data/generator/reasoner/", "datasets/vlm/"), + (f"{package}/utils/generator/reasoner/", "utils/vlm/"), + (f"{package}/configs/base/", "configs/base/"), + (f"{package}/model/generator/tokenizers/", "tokenizers/"), + (f"{package}/model/generator/diffusion/", "diffusion/"), + (f"{package}/model/generator/", "models/"), + (f"{package}/data/generator/processors/", "processors/"), + (f"{package}/data/generator/action_scripts/", "scripts/action/"), + (f"{package}/data/generator/", "datasets/"), + (f"{package}/utils/generator/", "utils/"), + ) + for old, new in replacements: + if value.startswith(old): + return _PUBLIC_VFM_URI_PREFIX + new + value[len(old) :] + return None + + +def _from_public_string(value: str) -> str: + if not value.startswith(_PUBLIC_VFM_URI_PREFIX): + return value + suffix = value[len(_PUBLIC_VFM_URI_PREFIX) :] + if _module_exists("cosmos_framework.model.generator"): + return _replace_vfm_file_prefix(suffix, package="cosmos_framework") + if _module_exists("cosmos.model.vfm"): + return _replace_vfm_file_prefix(suffix, package="cosmos") + if _module_exists("cosmos3._src.vfm"): + return f"cosmos3/_src/vfm/{suffix}" + return f"projects/cosmos3/vfm/{suffix}" + + +def _replace_vfm_file_prefix(suffix: str, *, package: str) -> str: + replacements = ( + # vlm → reasoner (upstream rename). MUST precede the general vfm rules + # so the specific vlm→reasoner subtree isn't shadowed by them. Mirrors + # the module-path rules in ``_replace_vfm_module_prefix``. + ("configs/base/defaults/vlm/", f"{package}/configs/base/defaults/reasoner/"), + ("configs/base/vlm/", f"{package}/configs/base/reasoner/"), + ("models/vlm/", f"{package}/model/generator/reasoner/"), + ("datasets/augmentors/vlm/", f"{package}/data/generator/augmentors/reasoner/"), + ("datasets/vlm/", f"{package}/data/generator/reasoner/"), + ("utils/vlm/", f"{package}/utils/generator/reasoner/"), + ("configs/base/", f"{package}/configs/base/"), + ("models/", f"{package}/model/generator/"), + ("tokenizers/", f"{package}/model/generator/tokenizers/"), + ("diffusion/", f"{package}/model/generator/diffusion/"), + ("processors/", f"{package}/data/generator/processors/"), + ("datasets/", f"{package}/data/generator/"), + ("scripts/action/", f"{package}/data/generator/action_scripts/"), + ("utils/", f"{package}/utils/generator/"), + ) + for old, new in replacements: + if suffix.startswith(old): + return new + suffix[len(old) :] + return f"{package}/_vfm_unmapped/{suffix}" + + +def _module_exists(module: str) -> bool: + try: + return importlib.util.find_spec(module) is not None + except ModuleNotFoundError: + return False diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/generator/mot/cosmos3_vfm_network.py b/releases/bridge-native-v3/code/cosmos_framework/model/generator/mot/cosmos3_vfm_network.py new file mode 100644 index 0000000000000000000000000000000000000000..54a3fd9f72407f758a956b8b8cc9751a916d1bc6 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/generator/mot/cosmos3_vfm_network.py @@ -0,0 +1,1536 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +import math +from typing import List, Tuple + +import torch +from torch import nn +from transformers.configuration_utils import PretrainedConfig +from transformers.modeling_utils import PreTrainedModel + +from cosmos_framework.data.generator.sequence_packing import ModalityData, PackedSequence +from cosmos_framework.data.generator.sequence_packing.natten import verify_natten_parameter_list +from cosmos_framework.model.zeva import ( + BriefInteractionTrace, + CausalPromptConfig, + CausalPromptEncoder, + CausalPromptPolicyAdapter, + PolicyInjectionConfig, + PolicyInjectionPrior, + inject_causal_prompt, +) +from cosmos_framework.model.generator.mot.attention import SplitInfo, build_packed_sequence +from cosmos_framework.model.generator.mot.context_parallel_utils import ( + get_context_parallel_last_hidden_state, + get_context_parallel_sharded_sequence, +) +from cosmos_framework.model.generator.mot.domain_aware_linear import DomainAwareLinear +from cosmos_framework.model.generator.mot.modeling_utils import TimestepEmbedder, has_noisy_tokens +from cosmos_framework.model.generator.utils.memory import MemoryState + + +class Cosmos3VFMNetworkConfig(PretrainedConfig): + def __init__( + self, + vision_gen=True, + action_gen=False, + sound_gen=False, + vlm_config=None, + latent_patch_size=2, + latent_downsample_factor=8, + latent_channel_size=16, + max_latent_h=32, + max_latent_w=32, + max_latent_t=32, + enable_fps_modulation=False, + base_fps=24, + vit_max_num_patch_per_side=70, + connector_act="gelu_pytorch_tanh", + interpolate_pos=False, + timestep_shift=1.0, + timestep_scale=0.001, + predict_text_tokens=False, + joint_attn_implementation="two_way", + action_dim=32, + num_embodiment_domains=32, + temporal_compression_factor_vision=4, + temporal_compression_factor_action=1, + natten_parameter_list=None, + video_temporal_causal=False, + # Sound generation parameters + sound_dim: int | None = None, + temporal_compression_factor_sound=1, + sound_latent_fps: int = 25, + enable_input_bias: bool = True, + behavior_stage2_config: dict | None = None, + proprio_condition_config: dict | None = None, + residual_expert_config: dict | None = None, + **kwargs, + ): + self.vision_gen = vision_gen + self.sound_gen = sound_gen + self.vlm_config = vlm_config + self.latent_patch_size = latent_patch_size + self.latent_downsample_factor = latent_downsample_factor + self.latent_channel_size = latent_channel_size + self.max_latent_h = max_latent_h + self.max_latent_w = max_latent_w + self.max_latent_t = max_latent_t + self.enable_fps_modulation = enable_fps_modulation + self.base_fps = base_fps + self.vit_max_num_patch_per_side = vit_max_num_patch_per_side + self.connector_act = connector_act + self.interpolate_pos = interpolate_pos + self.timestep_shift = timestep_shift + self.timestep_scale = timestep_scale + self.predict_text_tokens = predict_text_tokens + self.joint_attn_implementation = joint_attn_implementation + self.temporal_compression_factor_vision = temporal_compression_factor_vision + self.natten_parameter_list = natten_parameter_list + self.video_temporal_causal = video_temporal_causal + self.enable_input_bias = enable_input_bias + self.behavior_stage2_config = behavior_stage2_config + self.proprio_condition_config = proprio_condition_config + self.residual_expert_config = residual_expert_config + + # action related parameters + self.action_gen = action_gen # whether to generate action tokens + self.action_dim = action_dim + self.num_embodiment_domains = num_embodiment_domains + self.temporal_compression_factor_action = temporal_compression_factor_action + if self.action_gen: + assert self.vision_gen, ( + "Action generation requires visual generation! We do NOT support action only training!" + ) + + # sound related parameters + self.sound_dim = sound_dim + self.temporal_compression_factor_sound = temporal_compression_factor_sound + self.sound_latent_fps = sound_latent_fps + if self.sound_gen: + assert self.vision_gen, ( + "Sound generation requires visual generation! We do NOT support sound only training!" + ) + + super().__init__(**kwargs) + + +class Cosmos3VFMNetwork(PreTrainedModel): + config_class = Cosmos3VFMNetworkConfig + base_model_prefix = "cosmos3" + + def __init__(self, language_model, config: Cosmos3VFMNetworkConfig): + super().__init__(config) + self.language_model = language_model + + text_config = config.vlm_config.text_config if hasattr(config.vlm_config, "text_config") else config.vlm_config + self.hidden_size = text_config.hidden_size + self.num_heads = text_config.num_attention_heads + self.num_kv_heads = text_config.num_key_value_heads + self.head_dim = text_config.head_dim + self.num_hidden_layers = text_config.num_hidden_layers + self.attention_io_layout = "sequence_sharded" + self.predict_text_tokens = config.predict_text_tokens + + if config.natten_parameter_list is not None and config.joint_attn_implementation != "three_way": + raise NotImplementedError( + f"Sparsity is only supported with 'three_way' attention, but got {config.joint_attn_implementation=}, " + "and 'natten_parameter_list' was not None." + ) + self.natten_parameter_list = verify_natten_parameter_list( + config.natten_parameter_list, num_layers=self.num_hidden_layers + ) + + if config.video_temporal_causal and config.joint_attn_implementation != "three_way": + raise ValueError( + f"video_temporal_causal=True requires joint_attn_implementation='three_way', " + f"but got {config.joint_attn_implementation!r}." + ) + self.video_temporal_causal = config.video_temporal_causal + self.pad_for_cuda_graphs = False + + if config.vision_gen: + self.latent_patch_size = config.latent_patch_size + self.timestep_shift = config.timestep_shift + self.timestep_scale = config.timestep_scale + self.latent_downsample = config.latent_downsample_factor * config.latent_patch_size + self.max_latent_h = config.max_latent_h + self.max_latent_w = config.max_latent_w + self.max_latent_t = config.max_latent_t + self.latent_channel = config.latent_channel_size + self.patch_latent_dim = self.latent_patch_size**2 * self.latent_channel + + _input_bias = config.enable_input_bias + self.time_embedder = TimestepEmbedder(self.hidden_size, bias=_input_bias) + self.vae2llm = nn.Linear(self.patch_latent_dim, self.hidden_size, bias=_input_bias) + self.llm2vae = nn.Linear(self.hidden_size, self.patch_latent_dim) + + if config.action_gen: + self.action_dim = config.action_dim + self.num_embodiment_domains = config.num_embodiment_domains + self.action2llm = DomainAwareLinear(self.action_dim, self.hidden_size, self.num_embodiment_domains) + self.llm2action = DomainAwareLinear(self.hidden_size, self.action_dim, self.num_embodiment_domains) + + self.action_modality_embed = nn.Parameter(torch.zeros(self.hidden_size)) + residual_cfg = config.residual_expert_config or {} + self.action_residual_head: nn.Linear | None = None + if bool(residual_cfg.get("enabled", False)): + self.action_residual_head = nn.Linear(self.hidden_size, self.action_dim, bias=True) + else: + self.action_residual_head = None + + behavior_cfg = config.behavior_stage2_config + if behavior_cfg is not None and behavior_cfg.get("enabled", False): + if not config.action_gen: + raise ValueError("Zeva policy injection requires action_gen=True") + prior_cfg = PolicyInjectionConfig( + global_dim=int(behavior_cfg["global_dim"]), + phase_dim=int(behavior_cfg["phase_dim"]), + effect_dim=int(behavior_cfg.get("effect_dim", 128)), + effect_history_length=int(behavior_cfg.get("effect_history_length", 4)), + action_dim=int(behavior_cfg["action_dim"]), + horizon=int(behavior_cfg["horizon"]), + num_anchors=int(behavior_cfg["num_anchors"]), + hidden_dim=int(behavior_cfg["hidden_dim"]), + num_heads=int(behavior_cfg["num_heads"]), + ) + # These registered attribute names are retained solely because they + # are part of the released DCP state-dict schema. + self.behavior_pbd: PolicyInjectionPrior | None = PolicyInjectionPrior(prior_cfg) + self.behavior_adapter: CausalPromptPolicyAdapter | None = CausalPromptPolicyAdapter( + action_dim=prior_cfg.action_dim, hidden_dim=self.hidden_size + ) + # Zeva's second conditioning path: the episode-level task context + # is a learned understanding-prefix token visible to every + # action query through Cosmos two-way attention. + self.behavior_global_projector: nn.Linear | None = nn.Linear( + prior_cfg.global_dim, self.hidden_size, bias=True + ) + pim_enabled = bool(behavior_cfg.get("pim_memory_enabled", False)) + pim_dim = int(behavior_cfg.get("pim_context_dim", 256)) + self.behavior_pim_encoder: CausalPromptEncoder | None = ( + CausalPromptEncoder( + CausalPromptConfig( + global_dim=prior_cfg.global_dim, + phase_dim=prior_cfg.phase_dim, + effect_dim=prior_cfg.effect_dim, + brief_length=prior_cfg.effect_history_length, + persistent_length=int(behavior_cfg.get("pim_persistent_length", 4)), + hidden_dim=pim_dim, + num_heads=int(behavior_cfg.get("num_heads", 4)), + ) + ) + if pim_enabled + else None + ) + self.behavior_pim_projector: nn.Linear | None = ( + nn.Linear(pim_dim, self.hidden_size, bias=True) if pim_enabled else None + ) + self.behavior_pim_gate: nn.Parameter | None = ( + nn.Parameter(torch.empty(1)) if pim_enabled else None + ) + self.behavior_pim_gate_init = float(behavior_cfg.get("pim_gate_init", 0.0)) + self.behavior_pim_force_bypass = bool(behavior_cfg.get("pim_force_bypass", False)) + online_enabled = bool(behavior_cfg.get("online_memory_enabled", False)) + online_dim = int(behavior_cfg.get("online_context_dim", 256)) + self.behavior_online_projector: nn.Linear | None = ( + nn.Linear(online_dim, self.hidden_size, bias=True) if online_enabled else None + ) + self.behavior_prior_dropout_rate = float(behavior_cfg["prior_dropout_rate"]) + self.behavior_prior_inference_guidance_scale = float( + behavior_cfg.get("prior_inference_guidance_scale", 0.5) + ) + self.behavior_prior_leading_condition_steps = int( + behavior_cfg.get("leading_condition_steps", 1) + ) + else: + self.behavior_pbd = None + self.behavior_adapter = None + self.behavior_global_projector = None + self.behavior_pim_encoder = None + self.behavior_pim_projector = None + self.behavior_pim_gate = None + self.behavior_pim_gate_init = 0.0 + self.behavior_pim_force_bypass = False + self.behavior_online_projector = None + self.behavior_prior_dropout_rate = 0.0 + self.behavior_prior_inference_guidance_scale = 1.0 + self.behavior_prior_leading_condition_steps = 1 + + proprio_cfg = config.proprio_condition_config + if proprio_cfg is not None and proprio_cfg.get("enabled", False): + if not config.action_gen: + raise ValueError("Proprio conditioning requires action_gen=True") + self.proprio_input_dim = int(proprio_cfg["input_dim"]) + self.proprio_prefix_tokens = int(proprio_cfg.get("prefix_tokens", 1)) + if self.proprio_input_dim < 1 or self.proprio_prefix_tokens < 1: + raise ValueError("Proprio input_dim and prefix_tokens must be positive") + self.proprio_projector: nn.Linear | None = nn.Linear( + self.proprio_input_dim, + self.proprio_prefix_tokens * self.hidden_size, + bias=True, + ) + else: + self.proprio_input_dim = 0 + self.proprio_prefix_tokens = 0 + self.proprio_projector = None + + if config.sound_gen: + self.sound_dim = config.sound_dim + self.sound2llm = nn.Linear(config.sound_dim, self.hidden_size, bias=config.enable_input_bias) + self.llm2sound = nn.Linear(self.hidden_size, config.sound_dim) + self.sound_modality_embed = nn.Parameter(torch.zeros(self.hidden_size)) + + self.config = config + self.parallel_dims = None + + @property + def causal_prompt_encoder(self) -> CausalPromptEncoder | None: + """Paper-facing alias; storage keeps the legacy checkpoint key.""" + return self.behavior_pim_encoder + + @property + def causal_prompt_projector(self) -> nn.Linear | None: + """Project the fused causal prompt into the frozen policy prefix.""" + return self.behavior_pim_projector + + @property + def causal_prompt_gate(self) -> nn.Parameter | None: + """Zero-initialized policy-injection gate for the causal prompt.""" + return self.behavior_pim_gate + + def init_weights(self, buffer_device: torch.device | None): + if self.config.vision_gen or self.config.action_gen or self.config.sound_gen: + self.time_embedder._init_weights(buffer_device=buffer_device) + + if self.config.vision_gen: + std = 1.0 / math.sqrt(self.patch_latent_dim) + torch.nn.init.trunc_normal_(self.vae2llm.weight, std=std, a=-3 * std, b=3 * std) + if self.config.enable_input_bias: + torch.nn.init.zeros_(self.vae2llm.bias) + + std = 1.0 / math.sqrt(self.hidden_size) + torch.nn.init.trunc_normal_(self.llm2vae.weight, std=std, a=-3 * std, b=3 * std) + torch.nn.init.zeros_(self.llm2vae.bias) + + if self.config.action_gen: + # DomainAwareLinear uses embeddings for weights, so we initialize them differently + # action2llm: input_size=action_dim, output_size=hidden_size + std = 1.0 / math.sqrt(self.action_dim) + torch.nn.init.trunc_normal_(self.action2llm.fc.weight, std=std, a=-3 * std, b=3 * std) + torch.nn.init.zeros_(self.action2llm.bias.weight) + + # llm2action: input_size=hidden_size, output_size=action_dim + std = 1.0 / math.sqrt(self.hidden_size) + torch.nn.init.trunc_normal_(self.llm2action.fc.weight, std=std, a=-3 * std, b=3 * std) + torch.nn.init.zeros_(self.llm2action.bias.weight) + + std = 1.0 / math.sqrt(self.hidden_size) + torch.nn.init.trunc_normal_(self.action_modality_embed, std=std, a=-3 * std, b=3 * std) + if self.action_residual_head is not None: + # Zero initialization makes residual enabling an exact base + # bypass before the first optimizer update. + torch.nn.init.zeros_(self.action_residual_head.weight) + torch.nn.init.zeros_(self.action_residual_head.bias) + + if ( + self.behavior_pbd is not None + and self.behavior_adapter is not None + and self.behavior_global_projector is not None + ): + self.behavior_pbd.init_weights() + self.behavior_adapter.init_weights() + nn.init.xavier_uniform_(self.behavior_global_projector.weight) + nn.init.zeros_(self.behavior_global_projector.bias) + if ( + self.behavior_pim_encoder is not None + and self.behavior_pim_projector is not None + and self.behavior_pim_gate is not None + ): + self.behavior_pim_encoder.reset_parameters() + nn.init.xavier_uniform_(self.behavior_pim_projector.weight) + nn.init.zeros_(self.behavior_pim_projector.bias) + nn.init.constant_(self.behavior_pim_gate, self.behavior_pim_gate_init) + if self.behavior_online_projector is not None: + # Zero initialization makes enabling memory a strict no-op + # until the support-memory adaptation stage trains this path. + nn.init.zeros_(self.behavior_online_projector.weight) + nn.init.zeros_(self.behavior_online_projector.bias) + if self.proprio_projector is not None: + nn.init.xavier_uniform_(self.proprio_projector.weight) + nn.init.zeros_(self.proprio_projector.bias) + + if self.config.sound_gen: + # sound2llm: input_size=sound_dim, output_size=hidden_size + std = 1.0 / math.sqrt(self.sound_dim) + torch.nn.init.trunc_normal_(self.sound2llm.weight, std=std, a=-3 * std, b=3 * std) + if self.config.enable_input_bias: + torch.nn.init.zeros_(self.sound2llm.bias) + + # llm2sound: input_size=hidden_size, output_size=sound_dim + std = 1.0 / math.sqrt(self.hidden_size) + torch.nn.init.trunc_normal_(self.llm2sound.weight, std=std, a=-3 * std, b=3 * std) + torch.nn.init.zeros_(self.llm2sound.bias) + + std = 1.0 / math.sqrt(self.hidden_size) + torch.nn.init.trunc_normal_(self.sound_modality_embed, std=std, a=-3 * std, b=3 * std) + + self.language_model.init_weights(buffer_device=buffer_device) + + def generate_reasoner_text( + self, + input_ids: torch.Tensor, + max_new_tokens: int, + *, + pixel_values: torch.Tensor | None = None, + image_grid_thw: torch.Tensor | None = None, + pixel_values_videos: torch.Tensor | None = None, + video_grid_thw: torch.Tensor | None = None, + attention_mask: torch.Tensor | None = None, + eos_token_id: int | list[int] | None = None, + pad_token_id: int | None = None, + do_sample: bool = False, + temperature: float = 1.0, + top_k: int | None = None, + top_p: float | None = None, + repetition_penalty: float = 1.0, + presence_penalty: float = 0.0, + seed: int | None = None, + return_only_new_tokens: bool = False, + ) -> torch.Tensor: + """Autoregressively generate text tokens using only the reasoner tower. + + Thin pass-through to ``self.language_model.generate_reasoner_text`` + (see ``unified_mot._impl_generate_reasoner_text`` for full argument + documentation). Handles both text-only and image-conditioned (I2V) + prompts through this single entry point: pass + ``pixel_values`` + ``image_grid_thw`` (and optionally + ``attention_mask``) for image-conditioned prefill via the Qwen3-VL + visual encoder, or omit them for text-only prefill. Video + conditioning is also supported via ``pixel_values_videos`` + + ``video_grid_thw``; the image and video pairs are mutually exclusive. + Uses the und-pathway weights (those WITHOUT the ``_moe_gen`` suffix) + plus ``embed_tokens`` / ``norm`` / ``lm_head``; the generation pathway + and all VFM-level multimodal embedders / heads (``vae2llm``, + ``llm2vae``, ``sound2llm``, etc.) are bypassed. + + ``repetition_penalty`` / ``presence_penalty`` are pass-through + sampling controls applied inside + :func:`unified_mot._impl_generate_reasoner_text` as logit + transformations *before* the ``do_sample`` argmax / multinomial + branch (so they shift the greedy argmax too). Identity defaults + (``1.0`` / ``0.0``) keep the un-penalized fast path + bit-identical. + + ``seed`` is a pass-through sampling-RNG knob: when provided, + :func:`unified_mot._impl_generate_reasoner_text` allocates a + device-local ``torch.Generator``, seeds it once with + ``manual_seed(seed)``, and threads it into every + ``torch.multinomial`` draw — making the decoded sequence a + deterministic function of the seed, the prompt, and the + penalty masks. ``None`` (default) consumes the device's + default RNG and is bit-identical to the pre-seed call surface. + Has no effect under greedy decoding (the argmax branch never + reads the generator). + """ + + return self.language_model.generate_reasoner_text( + input_ids=input_ids, + max_new_tokens=max_new_tokens, + pixel_values=pixel_values, + image_grid_thw=image_grid_thw, + pixel_values_videos=pixel_values_videos, + video_grid_thw=video_grid_thw, + attention_mask=attention_mask, + eos_token_id=eos_token_id, + pad_token_id=pad_token_id, + do_sample=do_sample, + temperature=temperature, + top_k=top_k, + top_p=top_p, + repetition_penalty=repetition_penalty, + presence_penalty=presence_penalty, + seed=seed, + return_only_new_tokens=return_only_new_tokens, + ) + + def patchify_and_pack_latents( + self, tokens_vision: torch.Tensor, token_shapes_vision: List[Tuple[int, int, int]] + ) -> tuple[torch.Tensor, List[Tuple[int, int, int]]]: + p = self.latent_patch_size + # Patchify and pack the latents + packed_latent = [] + original_latent_shapes = [] # Store original shapes for unpadding later + + # C, T, H, W + for latent, (t, h, w) in zip(tokens_vision, token_shapes_vision): + latent = latent.squeeze(0) # [C,T,H,W] + + # Get original latent dimensions + _, t_actual, h_actual, w_actual = latent.shape + original_latent_shapes.append((t_actual, h_actual, w_actual)) + + # Compute padded dimensions (must be divisible by p) + h_padded = ((h_actual + p - 1) // p) * p + w_padded = ((w_actual + p - 1) // p) * p + + # Zero-pad if dimensions are not divisible by p + if h_padded != h_actual or w_padded != w_actual: + padded = torch.zeros( + (self.latent_channel, t_actual, h_padded, w_padded), + device=latent.device, + dtype=latent.dtype, + ) # [C,T,H_padded,W_padded] + padded[:, :, :h_actual, :w_actual] = latent + latent = padded # [C,T,H_padded,W_padded] + + # Compute number of patches after padding + h_patches = h_padded // p + w_patches = w_padded // p + + # Patchify + latent = latent.reshape( + self.latent_channel, t_actual, h_patches, p, w_patches, p + ) # [C,T,h_patches,p,w_patches,p] + latent = torch.einsum("cthpwq->thwpqc", latent).reshape( + -1, p * p * self.latent_channel + ) # [T*h_patches*w_patches,patch_latent_dim] + packed_latent.append(latent) + + # We assumed latents we get to the network is already noised + packed_latent = torch.cat(packed_latent, dim=0) # [total_vision_patches,patch_latent_dim] + return packed_latent, original_latent_shapes + + def unpatchify_and_unpack_latents( + self, + packed_mse_preds: torch.Tensor, + token_shapes_vision: List[Tuple[int, int, int]], + noisy_frame_indexes_vision: list[torch.Tensor], + original_latent_shapes: List[Tuple[int, int, int]] | None = None, + ) -> list[torch.Tensor]: + p = self.latent_patch_size + unpatchified_latents = [] + + # Split packed_mse_preds back into individual latents based on token_shapes_vision + start_idx = 0 + for i, (t_c, h_c, w_c) in enumerate(token_shapes_vision): + # Get original shape for unpadding (if provided) + if original_latent_shapes is not None: + t_orig, h_orig, w_orig = original_latent_shapes[i] + # Compute padded dimensions used during patchify + h_padded = ((h_orig + p - 1) // p) * p + w_padded = ((w_orig + p - 1) // p) * p + h_patches = h_padded // p + w_patches = w_padded // p + else: + # Fallback: use token shapes directly (assumes no padding was needed) + t_orig, h_orig, w_orig = t_c, h_c * p, w_c * p + h_patches, w_patches = h_c, w_c + + # noisy_frame_indexes_vision is a list of tensors, each with shape (T,), + # where the values are the noisy frame indices. + noisy_frame_indexes = noisy_frame_indexes_vision[i] + t_n = len(noisy_frame_indexes) + + # Initialize with the original shape (after unpadding), zeros for clean frames + output_tensor = torch.zeros( + (self.latent_channel, t_c, h_orig, w_orig), + device=packed_mse_preds.device, + dtype=packed_mse_preds.dtype, + ) # [C,T,H_orig,W_orig] + num_patches = t_n * h_patches * w_patches + if num_patches > 0: + end_idx = start_idx + num_patches + # Extract patches for this latent + latent_patches = packed_mse_preds[start_idx:end_idx] # [num_patches,patch_latent_dim] + # Reshape back to [t_n, h_patches, w_patches, p, p, channels] + latent_patches = latent_patches.reshape( + t_n, h_patches, w_patches, p, p, self.latent_channel + ) # [T_n,h_patches,w_patches,p,p,C] + # Invert the einsum operation: "thwpqc->cthpwq" + latent = torch.einsum("thwpqc->cthpwq", latent_patches) # [C,T_n,h_patches,p,w_patches,p] + # Reshape back to [channels, t_n, h_padded, w_padded] + latent = latent.reshape( + self.latent_channel, t_n, h_patches * p, w_patches * p + ) # [C,T_n,H_padded,W_padded] + + # Crop to original dimensions (unpad the zeros) + latent = latent[:, :, :h_orig, :w_orig] # [C,T_n,H_orig,W_orig] + + # Fill only the noisy frame positions using the actual mask indices + output_tensor[:, noisy_frame_indexes] = latent + + start_idx = end_idx + + unpatchified_latents.append(output_tensor.unsqueeze(0)) # [1,C,T,H,W] + + # Return list of unpatchified latents (supports variable shapes) + return unpatchified_latents + + def pack_action( + self, + tokens_action: list[torch.Tensor], + token_shapes_action: list[tuple[int, ...]], + domain_id_action: list[torch.Tensor], + ) -> tuple[torch.Tensor, torch.Tensor]: + """Pack variable-length action tokens into a 1D sequence for transformer input. + + Args: + tokens_action: List of action tensors, each [T_i, action_dim] (T_i may vary). + token_shapes_action: List of (T_i,) tuples per sample. + domain_id_action: List of domain ID tensors, each of shape [1]. + + Returns: + Tuple of (packed_tokens, per_token_domain_id): + packed_tokens: [total_action_tokens, action_dim] + per_token_domain_id: [total_action_tokens] + """ + packed: list[torch.Tensor] = [] + domain_ids: list[torch.Tensor] = [] + for tokens, shape, d_id in zip(tokens_action, token_shapes_action, domain_id_action): + T = shape[0] + packed.append(tokens[:T]) + domain_ids.append(d_id.expand(T)) + return torch.cat(packed, dim=0), torch.cat(domain_ids, dim=0) + + def unpack_action( + self, + packed_action_preds: torch.Tensor, + token_shapes_action: list[tuple[int, ...]], + noisy_frame_indexes_action: list[torch.Tensor], + ) -> list[torch.Tensor]: + """Unpack action predictions back into per-sample action tensors. + + Args: + packed_action_preds: Packed action predictions of shape (total_noisy_tokens, action_dim) + token_shapes_action: Per-sample token shapes, each (T_i,) tuple. + noisy_frame_indexes_action: List of tensors, each with shape (Tn_i,), where the values + are the noisy frame indices for sample i. + + Returns: + List of per-sample tensors, each of shape (T_i, action_dim), with predictions + placed at noisy positions. Clean positions are left as zeros. + """ + unpacked: list[torch.Tensor] = [] + start_idx = 0 + for shape, noisy_frame_indexes in zip(token_shapes_action, noisy_frame_indexes_action): + T = shape[0] + output = torch.zeros( + (T, self.action_dim), + device=packed_action_preds.device, + dtype=packed_action_preds.dtype, + ) + t_n = len(noisy_frame_indexes) + if t_n > 0: + end_idx = start_idx + t_n + output[noisy_frame_indexes] = packed_action_preds[start_idx:end_idx] + start_idx = end_idx + unpacked.append(output) + return unpacked + + def pack_sound_latents( + self, + tokens_sound: list[torch.Tensor], + token_shapes_sound: list[tuple[int, int, int]], + ) -> torch.Tensor: + """Pack sound latents into a 1D sequence for transformer input. + + Args: + tokens_sound: List of sound latent tensors, each [C, T] + token_shapes_sound: List of (T, 1, 1) tuples per sample + + Returns: + Packed tensor of shape [total_sound_tokens, C] + """ + packed = [] + for sound, shape in zip(tokens_sound, token_shapes_sound): + T = shape[0] + # sound: [C, T] → take first T frames → [C, T] + # Then permute to [T, C] for packing + sound_tokens = sound[:, :T].permute(1, 0) # [T,C] + packed.append(sound_tokens) + return torch.cat(packed, dim=0) # [total_sound_tokens,C] + + def unpack_sound_latents( + self, + packed_sound_preds: torch.Tensor, + token_shapes_sound: list[tuple[int, int, int]], + noisy_frame_indexes_sound: list[torch.Tensor], + ) -> list[torch.Tensor]: + """Unpack sound predictions back into per-sample sound latents. + + Args: + packed_sound_preds: Packed sound predictions of shape (total_noisy_tokens, sound_dim) + token_shapes_sound: List of (T, 1, 1) tuples per sample + noisy_frame_indexes_action: List of tensors, each with shape (T_i,), where the values + are the noisy frame indices. T_i <= max_T. + + Returns: + List of per-sample tensors, each [C, T], with predictions placed at noisy positions. + Clean positions are left as zeros. + """ + unpacked = [] + start_idx = 0 + for shape, noisy_frame_indexes in zip(token_shapes_sound, noisy_frame_indexes_sound): + T = shape[0] + # Initialize output with zeros for clean positions + output = torch.zeros( + (self.sound_dim, T), + device=packed_sound_preds.device, + dtype=packed_sound_preds.dtype, + ) + + t_n = len(noisy_frame_indexes) + + if t_n > 0: + end_idx = start_idx + t_n + # packed_sound_preds: [total_noisy_tokens, C] → transpose and fill at noisy positions + output[:, noisy_frame_indexes] = packed_sound_preds[ + start_idx:end_idx + ].T # packed_sound_preds[...]: [T_n,C] → .T: [C,T_n] + start_idx = end_idx + + unpacked.append(output) + return unpacked + + def _encode_text( + self, + packed_seq: PackedSequence, + ) -> tuple[torch.Tensor, torch.dtype]: + """Embed text tokens and initialize packed_sequence. + + Args: + packed_seq: PackedSequence containing text_ids and text_indexes. + + Returns: + tuple of (packed_sequence, target_dtype) where packed_sequence has text embeddings filled in. + """ + packed_text_embedding = self.language_model.model.embed_tokens(packed_seq.text_ids) # [N_text,hidden_size] + packed_sequence = packed_text_embedding.new_zeros( + size=(packed_seq.sequence_length, self.hidden_size) + ) # [N_total,hidden_size] + packed_sequence[packed_seq.text_indexes] = ( + packed_text_embedding # [N_text,hidden_size] scattered into [N_total,hidden_size] + ) + return packed_sequence, packed_text_embedding.dtype + + def _encode_behavior_prefix( + self, + packed_seq: PackedSequence, + packed_sequence: torch.Tensor, + target_dtype: torch.dtype, + ) -> None: + """Fill the learned global-behavior causal slots reserved by the packer.""" + if self.behavior_global_projector is None: + if packed_seq.behavior_indexes.numel(): + raise ValueError("Packed behavior prefix slots require behavior_stage2.enabled=True") + return + if not packed_seq.behavior_indexes.numel(): + # Clean readout / vision-only calls intentionally contain no action + # sample and therefore reserve no behavior prefix. + return + if not hasattr(packed_seq, "behavior_global"): + raise ValueError("Stage-2 behavior prefix requires behavior_global on PackedSequence") + global_features = packed_seq.behavior_global + if global_features.ndim != 2 or global_features.shape[0] != packed_seq.behavior_indexes.numel(): + raise ValueError( + "behavior_global must contain one vector per reserved behavior prefix, " + f"got {tuple(global_features.shape)} for {packed_seq.behavior_indexes.numel()} slots" + ) + prefix = self.behavior_global_projector(global_features).to(target_dtype) + if self.behavior_pim_encoder is not None and not self.behavior_pim_force_bypass: + required = ( + "behavior_phase", + "behavior_effect", + "behavior_effect_valid", + "behavior_pim_phase", + "behavior_pim_effect", + "behavior_pim_valid", + ) + if any(not hasattr(packed_seq, name) for name in required): + raise ValueError("PIM-enabled behavior prefix requires phase, BIT, and PIM tensors") + assert self.behavior_pim_projector is not None + assert self.behavior_pim_gate is not None + brief_interaction_trace = BriefInteractionTrace( + effects=packed_seq.behavior_effect, + valid=packed_seq.behavior_effect_valid, + ) + causal_prompt_context = self.behavior_pim_encoder( + global_features, + packed_seq.behavior_phase, + brief_interaction_trace.effects, + brief_interaction_trace.valid, + packed_seq.behavior_pim_phase, + packed_seq.behavior_pim_effect, + packed_seq.behavior_pim_valid, + ) + # Do not synthesize a residual from BOS slots when no persistent + # evidence exists. The scalar tanh gate is exactly zero at + # initialization, preserving the released prefix bit-for-bit while + # letting the scalar gate learn first; encoder/projector gradients + # become active once that gate leaves zero. + causal_prompt = self.behavior_pim_projector(causal_prompt_context) + prefix = inject_causal_prompt( + prefix, causal_prompt, self.behavior_pim_gate, packed_seq.behavior_pim_valid + ) + # Keep the legacy field for existing diagnostics and expose the + # paper term for new integrations. + packed_seq.behavior_pim_context = causal_prompt_context + packed_seq.causal_prompt = causal_prompt_context + packed_sequence[packed_seq.behavior_indexes] = prefix + + def _encode_online_memory_prefix( + self, + packed_seq: PackedSequence, + packed_sequence: torch.Tensor, + target_dtype: torch.dtype, + ) -> None: + """Write one causal prefix from same-task completed transitions.""" + indexes = packed_seq.online_memory_indexes + if not indexes.numel(): + return + if self.behavior_online_projector is None: + raise ValueError("Online-memory prefix slots require behavior_stage2.online_memory_enabled=True") + if not hasattr(packed_seq, "behavior_online_context"): + raise ValueError("Online-memory prefix requires behavior_online_context on PackedSequence") + context = packed_seq.behavior_online_context + if context.ndim != 2 or context.shape[0] != indexes.numel(): + raise ValueError( + "behavior_online_context must contain one vector per online prefix slot, " + f"got {tuple(context.shape)} for {indexes.numel()} slots" + ) + packed_sequence[indexes] = self.behavior_online_projector(context).to(target_dtype) + + def _encode_proprio_prefix( + self, + packed_seq: PackedSequence, + packed_sequence: torch.Tensor, + target_dtype: torch.dtype, + ) -> None: + """Project the robot state into reserved causal prefix slots.""" + if self.proprio_projector is None: + if packed_seq.proprio_indexes.numel(): + raise ValueError("Packed proprio prefix slots require proprio_condition.enabled=True") + return + if not packed_seq.proprio_indexes.numel(): + return + if not hasattr(packed_seq, "proprio_condition"): + raise ValueError("Proprio prefix requires proprio_condition on PackedSequence") + proprio = packed_seq.proprio_condition + if proprio.ndim != 2 or proprio.shape[-1] != self.proprio_input_dim: + raise ValueError( + f"Expected proprio_condition [B,{self.proprio_input_dim}], got {tuple(proprio.shape)}" + ) + prefix = self.proprio_projector(proprio).reshape(-1, self.hidden_size).to(target_dtype) + if prefix.shape[0] != packed_seq.proprio_indexes.numel(): + raise ValueError("Proprio batch/prefix count does not match reserved slots") + packed_sequence[packed_seq.proprio_indexes] = prefix + + def _embed_packed_timesteps(self, timesteps: torch.Tensor, packed_seq: PackedSequence) -> torch.Tensor: + """Embed noised-token timesteps, reusing work when packing proves they share one scalar.""" + if packed_seq.uses_single_timestep and timesteps.numel() > 1: + timestep = timesteps[:1] # [1] + with torch.autocast("cuda", enabled=True, dtype=torch.float32): + timestep_embed = self.time_embedder(timestep) # [1,hidden_size] + # Materialize: expand() aliases storage; in-place ops on a float32 no-op .to() would corrupt all rows. + return timestep_embed.expand(timesteps.shape[0], -1).contiguous() # [N_noisy_frames,hidden_size] + + # Timesteps are computed in FP32 for numerical stability. + with torch.autocast("cuda", enabled=True, dtype=torch.float32): + return self.time_embedder(timesteps) # [N_noisy_frames,hidden_size] + + def _encode_vision( + self, + packed_seq: PackedSequence, + packed_sequence: torch.Tensor, + target_dtype: torch.dtype, + ) -> List[Tuple[int, int, int]] | None: + """Project vision tokens and fill into packed_sequence. + + Args: + packed_seq: PackedSequence containing vision tokens and metadata. + packed_sequence: The packed sequence tensor to fill vision embeddings into (modified in-place). + target_dtype: Target dtype for embeddings (typically from text embedding). + + Returns: + Original latent shapes before padding (for unpadding during decode), or None if no vision tokens. + """ + if packed_seq.vision is None or packed_seq.vision.tokens is None: + # No vision tokens in this batch + return None + + vision = packed_seq.vision + assert vision.tokens is not None # Type narrowing (checked above but reassignment loses it) + assert vision.token_shapes is not None + assert isinstance(vision.sequence_indexes, torch.Tensor) + assert isinstance(vision.timesteps, torch.Tensor) + torch._assert( + vision.timesteps.dtype in (torch.long, torch.float32), + f"Timestep must be long/float32, got {vision.timesteps.dtype}", + ) + + assert isinstance(vision.mse_loss_indexes, torch.Tensor) + + packed_tokens_vision, original_latent_shapes = self.patchify_and_pack_latents( + vision.tokens, vision.token_shapes + ) # packed_tokens_vision: [total_vision_patches,patch_latent_dim] + packed_tokens_vision = self.vae2llm(packed_tokens_vision.to(target_dtype)) # [total_vision_patches,hidden_size] + + has_noisy_vision = vision.mse_loss_indexes.numel() > 0 + + if has_noisy_vision: + timesteps_vision = vision.timesteps.to(dtype=torch.float32) * self.timestep_scale # [N_noisy_frames_vision] + + packed_timestep_embeds_vision = self._embed_packed_timesteps( + timesteps_vision, packed_seq + ) # [N_noisy_frames_vision,hidden_size] + packed_timestep_embeds_vision = packed_timestep_embeds_vision.to( + target_dtype + ) # [N_noisy_frames_vision,hidden_size] + + packed_tokens_vision = _apply_timestep_embeds_to_noisy_tokens( + packed_tokens=packed_tokens_vision, + packed_timestep_embeds=packed_timestep_embeds_vision, + noisy_frame_indexes=vision.noisy_frame_indexes, + token_shapes=vision.token_shapes, + ) # [total_vision_patches,hidden_size] + + packed_sequence[vision.sequence_indexes] = ( + packed_tokens_vision # [total_vision_patches,hidden_size] scattered into [N_total,hidden_size] + ) + return original_latent_shapes + + def _decode_vision( + self, + packed_seq: PackedSequence, + last_hidden_state: torch.Tensor, + output_dict: dict, + original_latent_shapes: List[Tuple[int, int, int]] | None = None, + ) -> None: + """Decode vision tokens from hidden states and update output_dict. + + Args: + packed_seq: PackedSequence containing mse_loss_indexes_vision and token_shapes_vision. + last_hidden_state: Hidden states from the transformer. + output_dict: Output dictionary to update with mse_preds (modified in-place). + original_latent_shapes: Original latent shapes before padding (for unpadding). + """ + vision = packed_seq.vision + # Check if no vision or no noisy vision tokens + has_noisy_vision = ( + vision is not None + and vision.tokens is not None + and isinstance(vision.mse_loss_indexes, torch.Tensor) + and vision.mse_loss_indexes.numel() > 0 + ) + if not has_noisy_vision: + # No noisy vision tokens present. The model is predicting actions + # given clean vision tokens. We need to execute a dummy forward to maintain + # computation graph consistency across ranks (FSDP should torch all weights). + preds_vision = torch.zeros( + [1, self.patch_latent_dim], device=last_hidden_state.device, dtype=last_hidden_state.dtype + ) # [1,patch_latent_dim] + preds_vision = self.vae2llm(preds_vision) # [1,hidden_size] + preds_vision = self.llm2vae(preds_vision) # [1,patch_latent_dim] + # Return a list of per-sample zero tensors with correct shapes (e.g. (C, T, H, W)), + # so downstream code (_get_velocity, _compute_flow_matching_loss) that iterates over preds_vision + # gets properly-shaped tensors. Without this, the dummy tensor (1, patch_latent_dim) + # would cause a size mismatch when concatenating vision+action velocities. + # When vision is None (no vision in batch), fall back to [preds_vision] purely for + # gradient graph consistency — it won't be iterated over. + if vision is not None and vision.tokens is not None: + preds_vision_list = [torch.zeros_like(tok) for tok in vision.tokens] + # Inject dummy forward's computation graph so vae2llm/llm2vae params + # stay in the autograd graph (zeros_like creates detached tensors). + preds_vision_list[0] = preds_vision_list[0] + 0.0 * preds_vision.sum() + else: + preds_vision_list = [preds_vision] + output_dict.update(preds_vision=preds_vision_list) + else: + assert vision is not None # Type narrowing + assert isinstance(vision.mse_loss_indexes, torch.Tensor) + assert vision.noisy_frame_indexes is not None + preds_vision = self.llm2vae( + last_hidden_state[vision.mse_loss_indexes] + ) # [total_noisy_vision_patches,patch_latent_dim] + preds_vision = self.unpatchify_and_unpack_latents( + preds_vision, + token_shapes_vision=vision.token_shapes, + noisy_frame_indexes_vision=vision.noisy_frame_indexes, + original_latent_shapes=original_latent_shapes, + ) + output_dict.update(preds_vision=preds_vision) + + def _encode_action( + self, + packed_seq: PackedSequence, + packed_sequence: torch.Tensor, + target_dtype: torch.dtype, + ) -> None: + """Encode action tokens and fill into packed_sequence.""" + if packed_seq.action is None or packed_seq.action.tokens is None: + # No action tokens in this batch + return + + action: ModalityData = packed_seq.action + assert action.token_shapes is not None + assert isinstance(action.sequence_indexes, torch.Tensor) + assert isinstance(action.timesteps, torch.Tensor) + assert isinstance(action.mse_loss_indexes, torch.Tensor) + + # Pack variable-length action tokens into a 1D sequence (same pattern as pack_sound_latents) + packed_tokens_action, per_token_domain_id = self.pack_action( + action.tokens, action.token_shapes, action.domain_id + ) + packed_tokens_action = self.action2llm(packed_tokens_action, per_token_domain_id) + + packed_tokens_action = packed_tokens_action + self.action_modality_embed.view( + 1, -1 + ) # [B_action*T_action,hidden_size] + + has_noisy_actions = has_noisy_tokens(action) + if has_noisy_actions: + timesteps_action = action.timesteps * self.timestep_scale # [N_noisy_frames_action] + packed_timestep_embeds_action = self._embed_packed_timesteps( + timesteps_action, packed_seq + ) # [N_noisy_frames_action,hidden_size] + packed_timestep_embeds_action = packed_timestep_embeds_action.to( + target_dtype + ) # [N_noisy_frames_action,hidden_size] + + packed_tokens_action = _apply_timestep_embeds_to_noisy_tokens( + packed_tokens=packed_tokens_action, + packed_timestep_embeds=packed_timestep_embeds_action, + noisy_frame_indexes=action.noisy_frame_indexes, + token_shapes=action.token_shapes, + ) # [B_action*T_action,hidden_size] + + if self.behavior_pbd is not None and self.behavior_adapter is not None: + if not all(hasattr(packed_seq, name) for name in ("behavior_global", "behavior_phase", "behavior_effect", "behavior_effect_valid")): + raise ValueError("Zeva requires task context, phase and BIT features") + action_lengths = {int(tokens.shape[0]) for tokens in action.tokens} + if len(action_lengths) != 1: + raise ValueError("Zeva policy injection requires a fixed action horizon within each batch") + prior_mean, prior_std = self.behavior_pbd( + packed_seq.behavior_global, + packed_seq.behavior_phase, + packed_seq.behavior_effect, + packed_seq.behavior_effect_valid, + ) + residual = self.behavior_adapter( + prior_mean, + action_length=action_lengths.pop(), + leading_condition_steps=self.behavior_prior_leading_condition_steps, + ) + if self.training and self.behavior_prior_dropout_rate: + keep = torch.rand((residual.shape[0], 1, 1), device=residual.device) >= self.behavior_prior_dropout_rate + residual = residual * keep.to(residual.dtype) + elif not self.training: + residual = residual * self.behavior_prior_inference_guidance_scale + packed_tokens_action = packed_tokens_action + residual.flatten(0, 1).to(packed_tokens_action.dtype) + packed_seq.behavior_prior_mean = prior_mean + packed_seq.behavior_prior_std = prior_std + + packed_sequence[action.sequence_indexes] = ( + packed_tokens_action # [B_action*T_action,hidden_size] scattered into [N_total,hidden_size] + ) + + def _decode_action( + self, + packed_seq: PackedSequence, + last_hidden_state: torch.Tensor, + output_dict: dict, + ) -> None: + """Decode action tokens from hidden states and update output_dict.""" + action = packed_seq.action + # Shared predicate with OmniMoTModel's has_noisy_actions gating: actions + # are decodable targets only when the packer marked action tokens noisy. + has_noisy_action = has_noisy_tokens(action) + if not has_noisy_action: + # dummy forward to maintain computation graph consistency across ranks + preds_action = torch.zeros( + [1, self.action_dim], device=last_hidden_state.device, dtype=last_hidden_state.dtype + ) # [1,action_dim] + dummy_domain_id = torch.zeros([1], device=last_hidden_state.device, dtype=torch.long) # [1] + preds_action = self.action2llm(preds_action, dummy_domain_id) + self.action_modality_embed.view( + 1, -1 + ) # [1,hidden_size] + preds_action = self.llm2action(preds_action, dummy_domain_id) # [1,action_dim] + # Return a list of per-sample zero tensors with correct shapes (e.g. (T, action_dim)), + # so downstream code (_get_velocity, _compute_flow_matching_loss) that iterates over preds_action + # gets properly-shaped tensors. Without this, the dummy tensor (1, action_dim) + # would cause a size mismatch when concatenating vision+action velocities. + if action is not None and action.tokens is not None: + preds_action_list = [torch.zeros_like(tok) for tok in action.tokens] + # Inject dummy forward's computation graph so DomainAwareLinear params + # stay in the autograd graph (zeros_like creates detached tensors). + preds_action_list[0] = preds_action_list[0] + 0.0 * preds_action.sum() + # When action is None (no action in batch), fall back to [preds_action] purely for + # gradient graph consistency — it won't be iterated over. + else: + preds_action_list = [preds_action] + output_dict.update(preds_action=preds_action_list) + else: + assert action is not None # Type narrowing + assert isinstance(action.mse_loss_indexes, torch.Tensor) + assert action.condition_mask is not None + assert len(action.domain_id) > 0 + + action_hidden_states = last_hidden_state[action.mse_loss_indexes] # [total_noisy_action_tokens,hidden_size] + + # Build per-token domain IDs for the noisy tokens (same expansion logic as pack_action) + domain_ids: list[torch.Tensor] = [] + for nfi, d_id in zip(action.noisy_frame_indexes, action.domain_id): + domain_ids.append(d_id.expand(len(nfi))) + per_token_domain_id = torch.cat(domain_ids, dim=0) + + preds_action = self.llm2action( + action_hidden_states, per_token_domain_id + ) # [total_noisy_action_tokens,action_dim] + # The frozen base output is always computed first. R3's + # zero-initialized residual expert is always on at inference: the + # training-only event metadata must never become a phase/task + # router. The legacy explicit gate remains available only when + # ``always_on`` is false, preserving the old experiment's exact + # bypass semantics without confusing it with R3. + residual_cfg = self.config.residual_expert_config or {} + residual_always_on = bool(residual_cfg.get("always_on", False)) + if self.action_residual_head is not None and (residual_always_on or action.residual_gate is not None): + residual_delta = self.action_residual_head(action_hidden_states) + arm_limit = float(residual_cfg.get("arm_limit", 0.05)) + gripper_limit = float(residual_cfg.get("gripper_limit", 0.5)) + gripper_index = int(residual_cfg.get("gripper_index", 7 if self.action_dim == 8 else 9)) + if arm_limit < 0 or gripper_limit < 0: + raise ValueError("Residual arm/gripper limits must be non-negative") + offset = 0 + bounded_parts: list[torch.Tensor] = [] + for sample_index, nfi in enumerate(action.noisy_frame_indexes): + count = int(nfi.numel()) + delta_i = residual_delta[offset : offset + count] + if residual_always_on: + gate_i = torch.ones((count, 1), device=delta_i.device, dtype=delta_i.dtype) + else: + gate_i = action.residual_gate[sample_index].to( + device=delta_i.device, dtype=delta_i.dtype + ) + gate_i = gate_i.index_select(0, nfi.to(device=gate_i.device)).reshape(-1, 1) + raw_dim = action.raw_action_dim[sample_index] if action.raw_action_dim is not None else None + delta_i = bounded_action_residual( + delta_i, + gate_i, + arm_limit=arm_limit, + gripper_limit=gripper_limit, + gripper_index=gripper_index, + raw_action_dim=raw_dim, + ) + bounded_parts.append(delta_i) + offset += count + if bounded_parts: + preds_action = preds_action + torch.cat(bounded_parts, dim=0) + preds_action = self.unpack_action(preds_action, action.token_shapes, action.noisy_frame_indexes) + output_dict.update(preds_action=preds_action) + + def _encode_sound( + self, + packed_seq: PackedSequence, + packed_sequence: torch.Tensor, + target_dtype: torch.dtype, + ) -> None: + """Encode sound tokens and fill into packed_sequence. + + Args: + packed_seq: PackedSequence containing sound tokens and metadata. + packed_sequence: The packed sequence tensor to fill sound embeddings into (modified in-place). + target_dtype: Target dtype for embeddings (typically from text embedding). + """ + if packed_seq.sound is None or packed_seq.sound.tokens is None: + # No sound tokens in this batch + return + + sound = packed_seq.sound + assert sound.token_shapes is not None + assert isinstance(sound.sequence_indexes, torch.Tensor) + assert isinstance(sound.timesteps, torch.Tensor) + assert isinstance(sound.mse_loss_indexes, torch.Tensor) + + # Pack sound latents: list of [C, T] tensors → [total_tokens, C] + packed_tokens_sound = self.pack_sound_latents( + sound.tokens, sound.token_shapes + ) # [total_sound_tokens,sound_dim] + packed_tokens_sound = packed_tokens_sound.to(target_dtype) # [total_sound_tokens,sound_dim] + + # Project sound tokens + modality embedding. Position info comes from + # mRoPE position IDs in the attention layers. + packed_tokens_sound = ( + self.sound2llm(packed_tokens_sound) + self.sound_modality_embed + ) # [total_sound_tokens,hidden_size] + + has_noisy_sound = sound.mse_loss_indexes.numel() > 0 + if has_noisy_sound: + timesteps_sound = sound.timesteps * self.timestep_scale # [N_noisy_frames_sound] + packed_timestep_embeds_sound = self._embed_packed_timesteps( + timesteps_sound, packed_seq + ) # [N_noisy_frames_sound,hidden_size] + packed_timestep_embeds_sound = packed_timestep_embeds_sound.to( + target_dtype + ) # [N_noisy_frames_sound,hidden_size] + + packed_tokens_sound = _apply_timestep_embeds_to_noisy_tokens( + packed_tokens=packed_tokens_sound, + packed_timestep_embeds=packed_timestep_embeds_sound, + noisy_frame_indexes=sound.noisy_frame_indexes, + token_shapes=sound.token_shapes, + ) # [total_sound_tokens,hidden_size] + + packed_sequence[sound.sequence_indexes] = ( + packed_tokens_sound # [total_sound_tokens,hidden_size] scattered into [N_total,hidden_size] + ) + + def _decode_sound( + self, + packed_seq: PackedSequence, + last_hidden_state: torch.Tensor, + output_dict: dict, + ) -> None: + """Decode sound tokens from hidden states and update output_dict. + + Args: + packed_seq: PackedSequence containing sound modality data. + last_hidden_state: Hidden states from the transformer. + output_dict: Output dictionary to update with preds_sound (modified in-place). + """ + sound = packed_seq.sound + # Check if no sound or no noisy sound tokens + has_noisy_sound = ( + sound is not None + and sound.tokens is not None + and isinstance(sound.mse_loss_indexes, torch.Tensor) + and sound.mse_loss_indexes.numel() > 0 + ) + if not has_noisy_sound: + # dummy forward to maintain computation graph consistency across ranks + preds_sound = torch.zeros( + [1, self.sound_dim], device=last_hidden_state.device, dtype=last_hidden_state.dtype + ) # [1,sound_dim] + preds_sound = self.sound2llm(preds_sound) + self.sound_modality_embed # [1,hidden_size] + preds_sound = self.llm2sound(preds_sound) # [1,sound_dim] + if sound is not None and sound.tokens is not None: + preds_sound_list = [torch.zeros_like(tok) for tok in sound.tokens] + preds_sound_list[0] = preds_sound_list[0] + 0.0 * preds_sound.sum() + else: + preds_sound_list = [preds_sound] + output_dict.update(preds_sound=preds_sound_list) + else: + assert sound is not None # Type narrowing + assert isinstance(sound.mse_loss_indexes, torch.Tensor) + assert sound.condition_mask is not None + preds_sound = self.llm2sound( + last_hidden_state[sound.mse_loss_indexes] + ) # [total_noisy_sound_tokens,sound_dim] + preds_sound = self.unpack_sound_latents( + preds_sound, sound.token_shapes, sound.noisy_frame_indexes + ) # list of [C,T] per sample + output_dict.update(preds_sound=preds_sound) + + def forward( + self, + packed_seq: PackedSequence, + memory: MemoryState | None = None, + video_temporal_causal: bool | None = None, + ) -> dict: + """ + Forward pass for Cosmos3VFMNetwork. + + Args: + packed_seq: PackedSequence containing all packed tensors and metadata. + See PackedSequence dataclass for field details. + memory: Optional MemoryState for persistent KV-cache memory + (AR inference or rolling-KV-cache training). Built by + ``OmniMoTModel.build_memory_state()``. + video_temporal_causal: Per-call attention-mode override; ``None`` + (default) uses the config-selected ``self.video_temporal_causal``. + + Returns: + dict with keys: + - "preds_vision": list[Tensor[C,T,H,W]], one per sample. + - "preds_action": Velocity predictions for action tokens (if action_gen). + - "preds_sound": Velocity predictions for sound tokens (if sound_gen). + - "last_hidden_state": Last hidden state from the transformer. + - "lbl_metadata_*": Load balancing metadata. + - "ce_preds": Cross-entropy predictions (if predict_text_tokens is True). + """ + # Note: During inference with @torch.no_grad(), model may be in training mode + # This is intentional for proper batch norm / dropout behavior + # assert self.training, "Cosmos3VFMNetwork only supports training mode" + + packed_sequence, target_dtype = self._encode_text(packed_seq) # packed_sequence: [N_total,hidden_size] + self._encode_behavior_prefix(packed_seq, packed_sequence, target_dtype) + self._encode_online_memory_prefix(packed_seq, packed_sequence, target_dtype) + self._encode_proprio_prefix(packed_seq, packed_sequence, target_dtype) + + # encode vision tokens + original_latent_shapes: List[Tuple[int, int, int]] | None = None + if self.config.vision_gen: + original_latent_shapes = self._encode_vision(packed_seq, packed_sequence, target_dtype) + + # encode action tokens + if self.config.action_gen: + self._encode_action(packed_seq, packed_sequence, target_dtype) + + # encode sound tokens + if self.config.sound_gen: + self._encode_sound(packed_seq, packed_sequence, target_dtype) + + assert packed_seq.attn_modes is not None + assert packed_seq.split_lens is not None + use_video_temporal_causal = ( + self.video_temporal_causal if video_temporal_causal is None else video_temporal_causal + ) + + # Get all generation sequence indexes for MoE routing + # IMPORTANT: Include ALL latent tokens (video + action + sound), not just generation targets. + # Condition tokens still need to be routed to diffusion experts; they are excluded from + # LOSS computation, not from routing. + all_gen_indexes = [] + if packed_seq.vision is not None: + assert packed_seq.vision.token_shapes is not None + assert isinstance(packed_seq.vision.sequence_indexes, torch.Tensor) + all_gen_indexes.append(packed_seq.vision.sequence_indexes) + if packed_seq.action is not None and isinstance(packed_seq.action.sequence_indexes, torch.Tensor): + all_gen_indexes.append(packed_seq.action.sequence_indexes) + if packed_seq.sound is not None and isinstance(packed_seq.sound.sequence_indexes, torch.Tensor): + all_gen_indexes.append(packed_seq.sound.sequence_indexes) + vision_sequence_indexes = torch.cat(all_gen_indexes, dim=0) if all_gen_indexes else None # [N_gen_tokens] + + # When temporal causal is enabled the buffer is [action_t0, vision_t0, action_t1, vision_t1, ...]. + # After torch.cat([vision_indexes, action_indexes]) the interleaved order is lost; sorting restores it. + if self.video_temporal_causal: + assert packed_seq.sound is None, "Sound generation is not supported with video_temporal_causal=True." + if vision_sequence_indexes is not None: + vision_sequence_indexes = vision_sequence_indexes.sort().values # [N_gen_tokens] + + vision_token_shapes = packed_seq.vision.token_shapes if packed_seq.vision else None + + # The packer is the single source of truth for the supertoken layout. + # ``num_action_tokens_per_supertoken`` is stamped onto ``packed_seq`` by + # ``pack_supertokens_temporal_causal`` (= tcf when actions are packed + # inline, 0 otherwise) and read unchanged by the attention builder, the + # NATTEN metadata generator, and the rolling KV-cache state — keeping + # all downstream supertoken geometry automatically in sync with the pack. + num_action_tokens_per_supertoken = packed_seq.num_action_tokens_per_supertoken + + replicated_attention_io_cp = ( + self.attention_io_layout == "replicated" + and self.parallel_dims is not None + and self.parallel_dims.cp_enabled + ) + # ``sequence_sharded`` attention I/O shards the token sequence, so + # packing must pad sequence lengths to the CP size and the input/output + # sequence helpers need the CP mesh. ``replicated`` attention I/O keeps + # current-frame sequences replicated and uses the CP mesh later inside + # attention to slice local heads, so the effective sequence-sharding + # world size is 1 here. + sequence_shard_parallel_dims = None if replicated_attention_io_cp else self.parallel_dims + sequence_shard_world_size = ( + 1 if replicated_attention_io_cp else (self.parallel_dims.cp_size if self.parallel_dims else 1) + ) + prepared_sequence_pack_metadata = packed_seq.get_sequence_pack_metadata() + + packed_understanding_indexes = torch.cat( + ( + packed_seq.behavior_indexes, + packed_seq.online_memory_indexes, + packed_seq.proprio_indexes, + packed_seq.text_indexes, + ) + ).sort().values + input_pack, attention_meta, natten_metadata_list = build_packed_sequence( + self.config.joint_attn_implementation, + packed_sequence=packed_sequence, + attn_modes=packed_seq.attn_modes, + split_lens=packed_seq.split_lens, + sample_lens=packed_seq.sample_lens, + packed_und_token_indexes=packed_understanding_indexes, + packed_gen_token_indexes=vision_sequence_indexes, + num_heads=self.num_heads, + is_image_batch=packed_seq.is_image_batch, + head_dim=self.head_dim, + num_layers=self.num_hidden_layers, + token_shapes=packed_seq.vision.token_shapes, + natten_parameter_list=self.natten_parameter_list, + cp_world_size=sequence_shard_world_size, + video_temporal_causal=use_video_temporal_causal, + skip_natten_metadata=memory is not None and not memory.requires_natten_metadata(), + vision_token_shapes=vision_token_shapes, + action_token_shapes=packed_seq.action.token_shapes if packed_seq.action else None, + num_action_tokens_per_supertoken=num_action_tokens_per_supertoken, + null_action_supertokens=packed_seq.null_action_supertokens, + pad_for_cuda_graphs=self.pad_for_cuda_graphs, + prepared_metadata=prepared_sequence_pack_metadata, + ) + + # ── Multi-control transfer: annotate SplitInfo with per-item ranges ────── + # Activated only when packed_seq carries control_weights, i.e. the caller + # has set up a multi-control batch via build_transfer_batch. + # + # multi_control_two_way_attention runs N independent maskless SDPA passes, + # one per control. For each pass i, KV = [text | ctrl_i | noisy]. + # The final noisy output is the weighted sum of the N pass outputs: + # noisy_out = w_1 * noisy_out_1 + ... + w_N * noisy_out_N + # All SDPA calls are maskless → Flash Attention always active. + # N=1, w=1.0 → identical to two_way_attention. + # + # CP compatibility: control_stream_token_ranges are gen-relative global + # offsets computed here, before CP sharding. Ulysses CP restores the full + # sequence on every rank (via all-to-all) before calling dispatch_attention, + # so the global ranges are valid indices inside multi_control_two_way_attention. + if ( + isinstance(attention_meta, SplitInfo) + and packed_seq.control_weights is not None + and packed_seq.vision_item_split_lens + ): + # For multi-control, each sample must have N controls + 1 noisy item + # (items 0..N-2 are controls, item N-1 is the noisy target). + # Only batch_size=1 is supported; assert to catch misuse early. + assert len(packed_seq.vision_item_split_lens) == 1, ( + f"Multi-control transfer requires batch_size=1, got {len(packed_seq.vision_item_split_lens)} samples." + ) + item_lens = packed_seq.vision_item_split_lens[0] # [L_ctrl0, L_ctrl1, ..., L_noisy] + weights = packed_seq.control_weights[0] # [w_ctrl0, w_ctrl1, ...] + assert len(item_lens) > 1, ( + f"Multi-control requires at least 1 control + 1 noisy item; got vision_item_split_lens={item_lens}." + ) + assert len(weights) == len(item_lens) - 1, ( + f"control_weights length ({len(weights)}) must equal number of control items ({len(item_lens) - 1})." + ) + ctrl_ranges: list[tuple[int, int]] = [] + cursor = 0 + for lens in item_lens[:-1]: # all but last = control streams + ctrl_ranges.append((cursor, cursor + lens)) + cursor += lens + noisy_range = (cursor, cursor + item_lens[-1]) + n_gen = int(vision_sequence_indexes.shape[0]) if vision_sequence_indexes is not None else 0 + assert noisy_range[1] == n_gen, ( + f"vision_item_split_lens sums to {noisy_range[1]} gen tokens but packed tensor has " + f"{n_gen}; packing inconsistency detected." + ) + attention_meta.control_stream_token_ranges = ctrl_ranges + attention_meta.noisy_token_range = noisy_range + attention_meta.control_weights = weights + + input_pack, packed_position_ids = get_context_parallel_sharded_sequence( + attn_implementation=self.config.joint_attn_implementation, + input_pack=input_pack, + position_ids=packed_seq.position_ids, + parallel_dims=sequence_shard_parallel_dims, + ) + + packed_outputs, lbl_metadata = self.language_model( + input_pack, + attention_mask=attention_meta, + position_ids=packed_position_ids, + natten_metadata_list=natten_metadata_list, + memory=memory, + ) + last_hidden_state = get_context_parallel_last_hidden_state( + packed_outputs=packed_outputs, + parallel_dims=sequence_shard_parallel_dims, + ) # [N_total,hidden_size] + output_dict = dict() + + # decode vision tokens + if self.config.vision_gen: + self._decode_vision(packed_seq, last_hidden_state, output_dict, original_latent_shapes) + + # decode action tokens + if self.config.action_gen: + self._decode_action(packed_seq, last_hidden_state, output_dict) + if self.behavior_pbd is not None and hasattr(packed_seq, "behavior_prior_mean"): + output_dict["behavior_prior_mean"] = packed_seq.behavior_prior_mean + output_dict["behavior_prior_std"] = packed_seq.behavior_prior_std + + # decode sound tokens + if self.config.sound_gen: + self._decode_sound(packed_seq, last_hidden_state, output_dict) + + output_dict.update(last_hidden_state=last_hidden_state) + for lbl_metadata_key, lbl_metadata_value in lbl_metadata.items(): + output_dict.update({f"lbl_metadata_{lbl_metadata_key}": lbl_metadata_value}) + if self.predict_text_tokens: + packed_ce_preds = self.language_model.lm_head( + last_hidden_state[packed_seq.ce_loss_indexes] + ) # [N_ce_tokens,vocab_size] + output_dict["ce_preds"] = packed_ce_preds + + return output_dict + + +def _apply_timestep_embeds_to_noisy_tokens( + packed_tokens: torch.Tensor, + packed_timestep_embeds: torch.Tensor, + noisy_frame_indexes: List[torch.Tensor], + token_shapes: list[tuple[int, ...]], +) -> torch.Tensor: + """Apply timestep embeddings to noisy tokens. + Tn is the number of noisy frames for a given sample. + Tc is the number of clean frames for a given sample. + T is the total number of frames for a given sample. + T = Tn + Tc + + Args: + packed_tokens: The packed tokens to apply timestep embeddings to. + packed_timestep_embeds: The packed timestep embeddings to apply. + noisy_frame_indexes: The frame indices to apply timestep embeddings to + (list of tensors, each with shape (Tn,)). + token_shapes: The token shapes for each sample. Each entry is a tuple + shaped like ``(T, ...)`` where trailing dimensions represent the spatial grid. + + Returns: + The packed tokens with timestep embeddings applied to the noisy tokens. + """ + + # Handle variable token shapes by processing each sample's noisy_frame_indexes individually. + # The noisy indices are first expanded to cover the entire spatial grid of each frame. + # + # For video frames, the spatial grid is (H, W). + # For action frames, the spatial grid is (). + # For sound frames, the spatial grid is (1, 1). + # + # The noisy indices are then flattened into a single tensor overall. When flattening, + # we must ensure that the noisy indices from each sample are unique by adding the + # cumulative sum of the token shapes of previous samples to the noisy indices for + # a given sample. + start_noisy_index = 0 + flattened_noisy_frame_indexes = [] + + for noisy_indexes_i, token_shape_i in zip(noisy_frame_indexes, token_shapes): + assert noisy_indexes_i.numel() <= token_shape_i[0] + spatial_numel_i = math.prod(token_shape_i[1:]) + spatial_indexes_i = torch.arange(spatial_numel_i, device=packed_tokens.device) # [spatial_numel_i] + noisy_indexes_i = ( + (noisy_indexes_i * spatial_numel_i).unsqueeze(-1).expand(-1, spatial_numel_i) + ) # [Tn_i,spatial_numel_i] + noisy_indexes_i = noisy_indexes_i.clone() + spatial_indexes_i + start_noisy_index # [Tn_i,spatial_numel_i] + flattened_noisy_frame_indexes.append(noisy_indexes_i.flatten()) # [Tn_i*spatial_numel_i] + start_noisy_index += math.prod(token_shape_i) + + flattened_noisy_frame_indexes = torch.cat(flattened_noisy_frame_indexes, dim=0) # [total_noisy_patches] + + assert packed_tokens.dim() == 2 + assert packed_timestep_embeds.dim() == 2 + assert packed_timestep_embeds.shape[1] == packed_tokens.shape[1] + assert packed_timestep_embeds.shape[0] <= packed_tokens.shape[0] + assert flattened_noisy_frame_indexes.dim() == 1 + assert flattened_noisy_frame_indexes.shape[0] == packed_timestep_embeds.shape[0] + + flattened_noisy_frame_indexes = flattened_noisy_frame_indexes.unsqueeze(-1).expand( + -1, + packed_tokens.shape[1], + ) # [total_noisy_patches,hidden_size] + + return packed_tokens.scatter_add( + dim=0, + index=flattened_noisy_frame_indexes, + src=packed_timestep_embeds, + ) # [total_tokens,hidden_size] diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/generator/omni_mot_model.py b/releases/bridge-native-v3/code/cosmos_framework/model/generator/omni_mot_model.py new file mode 100644 index 0000000000000000000000000000000000000000..3715621f602beaaac22384a8f140434096b6a3cc --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/generator/omni_mot_model.py @@ -0,0 +1,5877 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +from __future__ import annotations + +import collections +import dataclasses +import json +import time +from collections.abc import Sequence +from contextlib import contextmanager +from typing import Any, Callable, Dict, Mapping, Optional, Tuple + +import numpy as np +import torch +import torch.distributed as dist +from einops import rearrange +from torch.distributed._composable.fsdp import FSDPModule +from torch.nn.modules.module import _IncompatibleKeys + +from cosmos_framework.utils.flags import DEVICE, TRAINING, Device +from cosmos_framework.utils.lazy_config import LazyDict +from cosmos_framework.utils.lazy_config import instantiate as lazy_instantiate +from cosmos_framework.model._base import ImaginaireModel +from cosmos_framework.utils import log, misc +from cosmos_framework.utils.count_params import count_params +from cosmos_framework.utils.timer import Timer +from cosmos_framework.model.generator.algorithm.loss.flow_matching import compute_flow_matching_loss +from cosmos_framework.model.generator.algorithm.loss.load_balancing import compute_load_balancing_loss +from cosmos_framework.configs.base.defaults.model_config import OmniMoTModelConfig +from cosmos_framework.data.generator.action.action_processing import ActionProcessor, get_action_processing_records +from cosmos_framework.data.generator.utils import IMAGE_RES_SIZE_INFO, VIDEO_RES_SIZE_INFO +from cosmos_framework.model.generator.diffusion.rectified_flow import RectifiedFlow +from cosmos_framework.model.generator.diffusion.samplers.edm import EDMSampler +from cosmos_framework.model.generator.diffusion.samplers.fixed_step import FixedStepSampler +from cosmos_framework.model.generator.diffusion.samplers.unipc import UniPCSampler, UniPCSamplerConfig +from cosmos_framework.model.generator.mot.context_parallel_utils import ( + broadcast_context_parallel_object, + context_parallel_broadcast_tensor_list, +) +from cosmos_framework.model.generator.mot.cosmos3_vfm_network import Cosmos3VFMNetwork, Cosmos3VFMNetworkConfig +from cosmos_framework.model.generator.mot.inference_text_kv_memory import ( + InferenceTextKVMemoryState, + UndKVCache, + install_inference_memory_attention_dispatch, + make_inference_text_kv_cache, + restore_inference_attention_dispatch, +) +from cosmos_framework.model.generator.mot.modeling_utils import has_noisy_tokens +from cosmos_framework.model.generator.mot.parallelize_vfm_network import parallelize_vfm_network +from cosmos_framework.model.generator.reasoner.qwen3_vl.utils import tokenize_caption +from cosmos_framework.model.generator.utils.data_and_condition import ( + GenerationDataClean, + GenerationDataNoised, + _expand_per_sample_to_per_vision_item, + build_dense_sound_schedule, + unwrap_and_densify, +) +from cosmos_framework.model.generator.utils.memory import MemoryState +from cosmos_framework.model.generator.utils.moe_utils import ( + sync_expert_biases_to_ema, + sync_router_biases_to_ema, + update_expert_biases, + update_router_biases, + uses_aux_loss_free_load_balancing, + uses_ema_router_bias, +) +from cosmos_framework.model.generator.utils.safetensors_loader import ( + load_language_model as load_language_model_safetensors, +) +from cosmos_framework.data.generator.sequence_packing import ( + PackedSequence, + SequencePlan, + build_sequence_plans_from_data_batch, + pack_input_sequence, +) +from cosmos_framework.data.generator.sequence_packing.modality import add_special_tokens +from cosmos_framework.model.zeva import gaussian_prior_nll +from cosmos_framework.model.generator.tokenizers.interface import VideoTokenizerInterface +from cosmos_framework.model.generator.upsampler.prompts import build_messages, clean_response +from cosmos_framework.utils.generator.data_utils import get_vision_data_resolution, read_positive_int_metadata +from cosmos_framework.utils.generator.dtensor_helper import DTensorFastEmaModelUpdater +from cosmos_framework.utils.generator.model_weights_stats import WeightTrainingStat +from cosmos_framework.utils.generator.parallelism import ParallelDims + + +class OmniMoTModel(ImaginaireModel): + """ + Mixture of Transformers (MoT) model to be trained with the flow matching objective + for visual / sound / action generation. + """ + + def __init__(self, config: OmniMoTModelConfig): + super().__init__() + # This rank's post-tokenizer payload, encoded once at the start of each + # CP data window and retained until every CP rank has owned one slot. + self._cp_local_training_payload: dict[str, Any] | None = None + # Current owner rank in the CP data window; advances modulo CP size after + # each successful training step and returns to 0 for the next window. + self._cp_window_slot: int = 0 + self.config = config + log.info(f"OmniMoTModel: config {self.config}") + + # 0. Set up precision + self.set_precision() + + # 1. Set data keys and data information + self.set_up_data_key() + + # 2. Text, vision, audio, action tokenizers + self.set_up_tokenizers() + + # 3. FSDP setup. Note: call this before building the model. + self.set_up_parallelism() + + # 4. Build the denoiser network + self.set_up_model() + + # 5. Set up training time scheduler and inference time sampler + self.set_up_scheduler_and_sampler() + + self.log_enc_time_every_n = config.log_enc_time_every_n + + def set_precision(self) -> None: + self.precision = getattr(torch, self.config.precision) + self.tensor_kwargs = {"device": DEVICE, "dtype": self.precision} + self.tensor_kwargs_fp32 = {"device": DEVICE, "dtype": torch.float32} + log.warning(f"OmniMoTModel: precision {self.precision}") + + # Disable TF32 for CUDA matrix multiplications since this may impact model quality. + torch.backends.cudnn.allow_tf32 = torch.backends.cuda.matmul.allow_tf32 = False + + def set_up_data_key(self) -> None: + self.input_video_key = self.config.input_video_key # by default it is video key for Video diffusion model + self.input_image_key = self.config.input_image_key + self.input_caption_key = self.config.input_caption_key + + @misc.timer("OmniMoTModel: set_up_tokenizers") + def set_up_tokenizers(self) -> None: + """ + Variable names follow the naming convention: + - tokenizer__gen if used for generation branch + - tokenizer__und if used for understanding branch + """ + # 1. Text tokenizer + self.vlm_config = self.config.vlm_config + + # Keep the full processor handy for the I2V branch of + # ``upsample_captions``: ``apply_chat_template`` on a multimodal + # processor (e.g. ``Qwen3VLProcessor``) emits ``input_ids`` with + # the image-placeholder tokens, plus the matched + # ``pixel_values`` / ``image_grid_thw`` tensors that + # ``generate_reasoner_text`` consumes for image-conditioned + # prefill. ``add_special_tokens`` modifies the tokenizer + # in-place via ``add_tokens``, so ``_vlm_proc.processor.tokenizer`` + # already reflects the Cosmos3 ``<|vision_start|>`` / + # ``<|vision_end|>`` additions; nothing else to plumb. For + # LLM-only configs (``LLMTokenizerProcessor``) this attribute + # exists but ``apply_chat_template`` is not implemented, which + # ``upsample_captions`` checks before driving the multimodal + # path. + + # Annotated ``Any`` because the live processor is duck-typed + # across ``Qwen3VLProcessor`` (carries ``apply_chat_template`` for + # the multimodal path) and ``LLMTokenizerProcessor`` (text-only, + # no ``apply_chat_template``); the upsampler's runtime branch on + # ``callable(getattr(self.vlm_processor, "apply_chat_template", None))`` + # is the source of truth. Without the annotation, basedpyright + # narrows the ``lazy_instantiate`` overload return to + # ``list[Unknown]`` and reports ``apply_chat_template`` missing. + self.vlm_processor: Any = lazy_instantiate(self.vlm_config.tokenizer) + + vlm_tokenizer = self.vlm_processor.tokenizer + vlm_tokenizer, special_tokens = add_special_tokens(vlm_tokenizer) + self.vlm_tokenizer = vlm_tokenizer + + self.llm_special_tokens = special_tokens + self.llm_special_tokens["eos_token_id"] = vlm_tokenizer.eos_token_id + + # 2. Vision tokenizer (images/videos) for generation. Reasoner-only + # inference does not encode or decode generation latents, so it can + # leave the VAE unloaded. + self.tokenizer_vision_gen: VideoTokenizerInterface | None = None + if self.config.load_vision_tokenizer: + self.tokenizer_vision_gen = lazy_instantiate(self.config.tokenizer) + assert self.tokenizer_vision_gen.latent_ch == self.config.state_ch, ( + f"vision tokenizer latent_ch {self.tokenizer_vision_gen.latent_ch} != state_shape {self.config.state_ch}" + ) + if hasattr(self.tokenizer_vision_gen, "reset_dtype"): + self.tokenizer_vision_gen.reset_dtype() + else: + log.info("Vision tokenizer initialization skipped") + + # 3. Sound/audio tokenizer (optional) + if self.config.sound_gen: + assert self.config.sound_tokenizer is not None, "sound_tokenizer must be provided when sound_gen is True" + self.tokenizer_sound_gen = lazy_instantiate(self.config.sound_tokenizer) + assert self.config.sound_dim is not None, "sound_dim must be provided when sound_gen is True" + assert self.tokenizer_sound_gen.latent_ch == self.config.sound_dim, ( + f"sound tokenizer latent_ch {self.tokenizer_sound_gen.latent_ch} != sound_dim {self.config.sound_dim}" + ) + if hasattr(self.tokenizer_sound_gen, "reset_dtype"): + self.tokenizer_sound_gen.reset_dtype() + log.info(f"Sound tokenizer initialized: {type(self.tokenizer_sound_gen).__name__}") + else: + self.tokenizer_sound_gen = None + + + def build_net(self, dtype: torch.dtype, *, lora_enabled: bool | None = None) -> torch.nn.Module: + # Build model network and parallelize it. + lora_enabled = self.config.lora_enabled if lora_enabled is None else lora_enabled + with torch.device("meta"): + assert self.vlm_config.model_instance is not None, "Model instance should be specified" + + language_model = lazy_instantiate(self.vlm_config.model_instance) + + # NOTE: We pass "RF timesteps" to the network in the same scale as the scheduler + # (i.e., roughly [0, num_train_timesteps]). The MoT network expects to internally + # rescale timesteps before embedding; avoid hard-coding 1e-3 by computing it from + # the configured scheduler resolution. + num_train_timesteps = self.config.rectified_flow_inference_config.num_train_timesteps + network_config = Cosmos3VFMNetworkConfig( + vlm_config=language_model.config, + latent_patch_size=self.config.diffusion_expert_config.patch_spatial, + latent_downsample_factor=self.config.latent_downsample_factor, + latent_channel_size=self.config.state_ch, + max_latent_h=self.config.diffusion_expert_config.max_vae_latent_side_after_patchify, + max_latent_w=self.config.diffusion_expert_config.max_vae_latent_side_after_patchify, + max_latent_t=self.config.state_t, + enable_fps_modulation=self.config.diffusion_expert_config.enable_fps_modulation, + base_fps=self.config.diffusion_expert_config.base_fps, + vision_gen=self.config.vision_gen, + action_gen=self.config.action_gen, + sound_gen=self.config.sound_gen, + joint_attn_implementation=self.config.joint_attn_implementation, + timestep_scale=1.0 / float(num_train_timesteps) * self.config.diffusion_expert_config.timestep_range, + action_dim=self.config.max_action_dim, + num_embodiment_domains=self.config.num_embodiment_domains, + temporal_compression_factor_vision=( + self.tokenizer_vision_gen.temporal_compression_factor + if self.tokenizer_vision_gen is not None + else self.config.tokenizer.temporal_compression_factor + ), + natten_parameter_list=self.config.natten_parameter_list, + video_temporal_causal=self.config.video_temporal_causal, + # Sound generation parameters + sound_dim=self.config.sound_dim, + sound_latent_fps=self.config.sound_latent_fps, + enable_input_bias=self.config.enable_input_bias, + # At runtime TOML/Hydra materializes this attrs default as an + # OmegaConf DictConfig, so use the mapping protocol rather + # than attrs.asdict. + behavior_stage2_config=dict(self.config.behavior_stage2), + proprio_condition_config=dict(self.config.proprio_condition), + residual_expert_config=dict(self.config.residual_expert), + ) + network_config._attn_implementation_internal = "eager" + net = Cosmos3VFMNetwork( + language_model=language_model, + config=network_config, + ) + residual_cfg = self.config.residual_expert + if bool(residual_cfg.get("enabled", False)): + if lora_enabled: + raise ValueError("Residual expert and LoRA cannot be enabled together") + trainable = 0 + for name, parameter in net.named_parameters(): + keep = name.startswith("action_residual_head.") + parameter.requires_grad_(keep) + if keep: + trainable += parameter.numel() + if trainable == 0: + raise RuntimeError("Residual expert is enabled but action_residual_head is absent") + log.info( + f"Frozen-base residual expert: trainable_params={trainable:,}; " + "all Cosmos-Nano-DROID base parameters require_grad=False" + ) + net.pad_for_cuda_graphs = self.config.compile.use_cuda_graphs + + # Inject LoRA BEFORE FSDP wrap, while still on meta device. The + # injector must see unsharded Linear shapes; injecting post-FSDP causes + # lora_B to be created at the per-rank shard size and crashes at + # forward time. See `OmniMoTModel.add_lora` for details. + if lora_enabled: + net = self.add_lora( + net, + lora_rank=self.config.lora_rank, + lora_alpha=self.config.lora_alpha, + lora_target_modules=self.config.lora_target_modules, + ) + + self.install_attention_dispatch(net) + + net = parallelize_vfm_network( + net, + parallel_dims=self.parallel_dims, + compile_config=self.config.compile, + ac_config=self.config.activation_checkpointing, + attention_io_layout=self.config.parallelism.attention_io_layout, + ) + + with misc.timer("meta to cuda and broadcast model states"): + net = net.to(dtype=dtype) + net.to_empty(device=DEVICE) + if DEVICE == Device.CUDA: + # Weight initialization is not needed for other devices (cpu, + # meta), since they are only for checkpoint conversion and smoke + # tests. + net.init_weights(buffer_device=DEVICE) + if lora_enabled: + self._init_lora_weights_post_materialization(net) + + return net + + def load_pretrained_model_if_needed( + self, + *, + has_resumable_checkpoint: bool, + has_load_path: bool, + ) -> None: + """Conditionally seed pretrained understanding/reasoner weights at startup. + + OmniMoT has two weight groups: the understanding/reasoner pathway (the + ``language_model`` backbone, e.g. Qwen3-VL / Cosmos-Reason) and the + generation pathway (the diffusion MoE experts). This hook runs after the + model is built and after DCP has had a chance to restore a checkpoint. It + decides (a) whether the understanding weights still need to be seeded from + the pretrained HuggingFace source, and (b) whether those weights must be + copied into the generation pathway. + + Args: + has_resumable_checkpoint: A ``latest_checkpoint.txt`` exists in the + load directory, i.e. DCP has already restored the full model from a + mid-run checkpoint. The understanding weights are normally present + in such a checkpoint, so the HF load is skipped -- unless + ``exclude_reasoner_weights_from_checkpoint`` is set, in which case + those weights were never checkpointed and must be re-seeded here. + has_load_path: ``checkpoint.load_path`` is set, i.e. DCP has loaded the + full model from a warm-start path. The understanding weights are + still re-seeded from HF (e.g. to swap Qwen3-VL -> Cosmos-Reason), + but the understanding->generation copy is skipped because the + generation pathway was already populated from ``load_path``. + + The gates combine into three startup scenarios: + 1. Fresh init (neither gate set): seed understanding weights from HF and + copy them into the generation pathway. + 2. Warm-start (``has_load_path`` only): re-seed understanding weights, + skip the understanding->generation copy. + 3. Resume (``has_resumable_checkpoint`` set): skip everything, unless + ``exclude_reasoner_weights_from_checkpoint`` forces re-seeding the + understanding weights (the copy is still skipped). + """ + # A checkpoint of any kind (mid-run resume or warm-start load_path) means + # the generation pathway is already populated, so the understanding-> + # generation copy further below must be skipped. + has_checkpoint = has_resumable_checkpoint or has_load_path + + pretrained_weights = self.vlm_config.pretrained_weights + + if self.config.exclude_reasoner_weights_from_checkpoint and not pretrained_weights.enabled: + raise ValueError( + "Reasoner weights must be loaded from pretrained checkpoint when " + "exclude_reasoner_weights_from_checkpoint is True. However, " + "pretrained_weights.enabled is set to False." + ) + + # Seed understanding weights from HF only when the source is enabled and + # either there is no resumable checkpoint to restore them from, or they + # were deliberately excluded from the checkpoint (so it cannot contain + # them and they must be reloaded from the pretrained source). + load_pretrained_weights = pretrained_weights.enabled and ( + self.config.exclude_reasoner_weights_from_checkpoint or not has_resumable_checkpoint + ) + if not load_pretrained_weights: + return + + # Load the language_model (understanding/reasoner backbone) safetensors + # into the given net, respecting the active parallelism layout. + def _load_language_model(net: torch.nn.Module): + load_language_model_safetensors( + model=net.language_model, + checkpoint_path=pretrained_weights.backbone_path, + credential_path=pretrained_weights.credentials_path, + parallel_dims=self.parallel_dims, + checkpoint_format=pretrained_weights.checkpoint_format, + ) + + log.info(f"Loading reasoner pathway weights from {pretrained_weights.backbone_path}") + _load_language_model(self.net) + # Keep the EMA copy in sync with the freshly seeded understanding weights. + if self.config.ema.enabled: + _load_language_model(self.net_ema) + log.info("Successfully loaded reasoner pathway weights.") + + # Copy understanding -> generation only on a truly fresh init: the config + # must request it and no checkpoint (resume or warm-start) may have already + # populated the generation pathway. + load_pretrained_diffusion_weights = ( + self.config.diffusion_expert_config.load_weights_from_pretrained and not has_checkpoint + ) + if not load_pretrained_diffusion_weights: + log.info("Skipping diffusion pathway weights copying.") + return + + # init_moe() copies the understanding-pathway weights into the generation + # (diffusion MoE) experts so generation starts from the pretrained backbone. + log.info("Copying understanding pathway weights to generation pathway.") + self.net.language_model.init_moe() + if self.config.ema.enabled: + self.net_ema.language_model.init_moe() + log.info("Successfully copied understanding pathway weights to generation pathway.") + + @misc.timer("OmniMoTModel: set_up_model") + def set_up_model(self): + assert hasattr(self, "parallel_dims"), "parallel_dims must be set" + config = self.config + with misc.timer("Creating PyTorch model and ema if enabled"): + self.net = self.build_net(dtype=self.precision) + self._param_count = count_params(self.net, verbose=False) + self._uses_aux_loss_free_load_balancing: bool = uses_aux_loss_free_load_balancing(self.net) + self._uses_ema_router_bias: bool = uses_ema_router_bias(self.net) + + if config.ema.enabled: + self.net_ema = self.build_net(dtype=torch.float32) + self.net_ema.requires_grad_(False) + + self.net_ema_worker = DTensorFastEmaModelUpdater() + + s = config.ema.rate + self.ema_exp_coefficient = np.roots([1, 7, 16 - s**-2, 12 - s**-2]).real.max() + + self.net_ema_worker.copy_to(src_model=self.net, tgt_model=self.net_ema) + + self.set_up_memory() + + torch.cuda.empty_cache() + + def install_attention_dispatch(self, net: torch.nn.Module) -> None: + """Install a custom attention dispatch function on the network. + + Called during ``build_net()`` after the network is constructed but + before parallelization. The base implementation is a no-op; + ``OmniMoTCausalModel`` overrides this to install + ``dispatch_attention_with_memory`` on every attention layer. + """ + pass + + def set_up_memory(self) -> None: + """Initialize memory state used during training (e.g. KV caches). + + The base implementation is a no-op. ``OmniMoTCausalModel`` overrides + this to allocate a KV cache. + """ + pass + + def set_up_parallelism(self) -> None: + """Set up the fsdp for the model.""" + self.parallel_dims = ParallelDims( + enable_inference_mode=self.config.parallelism.enable_inference_mode, + world_size=torch.distributed.get_world_size() if torch.distributed.is_initialized() else 1, + dp_shard=self.config.parallelism.data_parallel_shard_degree, + cfgp=self.config.parallelism.cfg_parallel_shard_degree, + cp=self.config.parallelism.context_parallel_shard_degree, + ) + self.parallel_dims.build_meshes(device_type=DEVICE) + + def set_up_scheduler_and_sampler(self): + # Get shift value - support both int and dict-based resolution lookup + # For scheduler initialization, use model's configured resolution + shift_config = self.config.rectified_flow_training_config.shift + if isinstance(shift_config, int): + shift = shift_config + else: + # shift set in RectifiedFlow is only used during inference. + # So, set it to the resolution of the model. + # This part gets executed only when we specify shift as a dict + # This is needed during multi-resolution training. + shift_dict = dict(shift_config) + resolution = self.config.resolution + if resolution not in shift_dict: + raise ValueError( + f"Resolution '{resolution}' not found in shift dict. Available resolutions: {list(shift_dict.keys())}" + ) + shift = shift_dict[resolution] + + # Rectified Flow timestep scheduler and sampler for training (separate for image and video) + if self.config.vision_gen: + self.rectified_flow_image = RectifiedFlow( + velocity_field=self.net, + train_time_distribution=self.config.rectified_flow_training_config.train_time_image_distribution, + use_dynamic_shift=self.config.rectified_flow_training_config.use_dynamic_shift, + shift=shift, + train_time_weight_method=self.config.rectified_flow_training_config.train_time_weight, + device=torch.device(DEVICE), + dtype=self.tensor_kwargs_fp32["dtype"], + ) + self.rectified_flow_video = RectifiedFlow( + velocity_field=self.net, + train_time_distribution=self.config.rectified_flow_training_config.train_time_video_distribution, + use_dynamic_shift=self.config.rectified_flow_training_config.use_dynamic_shift, + shift=shift, + train_time_weight_method=self.config.rectified_flow_training_config.train_time_weight, + device=torch.device(DEVICE), + dtype=self.tensor_kwargs_fp32["dtype"], + ) + if self.config.action_gen: + self.rectified_flow_action = RectifiedFlow( + velocity_field=self.net, + train_time_distribution=self.config.rectified_flow_training_config.train_time_action_distribution, + use_dynamic_shift=self.config.rectified_flow_training_config.use_dynamic_shift, + shift=shift, + train_time_weight_method=self.config.rectified_flow_training_config.train_time_weight, + device=torch.device(DEVICE), + dtype=self.tensor_kwargs_fp32["dtype"], + ) + if self.config.sound_gen: + self.rectified_flow_sound = RectifiedFlow( + velocity_field=self.net, + train_time_distribution=self.config.rectified_flow_training_config.train_time_sound_distribution, + use_dynamic_shift=self.config.rectified_flow_training_config.use_dynamic_shift, + shift=shift, + train_time_weight_method=self.config.rectified_flow_training_config.train_time_weight, + device=torch.device(DEVICE), + dtype=self.tensor_kwargs_fp32["dtype"], + ) + + # Denoising sampler (solver) for inference + assert self.config.rectified_flow_inference_config.scheduler_type in ["unipc", "edm"] + if self.config.rectified_flow_inference_config.scheduler_type == "unipc": + unipc_sampler_config = UniPCSamplerConfig( + num_train_timesteps=self.config.rectified_flow_inference_config.num_train_timesteps, + shift=self.config.rectified_flow_inference_config.shift, + use_dynamic_shifting=self.config.rectified_flow_inference_config.use_dynamic_shifting, + ) + self.sampler = UniPCSampler(cfg=unipc_sampler_config, tensor_kwargs=self.tensor_kwargs) + else: + self.sampler = EDMSampler() + + # Fixed-step sampler for distilled models (None for base models) + if self.config.fixed_step_sampler_config is not None: + cfg = self.config.fixed_step_sampler_config + self.fixed_step_sampler = FixedStepSampler( + t_list=list(cfg.t_list), + sample_type=cfg.sample_type, + num_train_timesteps=float(self.config.rectified_flow_inference_config.num_train_timesteps), + ) + else: + self.fixed_step_sampler = None + + def init_optimizer_scheduler( + self, optimizer_config: LazyDict, scheduler_config: LazyDict + ) -> tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LRScheduler]: + """Creates the optimizer and scheduler for the model. + + Args: + optimizer_config (LazyDict): The lazy config for the optimizer. + scheduler_config (LazyDict): The lazy config for the learning rate scheduler. + + Returns: + optimizer (torch.optim.Optimizer): The model optimizer. + scheduler (torch.optim.lr_scheduler.LRScheduler): The optimization scheduler. + """ + + optimizer = lazy_instantiate(optimizer_config, model=self) + scheduler = lazy_instantiate(scheduler_config, optimizer=optimizer) + return optimizer, scheduler + + def _derive_include_end_of_generation_token(self) -> bool: + impl = self.config.joint_attn_implementation + assert impl in ("two_way", "three_way"), ( + f"Invalid joint_attn_implementation: {impl}. Must be 'two_way' or 'three_way'." + ) + return False + + # ------------------------ training hooks ------------------------ + def on_before_optimizer_step( + self, optimizer: torch.optim.Optimizer, scheduler: torch.optim.lr_scheduler.LRScheduler, iteration: int + ) -> None: + """Run aux-loss-free load balancing + EMA router de-sink on the gen-tower MoE blocks.""" + del scheduler, optimizer + + dp_mesh = self.parallel_dims.dp_mesh if self.parallel_dims else None + + # Aux-loss-free load balancing (only when enabled). + if self._uses_aux_loss_free_load_balancing: + update_expert_biases( + net=self.net, + device_mesh=dp_mesh, + ) + # expert_bias is a buffer, but the DTensor EMA worker copies parameters + # only, so mirror it into net_ema manually (else the persisted net_ema.* + # keeps zero and drops the trained bias at checkpoint save). update_bias + # already cross-rank-reduced, so net.expert_bias matches on every rank. + if self.config.ema.enabled: + sync_expert_biases_to_ema(net=self.net, net_ema=self.net_ema) + + # EMA-tracked token-constant de-sink bias (a checkpointed buffer). Independent of + # expert-load bias correction; the update reduces the per-step token stats across the DP mesh so + # the buffer is identical on every rank. Like expert_bias it is a buffer, so it must + # be mirrored into net_ema (the model-EMA worker copies parameters only). + if self._uses_ema_router_bias: + update_router_biases(net=self.net, device_mesh=dp_mesh) + if self.config.ema.enabled: + sync_router_biases_to_ema(net=self.net, net_ema=self.net_ema) + + def on_before_zero_grad( + self, optimizer: torch.optim.Optimizer, scheduler: torch.optim.lr_scheduler.LRScheduler, iteration: int + ) -> None: + """ + update the net_ema + """ + del scheduler, optimizer + + if self.config.ema.enabled: + # calculate beta for EMA update + ema_beta = self.ema_beta(iteration) + self.net_ema_worker.update_average(self.net, self.net_ema, beta=ema_beta) + + # ------------------------ helpers ------------------------ + + def _pack_input_sequence( + self, + sequence_plans: list[SequencePlan], + input_text_indexes: list[list[int]], + gen_data_clean: GenerationDataClean, + input_timesteps: torch.Tensor, + include_end_of_generation_token: bool = False, + skip_text_tokens: bool = False, + initial_mrope_temporal_offset: int | float = 0, + ) -> PackedSequence: + """Wrap ``pack_input_sequence`` with all config-derived args pre-filled. + + Centralises the config-derived positional/embedding args so callers only + supply the four per-call arguments (sequence_plans, text tokens, data, timesteps) + plus three optional flags. + """ + assert self.tokenizer_vision_gen is not None + return pack_input_sequence( + sequence_plans=sequence_plans, + input_text_indexes=input_text_indexes, + gen_data_clean=gen_data_clean, + input_timesteps=input_timesteps, + special_tokens=self.llm_special_tokens, + latent_patch_size=self.config.diffusion_expert_config.patch_spatial, + skip_text_tokens=skip_text_tokens, + include_end_of_generation_token=include_end_of_generation_token, + unified_3d_mrope_reset_spatial_ids=self.config.diffusion_expert_config.unified_3d_mrope_reset_spatial_ids, + unified_3d_mrope_temporal_modality_margin=self.config.diffusion_expert_config.unified_3d_mrope_temporal_modality_margin, + enable_fps_modulation=self.config.diffusion_expert_config.enable_fps_modulation, + base_fps=float(self.config.diffusion_expert_config.base_fps), + sound_base_temporal_compression_factor=self.config.diffusion_expert_config.sound_base_temporal_compression_factor, + temporal_compression_factor=self.tokenizer_vision_gen.temporal_compression_factor, + vision_temporal_position_mode=self.config.diffusion_expert_config.vision_temporal_position_mode, + video_temporal_causal=self.config.video_temporal_causal, + action_dim=self.config.max_action_dim, + initial_mrope_temporal_offset=initial_mrope_temporal_offset, + num_behavior_prefix_tokens=( + self.config.behavior_stage2.global_prefix_tokens + if self.config.behavior_stage2.enabled + else 0 + ), + num_online_memory_prefix_tokens=( + self.config.behavior_stage2.online_prefix_tokens + if self.config.behavior_stage2.enabled and self.config.behavior_stage2.online_memory_enabled + else 0 + ), + num_proprio_prefix_tokens=( + self.config.proprio_condition.prefix_tokens + if self.config.proprio_condition.enabled + else 0 + ), + ) + + def _attach_proprio_condition( + self, + packed_sequence: PackedSequence, + gen_data_clean: GenerationDataClean, + ) -> None: + """Attach the dense per-action-sample robot state after packing.""" + cfg = self.config.proprio_condition + if not cfg.enabled: + return + values = gen_data_clean.proprio_condition + if values is None: + raise KeyError("proprio_condition.enabled requires dataset key 'proprio'") + tensors = [] + for value in values: + tensor = value + while tensor.ndim > 1 and tensor.shape[0] == 1: + tensor = tensor[0] + if tensor.ndim != 1 or tensor.shape[0] != cfg.input_dim: + raise ValueError(f"Expected proprio [{cfg.input_dim}], got {tuple(tensor.shape)}") + tensors.append(tensor) + packed_sequence.proprio_condition = torch.stack(tensors).to( + device=packed_sequence.text_ids.device, dtype=self.precision + ) + + def _attach_stage2_behavior( + self, + packed_sequence: PackedSequence, + data_batch: dict, + gen_data_clean: GenerationDataClean, + action_sample_indices: list[int], + ) -> None: + """Attach frozen CTE features and policy-injection targets after packing. + + The dataset emits one global memory value and one precomputed phase per + original sample. ``x0_tokens_action`` is dense over action-bearing + samples, hence the explicit reindexing by ``action_sample_indices``. + """ + cfg = self.config.behavior_stage2 + if not cfg.enabled: + return + required = ("behavior_global", "behavior_phase", "behavior_effect", "behavior_effect_valid") + if any(name not in data_batch for name in required): + raise KeyError("Stage-2 dataset must emit behavior_global, behavior_phase, behavior_effect and behavior_effect_valid") + + def as_batch(value: object, name: str) -> torch.Tensor: + if isinstance(value, torch.Tensor): + tensor = value + elif isinstance(value, (list, tuple)) and all(isinstance(item, torch.Tensor) for item in value): + tensor = torch.stack(list(value)) + else: + raise TypeError(f"Unsupported {name} batch type: {type(value)!r}") + # PackingDataLoader keeps a one-element inner list per sample for + # non-sequence auxiliary tensors, producing [B,1,D]. + if tensor.ndim == 3 and tensor.shape[1] == 1: + tensor = tensor[:, 0] + if tensor.ndim != 2: + raise ValueError(f"Expected {name} [B,D], got {tuple(tensor.shape)}") + return tensor + + global_features = as_batch(data_batch["behavior_global"], "behavior_global") + phase_features = as_batch(data_batch["behavior_phase"], "behavior_phase") + effect_features = data_batch["behavior_effect"] + effect_valid = data_batch["behavior_effect_valid"] + if isinstance(effect_features, (list, tuple)): + effect_features = torch.stack(list(effect_features)) + if isinstance(effect_valid, (list, tuple)): + effect_valid = torch.stack(list(effect_valid)) + if not isinstance(effect_features, torch.Tensor) or not isinstance(effect_valid, torch.Tensor): + raise TypeError("Stage-2 effect history must be tensor-valued") + # The packing loader adds a singleton list axis to auxiliary tensors. + if effect_features.ndim == 4 and effect_features.shape[1] == 1: + effect_features = effect_features[:, 0] + if effect_valid.ndim == 3 and effect_valid.shape[1] == 1: + effect_valid = effect_valid[:, 0] + if effect_features.ndim != 3 or effect_valid.shape != effect_features.shape[:2]: + raise ValueError("Expected behavior_effect [B,4,D] and behavior_effect_valid [B,4]") + global_indices = torch.tensor(action_sample_indices, dtype=torch.long, device=global_features.device) + phase_indices = global_indices.to(device=phase_features.device) + global_features = global_features.index_select(0, global_indices).to( + device=packed_sequence.text_ids.device, dtype=self.precision + ) + phase_features = phase_features.index_select(0, phase_indices).to( + device=packed_sequence.text_ids.device, dtype=self.precision + ) + effect_features = effect_features.index_select(0, global_indices.to(effect_features.device)).to( + device=packed_sequence.text_ids.device, dtype=self.precision + ) + effect_valid = effect_valid.index_select(0, global_indices.to(effect_valid.device)).to( + device=packed_sequence.text_ids.device, dtype=torch.bool + ) + x0_actions = gen_data_clean.x0_tokens_action or [] + if len(x0_actions) != len(action_sample_indices): + raise ValueError("Dense action payload does not match Stage-2 action sample indices") + targets = [] + for action in x0_actions: + start = int(cfg.leading_condition_steps) + target = action[start : start + cfg.horizon, : cfg.action_dim] + if target.shape != (cfg.horizon, cfg.action_dim): + raise ValueError(f"Expected policy action target [{cfg.horizon},{cfg.action_dim}], got {tuple(target.shape)}") + targets.append(target) + packed_sequence.behavior_global = global_features + packed_sequence.behavior_phase = phase_features + packed_sequence.behavior_effect = effect_features + packed_sequence.behavior_effect_valid = effect_valid + if cfg.pim_memory_enabled: + pim_names = ("behavior_pim_phase", "behavior_pim_effect", "behavior_pim_valid") + if any(name not in data_batch for name in pim_names): + raise KeyError("pim_memory_enabled requires persistent phase/effect/valid tensors") + + def pim_batch(name: str) -> torch.Tensor: + value = data_batch[name] + if isinstance(value, (list, tuple)): + value = torch.stack(list(value)) + if not isinstance(value, torch.Tensor): + raise TypeError(f"{name} must be tensor-valued") + # PackingDataLoader may retain a one-item auxiliary axis. + if value.ndim >= 3 and value.shape[1] == 1: + value = value[:, 0] + return value + + pim_phase = pim_batch("behavior_pim_phase") + pim_effect = pim_batch("behavior_pim_effect") + pim_valid = pim_batch("behavior_pim_valid") + pim_phase = pim_phase.index_select(0, global_indices.to(pim_phase.device)) + pim_effect = pim_effect.index_select(0, global_indices.to(pim_effect.device)) + pim_valid = pim_valid.index_select(0, global_indices.to(pim_valid.device)) + expected_phase = (global_features.shape[0], cfg.pim_persistent_length, cfg.phase_dim) + expected_effect = (global_features.shape[0], cfg.pim_persistent_length, cfg.effect_dim) + if tuple(pim_phase.shape) != expected_phase or tuple(pim_effect.shape) != expected_effect: + raise ValueError( + f"Expected PIM phase/effect {expected_phase}/{expected_effect}, got " + f"{tuple(pim_phase.shape)}/{tuple(pim_effect.shape)}" + ) + if tuple(pim_valid.shape) != expected_phase[:2]: + raise ValueError("behavior_pim_valid has an invalid shape") + packed_sequence.behavior_pim_phase = pim_phase.to( + device=packed_sequence.text_ids.device, dtype=self.precision + ) + packed_sequence.behavior_pim_effect = pim_effect.to( + device=packed_sequence.text_ids.device, dtype=self.precision + ) + packed_sequence.behavior_pim_valid = pim_valid.to( + device=packed_sequence.text_ids.device, dtype=torch.bool + ) + if cfg.online_memory_enabled: + if "behavior_online_context" not in data_batch: + raise KeyError("online_memory_enabled requires data_batch['behavior_online_context']") + online_context = as_batch(data_batch["behavior_online_context"], "behavior_online_context") + if online_context.shape[-1] != cfg.online_context_dim: + raise ValueError( + f"Expected behavior_online_context [...,{cfg.online_context_dim}], got {tuple(online_context.shape)}" + ) + packed_sequence.behavior_online_context = online_context.index_select( + 0, global_indices.to(online_context.device) + ).to(device=packed_sequence.text_ids.device, dtype=self.precision) + packed_sequence.behavior_prior_target = torch.stack(targets).to(device=packed_sequence.text_ids.device, dtype=self.precision) + + def _get_temporal_positions_vision( + self, + raw_state_vision: list[torch.Tensor], + x0_tokens_vision: list[torch.Tensor], + num_views_per_vision_item: list[int] | None = None, + frames_per_vision_item: list[int] | None = None, + ) -> list[torch.Tensor] | None: + """Return optional per-latent temporal coordinates for vision tokens. + + Multiview items are currently flattened camera-major. Compute UniAE + positions for one independently encoded camera clip, retain explicit + view/time axes, and flatten them in the same order as the latents. A + future timestamp-major layout only needs to transpose those two axes + before flattening. + """ + mode = self.config.diffusion_expert_config.vision_temporal_position_mode + if mode == "latent_index": + return None + if mode != "uniae_source_right_edge": + raise ValueError( + "Unsupported vision_temporal_position_mode: " + f"{mode}. Expected 'latent_index' or 'uniae_source_right_edge'." + ) + + assert self.tokenizer_vision_gen is not None + if (num_views_per_vision_item is None) != (frames_per_vision_item is None): + raise ValueError("num_views_per_vision_item and frames_per_vision_item must be provided together.") + if num_views_per_vision_item is None: + num_views_per_vision_item = [1] * len(raw_state_vision) + frames_per_vision_item_optional: list[int | None] = [None] * len(raw_state_vision) + else: + assert frames_per_vision_item is not None + if len(num_views_per_vision_item) != len(raw_state_vision) or len(frames_per_vision_item) != len( + raw_state_vision + ): + raise ValueError( + "Multiview temporal-position metadata must align with flattened vision items: " + f"got {len(num_views_per_vision_item)} view counts, {len(frames_per_vision_item)} frame " + f"counts, and {len(raw_state_vision)} vision items." + ) + frames_per_vision_item_optional = list(frames_per_vision_item) + + temporal_positions_vision: list[torch.Tensor] = [] + for raw_state_vision_i, x0_tokens_vision_i, num_views, frames_per_view in zip( + raw_state_vision, + x0_tokens_vision, + num_views_per_vision_item, + frames_per_vision_item_optional, + strict=True, + ): + if raw_state_vision_i.dim() == 5: + num_pixel_frames = int(raw_state_vision_i.shape[2]) + elif raw_state_vision_i.dim() == 4: + num_pixel_frames = int(raw_state_vision_i.shape[1]) + else: + raise ValueError( + "raw_state_vision items must have shape [B,C,T,H,W] or [C,T,H,W], " + f"got shape {tuple(raw_state_vision_i.shape)}." + ) + num_latent_frames = int(x0_tokens_vision_i.shape[2]) + frame_h = int(raw_state_vision_i.shape[-2]) + frame_w = int(raw_state_vision_i.shape[-1]) + resolution = get_vision_data_resolution((frame_h, frame_w)) + + if num_views > 1: + if frames_per_view is None: + raise ValueError("frames_per_view is required when num_views is greater than one.") + expected_pixel_frames = num_views * frames_per_view + if num_pixel_frames != expected_pixel_frames: + raise ValueError( + "Multiview vision length must equal num_views * frames_per_view when computing temporal " + f"positions: got T={num_pixel_frames}, num_views={num_views}, " + f"frames_per_view={frames_per_view}." + ) + if num_latent_frames % num_views != 0: + raise ValueError( + "Multiview latent length must be divisible by num_views when computing temporal positions: " + f"got T={num_latent_frames}, num_views={num_views}." + ) + latent_frames_per_view = num_latent_frames // num_views + temporal_positions_per_view = self.tokenizer_vision_gen.get_latent_temporal_positions( + num_pixel_frames=frames_per_view, + resolution=resolution, + num_latent_frames=latent_frames_per_view, + ) # [T_latent_view] + if temporal_positions_per_view is None: + raise ValueError( + f"{type(self.tokenizer_vision_gen).__name__} does not support " + f"vision_temporal_position_mode={mode}." + ) + if temporal_positions_per_view.shape[0] != latent_frames_per_view: + raise ValueError( + "Vision temporal position count must match latent frames per view: " + f"got {temporal_positions_per_view.shape[0]} positions for " + f"{latent_frames_per_view} latent frames." + ) + temporal_positions_by_view = temporal_positions_per_view.unsqueeze(0).expand( + num_views, -1 + ) # [V,T_latent_view] + temporal_positions = temporal_positions_by_view.reshape(-1) # [V*T_latent_view] + else: + temporal_positions = self.tokenizer_vision_gen.get_latent_temporal_positions( + num_pixel_frames=num_pixel_frames, + resolution=resolution, + num_latent_frames=num_latent_frames, + ) # [T_latent] + + if temporal_positions is None: + raise ValueError( + f"{type(self.tokenizer_vision_gen).__name__} does not support vision_temporal_position_mode={mode}." + ) + if temporal_positions.shape[0] != num_latent_frames: + raise ValueError( + "Vision temporal position count must match latent frames: " + f"got {temporal_positions.shape[0]} positions for {num_latent_frames} latent frames." + ) + temporal_positions = temporal_positions.to( + device=x0_tokens_vision_i.device, + dtype=torch.float32, + ) # [T_latent] + temporal_positions_vision.append(temporal_positions) + return temporal_positions_vision + + # ------------------------ training ------------------------ + + def memory_init_training( + self, + gen_data_clean: GenerationDataClean, + data_batch: dict[str, torch.Tensor], + input_text_indexes: list[list[int]], + ) -> tuple[GenerationDataClean, dict]: + """Prepare the memory for a single training step. + + Called at the start of ``training_step`` to give the causal subclass + an injection point for memory-based segment handling (frame trimming, + segment bookkeeping, cache resets, packing overrides). + + The base implementation returns *gen_data_clean* unmodified and a + default memory_info dict that does not support memory-backed training. + + The ``skip_text`` and ``initial_temporal`` offset fields are required, + and are used for both sequence packing and memory. + + Returns: + ``(gen_data_clean, memory_info)`` where *memory_info* is a dict with keys: + ``skip_text``, ``initial_temporal_offset`` + """ + return gen_data_clean, { + "skip_text": False, + "initial_temporal_offset": 0, + } + + def build_memory_state( + self, + packed_seq: PackedSequence, + memory_info: dict, + ) -> MemoryState | None: + """Construct a ``MemoryState`` from a packed sequence and context dict. + + Called after packing in ``training_step()``, and before ``denoise()`` + in AR inference. The base implementation returns ``None`` (no + persistent memory). ``OmniMoTCausalModel`` overrides this to build + the appropriate ``ARMemoryState`` or ``KVCacheTrainMemoryState``. + + Args: + packed_seq: The packed multi-modal sequence produced by + ``_pack_input_sequence``. + memory_info: Context dict returned by ``memory_init_training()`` + (for the training path) or constructed by the AR inference + caller. See ``memory_init_training()`` for the base keys. + """ + return None + + def pre_noise_memory_hook( + self, + packed_sequence: PackedSequence, + gen_data_clean: GenerationDataClean, + memory_info: dict, + ) -> dict: + """Hook called after sequence packing and before noising. Returns (possibly updated) memory_info. + + The packed sequence still contains clean tokens at this point. + Override in subclasses to run a clean forward pass (e.g. for teacher forcing). + """ + return memory_info + + def _prepare_training_data( + self, + data_batch: dict[str, torch.Tensor], + iteration: int, + ) -> tuple[ + list[list[int]], + list[SequencePlan], + GenerationDataClean, + dict, + list[str] | None, + list[tuple[int, int, int]], + ]: + """Run local tokenization and return the typed inputs needed by training.""" + input_text_indexes = self._load_and_tokenize_text_data(data_batch, iteration) + sequence_plans = build_sequence_plans_from_data_batch( + data_batch=data_batch, + input_video_key=self.input_video_key, + input_image_key=self.input_image_key, + ) + per_camera_vae_encoding = "enable_per_camera_vae_encoding" in data_batch + gen_data_clean = self.get_data_and_condition( + data_batch, + iteration=iteration, + retain_raw_state_vision=not per_camera_vae_encoding, + ) + gen_data_clean, memory_info = self.memory_init_training(gen_data_clean, data_batch, input_text_indexes) + + # image_size[i] may be (1, 4) from IterativeJointDataLoader or (4,) from custom_collate_fn. + if "image_size" in data_batch: + data_resolutions: list[str] | None = [] + for i in range(gen_data_clean.batch_size): + img_size = data_batch["image_size"][i] + if img_size.dim() == 2: + img_size = img_size[0] + target_h = int(img_size[0].item()) + target_w = int(img_size[1].item()) + data_resolutions.append(get_vision_data_resolution((target_h, target_w))) + else: + data_resolutions = None + + vae_pixel_shapes = self._get_vae_pixel_shapes(gen_data_clean.raw_state_vision) + if per_camera_vae_encoding: + # Training needs only the encoded latents after memory initialization. + gen_data_clean.raw_state_vision = None + return input_text_indexes, sequence_plans, gen_data_clean, memory_info, data_resolutions, vae_pixel_shapes + + @staticmethod + def _get_vae_pixel_shapes( + raw_state_vision: Sequence[torch.Tensor | None] | None, + ) -> list[tuple[int, int, int]]: + """Extract pixel-space ``(T,H,W)`` metadata used for VAE FLOPs estimation.""" + vae_pixel_shapes: list[tuple[int, int, int]] = [] + if raw_state_vision is None: + return vae_pixel_shapes + for vision_item in raw_state_vision: + if vision_item is None: + continue + if vision_item.dim() not in (4, 5): + raise ValueError( + f"VAE inputs must have shape [C,T,H,W] or [B,C,T,H,W], got {tuple(vision_item.shape)}." + ) + t_h_w = ( + (int(vision_item.shape[2]), int(vision_item.shape[3]), int(vision_item.shape[4])) + if vision_item.dim() == 5 + else (int(vision_item.shape[1]), int(vision_item.shape[2]), int(vision_item.shape[3])) + ) + vae_pixel_shapes.append(t_h_w) + return vae_pixel_shapes + + @staticmethod + def _pack_training_payload( + input_text_indexes: list[list[int]], + sequence_plans: list[SequencePlan], + gen_data_clean: GenerationDataClean, + memory_info: dict, + data_resolutions: list[str] | None, + vae_pixel_shapes: list[tuple[int, int, int]], + ) -> dict[str, Any]: + """Convert typed training inputs into a plain tree for CP broadcast.""" + # Keep shallow tensor references + gen_data_clean_payload = { + field.name: getattr(gen_data_clean, field.name) for field in dataclasses.fields(GenerationDataClean) + } + # Raw pixels/audio/action are unused after tokenization; omit them from the CP cache. + for key in ("raw_state_vision", "raw_state_sound", "raw_state_action"): + gen_data_clean_payload.pop(key) + return { + "input_text_indexes": input_text_indexes, + "sequence_plans": [dataclasses.asdict(plan) for plan in sequence_plans], + "gen_data_clean": gen_data_clean_payload, + "memory_info": memory_info, + "data_resolutions": data_resolutions, + "vae_pixel_shapes": vae_pixel_shapes, + } + + @staticmethod + def _unpack_training_payload( + payload: dict[str, Any], + ) -> tuple[ + list[list[int]], + list[SequencePlan], + GenerationDataClean, + dict, + list[str] | None, + list[tuple[int, int, int]], + ]: + expected = { + "input_text_indexes", + "sequence_plans", + "gen_data_clean", + "memory_info", + "data_resolutions", + "vae_pixel_shapes", + } + if set(payload) != expected: + raise ValueError(f"Unexpected CP payload keys: {set(payload) ^ expected}") + input_text_indexes = payload["input_text_indexes"] + sequence_plans = [SequencePlan(**plan) for plan in payload["sequence_plans"]] + gen_data_clean = GenerationDataClean(**payload["gen_data_clean"]) + memory_info = payload["memory_info"] + data_resolutions = payload["data_resolutions"] + vae_pixel_shapes = payload["vae_pixel_shapes"] + return input_text_indexes, sequence_plans, gen_data_clean, memory_info, data_resolutions, vae_pixel_shapes + + def _get_training_inputs( + self, data_batch: dict[str, torch.Tensor], iteration: int + ) -> tuple[ + list[list[int]], + list[SequencePlan], + GenerationDataClean, + dict, + list[str] | None, + list[tuple[int, int, int]], + ]: + """Prepare inputs using a context-parallel (CP) data-window rotation. + + A CP group of size ``C`` processes a window of ``C`` rank-local batches + over ``C`` consecutive training steps. Each position in that window is + a *slot*, and CP rank ``s`` owns slot ``s``. + + At slot 0, every rank independently tokenizes/encodes its own raw batch + once and stores the post-tokenizer payload in + ``self._cp_local_training_payload``. At slot ``s``, owner rank ``s`` + broadcasts its cached payload, and all CP ranks execute that training + step on the same owner batch (the packed sequence is sharded across + those ranks later). + + ``self._cp_window_slot`` advances modulo ``C`` after each step. After + slot ``C - 1``, the cache is cleared and the slot resets to 0, beginning + the next window. Thus each rank fetches and encodes one local batch per + window; later slots reuse the cache rather than encoding raw data again. + """ + cp_enabled = self.parallel_dims is not None and self.parallel_dims.cp_enabled + if not cp_enabled: + if self.parallel_dims is None or self.parallel_dims.cp_rank == 0: + self._update_train_stats(data_batch) + return self._prepare_training_data(data_batch, iteration) + + cp_size = self.parallel_dims.cp_mesh.size() + cp_window_slot = self._cp_window_slot + if not 0 <= cp_window_slot < cp_size: + raise ValueError(f"CP data window slot must be in [0, {cp_size}), got {cp_window_slot}.") + # Slot 0: every CP rank encodes its local batch once and caches the payload. + # Later slots broadcast the current owner's cache; raw data is ignored. + if cp_window_slot == 0: + local_training_data = self._prepare_training_data(data_batch, iteration) + self._cp_local_training_payload = self._pack_training_payload(*local_training_data) + if self._cp_local_training_payload is None: + raise RuntimeError("CP training payload cache is empty before its data window is complete.") + payload = broadcast_context_parallel_object( + self._cp_local_training_payload, + self.parallel_dims, + owner_rank=cp_window_slot, + ) + if not isinstance(payload, dict): + raise TypeError(f"Expected a dictionary CP training payload, got {type(payload).__name__}.") + input_text_indexes, sequence_plans, gen_data_clean, memory_info, data_resolutions, vae_pixel_shapes = ( + self._unpack_training_payload(payload) + ) + if cp_window_slot == cp_size - 1: + self._cp_local_training_payload = None + if self.parallel_dims.cp_rank == 0: + self._update_train_stats_from_processed_batch(gen_data_clean) + self._cp_window_slot = (cp_window_slot + 1) % cp_size + return input_text_indexes, sequence_plans, gen_data_clean, memory_info, data_resolutions, vae_pixel_shapes + + def training_step( + self, data_batch: dict[str, torch.Tensor], iteration: int + ) -> tuple[dict[str, torch.Tensor], torch.Tensor]: + """ + Performs a single training step for the rectified-flow (flow-matching) model. + + This method executes one iteration of the model's training. It involves: + 1. Tokenizing generation modalities (vision/action/sound) into latents (tokens). + 2. Sampling a training timestep (t) for each modality and constructing noised latents (xt) + per the rectified-flow formulation. + 3. Packing text + generation tokens into a single sequence and running the MoT network to predict + the flow field velocity at the given t. + 4. Computing flow-matching loss (plus optional auxiliary load-balancing losses). + + Args: + data_batch (dict): raw data batch draw from the training data loader. + iteration (int): Current iteration number. + + Returns: + tuple: A tuple containing two elements: + - dict: additional data that used to debug / logging / callbacks + - Tensor: The computed loss for the training step as a PyTorch Tensor. + + """ + input_text_indexes, sequence_plans, gen_data_clean, memory_info, data_resolutions, vae_pixel_shapes = ( + self._get_training_inputs(data_batch, iteration) + ) + + # Calculate number of tokens per sample (before 2x2 merge) for dynamic shift + # gen_data_clean.x0_tokens_vision: B, C, T, H, W + assert all(x.shape[0] == 1 for x in gen_data_clean.x0_tokens_vision), ( + "Batch size must be 1 for individual samples" + ) + num_tokens_per_sample = [x.shape[2] * x.shape[3] * x.shape[4] for x in gen_data_clean.x0_tokens_vision] + + # Sample a random noise level (sigma) and corresponding interpolation coefficient ("timesteps" in RF) + # Apply shift per sample based on each sample's resolution + num_vision_latent_frames = [x.shape[2] for x in gen_data_clean.x0_tokens_vision] + timesteps_vision, sigmas_vision = self._get_train_noise_level_vision( + batch_size=gen_data_clean.batch_size, + is_image_batch=gen_data_clean.is_image_batch, + resolutions=data_resolutions, + num_vision_latent_frames=num_vision_latent_frames, + num_tokens=num_tokens_per_sample, + iteration=iteration, + ) # [B, T_vis] each + + # Optional independent action schedule (sampled from rectified_flow_action with + # action-specific shift). Only active when the config opts in and the batch contains + # action data. + # + # Mixed-batch indexing: gen_data_clean.x0_tokens_action (and every packed_sequence.action.* + # field) is *dense* — one entry per sample with has_action=True, in the original batch order + # but skipping non-action samples. To feed each dense action entry its sample's sigma, we + # sample σ for the full batch and reindex with action_sample_indices (the batch positions + # of action-bearing samples). This avoids the mismatch that happens when, e.g., batch + # sample 1 has action but the dense entry 0 would otherwise read σ from batch position 0. + rf_cfg = self.config.rectified_flow_training_config + action_sample_indices = [i for i, plan in enumerate(sequence_plans) if plan.has_action] + teacher_anchor_weights: torch.Tensor | None = None + r3_action_sample_weights: torch.Tensor | None = None + if self.config.r3_event_weighted: + task_key = self.config.r3_task_weight_key + event_key = self.config.r3_event_weight_key + task_weights_full = data_batch.get(task_key) + if task_weights_full is None: + task_weights_full = torch.ones(len(sequence_plans), dtype=torch.float32) + task_weights_full = torch.as_tensor(task_weights_full, dtype=torch.float32).reshape(-1) + event_values = data_batch.get(event_key) + if event_values is None: + event_values = torch.zeros(len(sequence_plans), dtype=torch.float32) + event_values = torch.as_tensor(event_values, dtype=torch.float32).reshape(-1) + if task_weights_full.numel() != len(sequence_plans) or event_values.numel() != len(sequence_plans): + raise ValueError( + "R3 per-sample metadata must align with sequence plans: " + f"task={task_weights_full.numel()} event={event_values.numel()} plans={len(sequence_plans)}" + ) + event_scale = float(self.config.r3_event_weight) + if event_scale < 0: + raise ValueError(f"r3_event_weight must be non-negative, got {event_scale}") + r3_action_sample_weights = task_weights_full * ( + 1.0 + event_values.clamp(0.0, 1.0) * (event_scale - 1.0) + ) + r3_action_sample_weights = r3_action_sample_weights[action_sample_indices] + if self.config.lora_teacher_anchor_weight > 0: + anchor_key = self.config.lora_teacher_anchor_data_key + if anchor_key not in data_batch: + raise KeyError( + f"lora_teacher_anchor_weight is enabled but data batch has no {anchor_key!r}; " + "set an explicit per-sample weight on every training dataset" + ) + anchor_weights_full = torch.as_tensor(data_batch[anchor_key], dtype=torch.float32).reshape(-1) + if anchor_weights_full.numel() != len(sequence_plans): + raise ValueError( + f"Expected {len(sequence_plans)} teacher-anchor weights, got {anchor_weights_full.numel()}" + ) + teacher_anchor_weights = anchor_weights_full[action_sample_indices] + if rf_cfg.independent_action_schedule and action_sample_indices: + ts_full, sg_full = self._get_train_noise_level_action( + batch_size=gen_data_clean.batch_size, iteration=iteration + ) # [B, 1] each + idx = torch.tensor(action_sample_indices, dtype=torch.long) # [n_action] + timesteps_action = ts_full[idx] # [n_action, 1] + sigmas_action = sg_full[idx] # [n_action, 1] + else: + timesteps_action, sigmas_action = (None, None) + + # Optional independent sound schedule: sample a scalar sound sigma per batch + # slot, then reindex to the dense audio-bearing subset. + sound_sample_indices = [i for i, plan in enumerate(sequence_plans) if getattr(plan, "has_sound", False)] + if getattr(rf_cfg, "independent_sound_schedule", False) and sound_sample_indices: + ts_sound_full, sg_sound_full = self._get_train_noise_level_sound( + batch_size=gen_data_clean.batch_size + ) # [B,1] each + timesteps_sound, sigmas_sound = build_dense_sound_schedule( + sequence_plans, + gen_data_clean.x0_tokens_sound, + ts_sound_full, + sg_sound_full, + ) # [n_sound,1], [n_sound,1] + else: + timesteps_sound, sigmas_sound = (None, None) + + # Broadcast timesteps/sigmas across CP group to ensure consistency + if self.parallel_dims is not None and self.parallel_dims.cp_enabled: + src_rank = 0 # use cp rank 0 to broadcast timesteps/sigmas + cp_group = self.parallel_dims.cp_mesh.get_group() + global_src_rank = torch.distributed.get_global_rank(cp_group, src_rank) + timesteps_vision = timesteps_vision.contiguous() + sigmas_vision = sigmas_vision.contiguous() + torch.distributed.broadcast(timesteps_vision, src=global_src_rank, group=cp_group) + torch.distributed.broadcast(sigmas_vision, src=global_src_rank, group=cp_group) + if sigmas_action is not None: + timesteps_action = timesteps_action.contiguous() + sigmas_action = sigmas_action.contiguous() + torch.distributed.broadcast(timesteps_action, src=global_src_rank, group=cp_group) + torch.distributed.broadcast(sigmas_action, src=global_src_rank, group=cp_group) + if sigmas_sound is not None: + timesteps_sound = timesteps_sound.contiguous() # [n_sound,1] + sigmas_sound = sigmas_sound.contiguous() # [n_sound,1] + torch.distributed.broadcast(timesteps_sound, src=global_src_rank, group=cp_group) + torch.distributed.broadcast(sigmas_sound, src=global_src_rank, group=cp_group) + + if timesteps_sound is None: + # Sound tensors are dense over audio-bearing samples, while the vision timestep/sigma schedule + # is indexed by original batch position. Reindex here so mixed audio/no-audio batches use each + # sound sample's own schedule for noising and loss weighting. + timesteps_sound, sigmas_sound = build_dense_sound_schedule( + sequence_plans, + gen_data_clean.x0_tokens_sound, + timesteps_vision, + sigmas_vision, + ) # [n_sound,T_vis] or None, [n_sound,T_vis] or None + + packed_sequence = self._pack_input_sequence( + sequence_plans, + input_text_indexes, + gen_data_clean, + timesteps_vision.cpu(), + skip_text_tokens=memory_info["skip_text"], + initial_mrope_temporal_offset=memory_info["initial_temporal_offset"], + ) + + # Under independent_action_schedule, overwrite the vision-based action timestep the + # packer injected with the action timestep, so the denoiser's action timestep embedding + # matches the sigma used to noise action tokens. + if timesteps_action is not None and packed_sequence.action is not None: + action_has_noisy_tokens = any(nfi.numel() > 0 for nfi in packed_sequence.action.noisy_frame_indexes) + if action_has_noisy_tokens: + sample_ts = timesteps_action.squeeze(1).cpu() # [n_action] + packed_sequence.action.timesteps = torch.cat( + [ + sample_ts[i : i + 1].expand(nfi.numel()) + for i, nfi in enumerate(packed_sequence.action.noisy_frame_indexes) + ] + ).to(dtype=torch.float32) # [N_action_noisy] + else: + timesteps_action, sigmas_action = (None, None) + + # Under independent_sound_schedule, overwrite the vision-based sound timestep the packer + # injected with the sound timestep, so the denoiser's sound timestep embedding matches + # the sigma used to noise sound tokens. + if ( + getattr(rf_cfg, "independent_sound_schedule", False) + and timesteps_sound is not None + and packed_sequence.sound is not None + ): + sound_has_noisy_tokens = any(nfi.numel() > 0 for nfi in packed_sequence.sound.noisy_frame_indexes) + if sound_has_noisy_tokens: + sample_ts = timesteps_sound.squeeze(1).cpu() # [n_sound] + packed_sequence.sound.timesteps = torch.cat( + [ + sample_ts[i : i + 1].expand(nfi.numel()) + for i, nfi in enumerate(packed_sequence.sound.noisy_frame_indexes) + ] + ).to(dtype=torch.float32) # [N_sound_noisy] + else: + timesteps_sound, sigmas_sound = (None, None) + + # For image editing (multi-item vision), expand per-sample timesteps/sigmas to + # per-vision-item so downstream noise/loss indexing matches the flat x0_tokens_vision + # list. No-op when num_vision_items_per_sample is None (standard T2I/T2V/WAM cases). + # Conditioning items get sigma=0 via their condition_mask, so the actual timestep value + # for them does not matter. + timesteps_vision = _expand_per_sample_to_per_vision_item( + timesteps_vision, gen_data_clean.num_vision_items_per_sample + ) # [B_items, T_vis] + sigmas_vision = _expand_per_sample_to_per_vision_item( + sigmas_vision, gen_data_clean.num_vision_items_per_sample + ) # [B_items, T_vis] + + memory_info = self.pre_noise_memory_hook(packed_sequence, gen_data_clean, memory_info) + + # Flow matching/diffusion forward process: noise the input signal with the sampled noise level + gen_data_noised = self._add_noise_to_input( + gen_data_clean, + packed_sequence, + sigmas_vision, + sigmas_action=sigmas_action, + sigmas_sound=sigmas_sound, + iteration=iteration, + ) + self._replace_clean_with_noised(packed_sequence, gen_data_noised) + + # Move packed sequence to CUDA + packed_sequence.to_cuda() + self._attach_proprio_condition(packed_sequence, gen_data_clean) + self._attach_stage2_behavior(packed_sequence, data_batch, gen_data_clean, action_sample_indices) + + # Optional frozen base-policy teacher pass. Every FSDP rank executes + # this forward even when its local sample weights are all zero; keeping + # collective counts identical is required for rank-partitioned data. + teacher_preds_action: list[torch.Tensor] | None = None + if self.config.lora_teacher_anchor_weight > 0: + from cosmos_framework.utils.generator.lora import disable_lora_adapters + + teacher_memory = self.build_memory_state( + packed_sequence, memory_info + ) # pylint: disable=assignment-from-none + with torch.no_grad(), disable_lora_adapters(self.net): + teacher_out = self.denoise( + data_batch_packed=packed_sequence, + memory=teacher_memory, + ) + teacher_preds_action = [pred.detach() for pred in teacher_out["preds_action"]] + del teacher_out, teacher_memory + + # Student forward pass with adapters enabled. + memory = self.build_memory_state(packed_sequence, memory_info) # pylint: disable=assignment-from-none + out_net = self.denoise( + data_batch_packed=packed_sequence, + memory=memory, + ) + + loss, losses_dict = self._compute_losses( + out_net=out_net, + data_batch_packed=packed_sequence, + gen_data_noised=gen_data_noised, + timesteps=timesteps_vision, + is_image_batch=gen_data_clean.is_image_batch, + timesteps_action=timesteps_action, + timesteps_sound=timesteps_sound, + teacher_preds_action=teacher_preds_action, + teacher_anchor_weights=teacher_anchor_weights, + r3_action_sample_weights=r3_action_sample_weights, + ) + + if iteration <= 10 or iteration % 1000 == 0: + diagnostic_names = ( + "flow_matching_loss_vision", + "flow_matching_loss_action", + "teacher_anchor_loss_action", + "behavior_prior_nll", + ) + diagnostic_values = [] + for name in diagnostic_names: + if name in losses_dict: + value = losses_dict[name].detach().float().mean().item() + diagnostic_values.append(f"{name}={value:.8f}") + if diagnostic_values: + log.info( + "stage2_loss_components: " + ", ".join(diagnostic_values) + f" (iteration {iteration})", + rank0_only=True, + ) + + _vision_tokens = len(packed_sequence.vision.sequence_indexes) if packed_sequence.vision else 0 + _action_tokens = len(packed_sequence.action.sequence_indexes) if packed_sequence.action else 0 + _sound_tokens = len(packed_sequence.sound.sequence_indexes) if packed_sequence.sound else 0 + + output_batch = { + "x0": gen_data_clean.x0_tokens_vision, + "xt": gen_data_noised.xt_tokens_vision, + "sigma": sigmas_vision, # [B_items, T_vis] + "model_pred": out_net["preds_vision"], + "condition_mask_vision": packed_sequence.vision.condition_mask if packed_sequence.vision else None, + "condition_mask_action": packed_sequence.action.condition_mask if packed_sequence.action else None, + "und_token_length": packed_sequence.text_indexes.shape[0], + "gen_token_length": packed_sequence.sequence_length - packed_sequence.text_indexes.shape[0], + "vision_token_length": _vision_tokens, + "action_token_length": _action_tokens, + "sound_token_length": _sound_tokens, + "is_image_batch": gen_data_clean.is_image_batch, + "batch_size": gen_data_clean.batch_size, + "split_lens": packed_sequence.split_lens, + "attn_modes": packed_sequence.attn_modes, + "vae_pixel_shapes": vae_pixel_shapes, + **losses_dict, + } + if sigmas_action is not None: + output_batch["sigma_action"] = sigmas_action # [n_action, 1] — dense over action-bearing samples + if getattr(rf_cfg, "independent_sound_schedule", False) and sigmas_sound is not None: + output_batch["sigma_sound"] = sigmas_sound # [n_sound, 1] — dense over sound-bearing samples + + return output_batch, loss + + def _compute_flow_matching_loss( + self, + pred: list[torch.Tensor], + target: list[torch.Tensor], + condition_mask: list[torch.Tensor], + timesteps: torch.Tensor, + has_valid_tokens: bool, + rectified_flow: RectifiedFlow, + raw_action_dim: list[torch.Tensor] | None = None, + normalize_by_active: bool = False, + sample_weights: torch.Tensor | None = None, + ) -> torch.Tensor: + """Compute flow matching loss for a modality. + + Args: + pred: Predicted velocity field (list of tensors, one per sample). + target: Target velocity field (list of tensors, one per sample). + Under rectified flow the target is ``v = eps - x0``. + condition_mask: Mask where 1 = clean/conditioning, 0 = noisy/generation (list of tensors). + timesteps: Diffusion timesteps for time weighting. Shape [B,1] for + base/teacher_forcing (all frames share one timestep) or [B,T_max] + for diffusion_forcing (per-frame independent timesteps). Time weights + are applied per-frame before averaging, so non-uniform weight functions + are handled correctly. + has_valid_tokens: Whether this modality has valid noisy tokens. + rectified_flow: The rectified flow object for time weighting. + normalize_by_active: When True, normalize per-instance loss by the count of + active (noisy) elements rather than all elements. Preserves the + ``sum / active_count`` semantics needed for distillation critics where + conditioned frames contribute no signal and should not dilute the + denominator. + + Returns: + tuple: A tuple containing two elements: + - Flow matching loss (or dummy loss for gradient consistency). + - Per-instance loss (or dummy loss for gradient consistency). + """ + return compute_flow_matching_loss( + pred=pred, + target=target, + condition_mask=condition_mask, + timesteps=timesteps, + has_valid_tokens=has_valid_tokens, + rectified_flow=rectified_flow, + tensor_kwargs_fp32=self.tensor_kwargs_fp32, + raw_action_dim=raw_action_dim, + normalize_by_active=normalize_by_active, + sample_weights=sample_weights, + ) + + def _loss_averaging_group(self) -> tuple[torch.distributed.ProcessGroup | None, int]: + """Return the (process_group, size) over which gradients are averaged. + + This must match the group FSDP/DDP averages gradients over so that scaling the + per-rank loss by ``size`` exactly counteracts the framework's mean reduction. + FSDP shards/replicates over ``parallel_dims.dp_mesh``; plain DDP averages over + the whole world. Returns ``(None, 1)`` when running without distributed, in + which case no reduction (and no scaling) is needed. + + Note: ``ParallelDims.dp_mesh`` is always 2-D ``(dp_replicate, dp_shard)`` with + ``dp_replicate * dp_shard == world_size``, so FSDP/HSDP averages over the whole + world. ``DeviceMesh.get_group()`` requires ``mesh_dim`` when ``ndim > 1``; use + the default WORLD process group (``group=None``) instead of calling ``get_group()``. + """ + if self.parallel_dims is not None and self.parallel_dims.dp_enabled: + dp_mesh = self.parallel_dims.dp_mesh + # WORLD group: dp mesh spans all ranks (see docstring). Avoid get_group() on 2-D mesh. + return None, dp_mesh.size() + if torch.distributed.is_initialized(): + # No explicit dp mesh (e.g. bare DDP): gradients average over the whole world. + return None, torch.distributed.get_world_size() + return None, 1 + + def _sample_level_loss_scale( + self, + is_image_batch: bool, + num_samples: int, + device: torch.device, + ) -> torch.Tensor: + """Multiplier that converts rank-level to sample-level loss averaging. + + A packed batch is homogeneous — either all image or all video (video may carry + accompanying action/audio) — with ``num_samples`` samples on this rank. Each + iteration the per-modality sample counts are all-reduced over the data-parallel + group to get the global totals ``N_image`` / ``N_video``, and this rank's batch is + scaled by ``group_size * num_samples / N_modality``. + + Applied to the whole ``total_loss`` (video + action + audio for video batches), + this scales every term by the same factor, so the video/action/audio balance set + by ``loss_scale`` / ``action_loss_weight`` / ``sound_loss_scale`` is preserved, + while the effective objective becomes a per-sample mean. The base per-modality + weight already baked into ``total_loss`` (``loss_scale`` for video, ``image_loss_scale`` + for image) cancels out of this multiplier, so it does not appear here. The + ``group_size`` factor cancels the framework's ``1/group_size`` gradient averaging; + for balanced batches (``num_samples ≈ N/group_size``) the scale is ≈ 1, so logged + loss magnitudes stay comparable to rank-level averaging. + """ + dp_group, group_size = self._loss_averaging_group() + + # counts = [num_local_image_samples, num_local_video_samples]; exactly one is non-zero. + counts = torch.zeros(2, dtype=torch.float64, device=device) + counts[0 if is_image_batch else 1] = float(num_samples) + if group_size > 1: + torch.distributed.all_reduce(counts, op=torch.distributed.ReduceOp.SUM, group=dp_group) + + global_num_samples = (counts[0] if is_image_batch else counts[1]).clamp(min=1.0) + return (group_size * num_samples) / global_num_samples + + def _compute_losses( + self, + out_net: dict, + data_batch_packed: PackedSequence, + gen_data_noised: GenerationDataNoised, + timesteps: torch.Tensor, + is_image_batch: bool, + timesteps_action: torch.Tensor | None = None, + timesteps_sound: torch.Tensor | None = None, + teacher_preds_action: list[torch.Tensor] | None = None, + teacher_anchor_weights: torch.Tensor | None = None, + r3_action_sample_weights: torch.Tensor | None = None, + ) -> tuple[torch.Tensor, dict[str, torch.Tensor]]: + """Compute flow matching loss and auxiliary load balancing losses. + + ``timesteps_action`` is an optional ``[n_action, 1]`` override for the action loss + time-weighting — dense over action-bearing samples, matching ``data_batch_packed.action.*``. + When None, action reuses ``timesteps`` (vision timesteps, legacy behavior). Set by + ``training_step`` under ``independent_action_schedule=True``. + + ``timesteps_sound`` is an optional dense sound timestep tensor, matching + ``data_batch_packed.sound.*``. When None, sound reuses ``timesteps``. + """ + total_loss = 0.0 + losses_dict = {} + # ts_action shape: vision fallback [B_items, T_vis] (legacy) or [n_action, 1] (independent). + ts_action = timesteps if timesteps_action is None else timesteps_action # [B_items,T_vis] or [n_action,1] + # ts_sound shape: vision fallback [B_items,T_vis] or dense sound schedule [n_sound,...]. + ts_sound = timesteps if timesteps_sound is None else timesteps_sound # [B_items,T_vis] or [n_sound,...] + + rf_cfg = self.config.rectified_flow_training_config + normalize_by_active = rf_cfg.normalize_loss_by_active + if self.config.vision_gen: + assert data_batch_packed.vision is not None, "Vision packed data required when vision_gen is True" + assert isinstance(data_batch_packed.vision.condition_mask, list), ( + "Vision condition mask must be a list of tensors for loss computation" + ) + rectified_flow_vision = self.rectified_flow_image if is_image_batch else self.rectified_flow_video + + fm_loss_vision, fm_loss_vision_per_instance = self._compute_flow_matching_loss( + pred=out_net["preds_vision"], + target=gen_data_noised.vt_target_vision, + condition_mask=data_batch_packed.vision.condition_mask, + timesteps=timesteps, + has_valid_tokens=has_noisy_tokens(data_batch_packed.vision), + rectified_flow=rectified_flow_vision, + normalize_by_active=normalize_by_active, + ) + loss_scale = ( + rf_cfg.image_loss_scale if is_image_batch and rf_cfg.image_loss_scale is not None else rf_cfg.loss_scale + ) + total_loss += fm_loss_vision * loss_scale + losses_dict["flow_matching_loss_vision"] = fm_loss_vision + losses_dict["flow_matching_loss_vision_per_instance"] = fm_loss_vision_per_instance + else: + losses_dict["flow_matching_loss_vision"] = torch.tensor(0.0, **self.tensor_kwargs_fp32) + + if self.config.action_gen: + if data_batch_packed.action is not None: + assert isinstance(data_batch_packed.action.condition_mask, list), ( + "Action condition mask must be a list of tensors for loss computation" + ) + assert gen_data_noised.vt_target_action is not None, "Action targets required when action_gen is True" + fm_loss_action, _ = self._compute_flow_matching_loss( + pred=out_net["preds_action"], + target=gen_data_noised.vt_target_action, + condition_mask=data_batch_packed.action.condition_mask, + timesteps=ts_action, + has_valid_tokens=has_noisy_tokens(data_batch_packed.action), + rectified_flow=self.rectified_flow_action, + raw_action_dim=data_batch_packed.action.raw_action_dim, + normalize_by_active=normalize_by_active, + sample_weights=r3_action_sample_weights, + ) + + # Yihuai: In case the video loss is too large (1.5) and covers the action loss (0.05), we scale up the action loss to match the video loss to improve action precision. + total_loss += fm_loss_action * rf_cfg.action_loss_weight + losses_dict["flow_matching_loss_action"] = fm_loss_action + if teacher_preds_action is not None: + if teacher_anchor_weights is None: + raise ValueError("teacher_anchor_weights are required with teacher_preds_action") + teacher_anchor_loss = compute_teacher_anchor_loss( + pred=out_net["preds_action"], + teacher_pred=teacher_preds_action, + condition_mask=data_batch_packed.action.condition_mask, + sample_weights=teacher_anchor_weights, + has_valid_tokens=has_noisy_tokens(data_batch_packed.action), + raw_action_dim=data_batch_packed.action.raw_action_dim, + ) + total_loss += ( + teacher_anchor_loss + * self.config.lora_teacher_anchor_weight + * rf_cfg.action_loss_weight + ) + losses_dict["teacher_anchor_loss_action"] = teacher_anchor_loss + else: + # No action data in this batch. Connect the network's dummy preds_action + # to the loss so action-specific params + # (llm2action, action2llm, action_modality_embed) stay in the backward + # graph. Without this, FSDP reduce-scatter / DDP all-reduce will hang + # when other ranks do have action data. + dummy_loss = 0.0 * sum(p.sum() for p in out_net["preds_action"]) + total_loss += dummy_loss + losses_dict["flow_matching_loss_action"] = dummy_loss + else: + losses_dict["flow_matching_loss_action"] = torch.tensor(0.0, **self.tensor_kwargs_fp32) + + if "behavior_prior_mean" in out_net: + prior_loss = gaussian_prior_nll( + data_batch_packed.behavior_prior_target, + out_net["behavior_prior_mean"], + out_net["behavior_prior_std"], + ) + total_loss += prior_loss * self.config.behavior_stage2.prior_loss_weight + losses_dict["behavior_prior_nll"] = prior_loss + + if self.config.sound_gen: + if data_batch_packed.sound is not None: + assert isinstance(data_batch_packed.sound.condition_mask, list), ( + "Sound condition mask must be a list of tensors for loss computation" + ) + assert gen_data_noised.vt_target_sound is not None, "Sound targets required when sound_gen is True" + # Sound preds/targets are (C, T); condition_mask is (T, 1) — transpose to (1, T) for broadcasting + fm_loss_sound, _ = self._compute_flow_matching_loss( + pred=out_net["preds_sound"], + target=gen_data_noised.vt_target_sound, + condition_mask=[m.T for m in data_batch_packed.sound.condition_mask], + timesteps=ts_sound, + has_valid_tokens=has_noisy_tokens(data_batch_packed.sound), + rectified_flow=self.rectified_flow_sound, + normalize_by_active=normalize_by_active, + ) + loss_scale = rf_cfg.sound_loss_scale if rf_cfg.sound_loss_scale is not None else rf_cfg.loss_scale + total_loss += fm_loss_sound * loss_scale + losses_dict["flow_matching_loss_sound"] = fm_loss_sound + else: + # No sound data in this batch. Connect the network's dummy preds_sound + # to the loss so sound-specific params (sound2llm, llm2sound, + # sound_modality_embed) stay in the backward graph. Without this, + # FSDP gradient reduce hangs when other ranks do have sound data. + dummy_loss = 0.0 * sum(p.sum() for p in out_net["preds_sound"]) + total_loss += dummy_loss + losses_dict["flow_matching_loss_sound"] = dummy_loss + else: + losses_dict["flow_matching_loss_sound"] = torch.tensor(0.0, **self.tensor_kwargs_fp32) + + # Sample-level (vs rank-level) loss averaging. Scale the whole batch loss + # (vision + accompanying action/audio for video batches) by one factor so every + # image / video sample contributes equally across the data-parallel group. Applied + # here — after all flow-matching terms, before load balancing — so the video/action/ + # audio balance is preserved and the auxiliary load-balancing losses stay unscaled. + if rf_cfg.sample_level_loss_averaging and self.config.vision_gen: + num_samples = len(out_net["preds_vision"]) + sample_level_scale = self._sample_level_loss_scale( + is_image_batch=is_image_batch, + num_samples=num_samples, + device=self.tensor_kwargs_fp32["device"], + ) + total_loss = total_loss * sample_level_scale.to(dtype=total_loss.dtype) + + # 2. Load balancing auxiliary losses + for load_balancing_type in ["und", "gen"]: + lbl_metadata = out_net.get(f"lbl_metadata_{load_balancing_type}", None) + if lbl_metadata is None: + continue + load_balancing_loss = compute_load_balancing_loss( + lbl_metadata, + coeff=getattr(self.config.lbl, f"coeff_{load_balancing_type}"), + method=self.config.lbl.method, + device_mesh=self.parallel_dims.dp_mesh if self.parallel_dims else None, + ) + if load_balancing_loss is not None: + total_loss += load_balancing_loss + losses_dict[f"aux_loss_{load_balancing_type}"] = load_balancing_loss + + return total_loss, losses_dict + + def _update_train_stats(self, data_batch: dict[str, torch.Tensor]) -> None: + is_image = self.is_image_batch(data_batch) + input_key = self.input_image_key if is_image else self.input_video_key + if isinstance(self.net, WeightTrainingStat): + val = data_batch[input_key] + # For image editing data_batch[input_key] is a list-of-lists, not a tensor. + sample_count = len(val) if isinstance(val, list) else val.shape[0] + if is_image: + self.net.accum_image_sample_counter += sample_count + else: + self.net.accum_video_sample_counter += sample_count + + def _update_train_stats_from_processed_batch(self, gen_data_clean: GenerationDataClean) -> None: + """Update rank-zero sample counters from the CP-shared processed payload.""" + if not isinstance(self.net, WeightTrainingStat): + return + if gen_data_clean.is_image_batch: + self.net.accum_image_sample_counter += gen_data_clean.batch_size + else: + self.net.accum_video_sample_counter += gen_data_clean.batch_size + + def _load_and_tokenize_text_data( + self, + data_batch: dict[str, torch.Tensor], + iteration: int, + ) -> list[list[int]]: + """ + Load and tokenize the text data from the data batch. + + Args: + data_batch (dict[str, torch.Tensor]): The data batch. + iteration (int): The current iteration number. + + Returns: + list[torch.Tensor]: The input text tokens. + """ + input_text_tokens = data_batch["text_token_ids"] + if isinstance(input_text_tokens, list): + # Convert text tokens to list of lists of ints + input_text_tokens = [tokens.tolist() for x in input_text_tokens for tokens in x] + else: + input_text_tokens = [tokens.squeeze(0).tolist() for tokens in input_text_tokens] + + return input_text_tokens + + def _get_train_noise_level_vision( + self, + batch_size: int, + is_image_batch: bool, + num_vision_latent_frames: list[int], + resolutions: list[str] | str | None = None, + num_tokens: list[int] | None = None, + iteration: int | None = None, + ) -> tuple[torch.Tensor, torch.Tensor]: + """ + Sample the rectified flow interpolation coefficient (timesteps) and obtain the corresponding + normalized timestep. + + Args: + batch_size: Batch size for sampling timesteps. + is_image_batch: Whether this is an image batch (vs video). + num_vision_latent_frames: Per-sample vision latent frame counts [T_0, ..., T_{B-1}]. + For causal_training_strategy="diffusion_forcing", resamples B*T_max independent + times and returns tensors of shape [B,T_max]. For base/TF strategies, ignored — + returns shape [B,1] (all frames share the same sigma). + resolutions: Resolution string(s) (e.g., "256", "512") for dict-based shift lookup. + Can be a single string (applied to all samples) or a list of strings (one per sample). + If None, defaults to self.config.resolution (can be used for other modalities). + num_tokens: Number of tokens for each sample (before 2x2 merge). Needed for dynamic shift. + + Returns: + (timesteps, sigmas): Both [B,1] for TF/base, or [B,T_max] for diffusion_forcing. + """ + + rectified_flow = self.rectified_flow_image if is_image_batch else self.rectified_flow_video + + assert not self.config.rectified_flow_training_config.use_discrete_rf, ( + "Discrete RF is not supported for Cosmos3" + ) + # Continuous RF implementation + max_timestep = rectified_flow.noise_scheduler.config.num_train_timesteps + + # Get shift value(s) - support both int and dict-based resolution lookup + shift_config = self.config.rectified_flow_training_config.shift + if isinstance(shift_config, int): + # Int-based shift: use directly for all samples + shifts = torch.full((batch_size,), shift_config, dtype=torch.float32) + else: + # Convert to plain dict to avoid traceback-based memory leaks when GC is disabled + # (OmegaConf's `in` operator uses exception control flow internally). + shift_dict = dict(shift_config) + if not is_image_batch and "dynamic_shift_base_num_tokens_video" in shift_dict: + # Dynamic shift based on token count + assert num_tokens is not None and len(num_tokens) == batch_size + base_num_tokens = shift_dict["dynamic_shift_base_num_tokens_video"] + shifts = torch.sqrt(torch.tensor(num_tokens, dtype=torch.float32) / base_num_tokens) + elif is_image_batch and "dynamic_shift_base_num_tokens_image" in shift_dict: + assert num_tokens is not None and len(num_tokens) == batch_size + base_num_tokens = shift_dict["dynamic_shift_base_num_tokens_image"] + shifts = torch.sqrt(torch.tensor(num_tokens, dtype=torch.float32) / base_num_tokens) + else: + # Dict-based shift: lookup per sample + if resolutions is None: + raise ValueError("Resolutions must be provided when shift is a dict") + + # Normalize to list format + if isinstance(resolutions, str): + resolutions = [resolutions] * batch_size + + assert len(resolutions) == batch_size, ( + f"Number of resolutions ({len(resolutions)}) must match batch_size ({batch_size})" + ) + + # Lookup shift per sample + shifts_list = [] + for resolution in resolutions: + if resolution not in shift_dict: + raise ValueError( + f"Resolution '{resolution}' not found in shift dict. Available resolutions: {list(shift_dict.keys())}" + ) + shifts_list.append(shift_dict[resolution]) + shifts = torch.tensor(shifts_list, dtype=torch.float32) + + # Sample noise times: B×T_max for DF (one per video latent frame), B×1 for base/TF + if self.config.causal_training_strategy == "diffusion_forcing": + # T_max = max(num_vision_latent_frames) across the batch; trailing entries for shorter + # sequences are unused (sliced away in _add_noise_to_input). + T_max = max(num_vision_latent_frames) + sigmas = ( + rectified_flow.sample_train_time( + batch_size * T_max, iteration=iteration, shifts=shifts.repeat_interleave(T_max) + ) + .to(**self.tensor_kwargs_fp32) + .reshape(batch_size, T_max) + ) # [B,T_max] + else: + sigmas = ( + rectified_flow.sample_train_time(batch_size, iteration=iteration, shifts=shifts) + .to(**self.tensor_kwargs_fp32) + .unsqueeze(1) + ) # [B,1] + + timesteps = sigmas * max_timestep # [B,1] or [B,T_max] + return timesteps, sigmas + + def _get_train_noise_level_action( + self, batch_size: int, iteration: int | None = None + ) -> tuple[torch.Tensor, torch.Tensor]: + """Sample ``(timesteps, sigmas)`` of shape ``[batch_size, 1]`` from ``rectified_flow_action``. + + This helper is locally-scoped: it just draws ``batch_size`` independent σ values and + applies action-specific shift config. The caller decides what ``batch_size`` means + semantically — ``training_step`` passes the full batch size and then reindexes to + the dense action-bearing subset with ``action_sample_indices``. + + ``shift_action`` must be an int (or ``None`` to inherit ``shift``). Dict-keyed + per-resolution shifts are vision-only — multi-resolution action training would need + per-sample lookup, which this helper does not implement; if the global ``shift`` is a + dict and ``shift_action`` is None, this raises so the user sets shift_action explicitly. + σ is a shared scalar per input slot (no per-frame σ for action). + """ + rf_cfg = self.config.rectified_flow_training_config + rf = self.rectified_flow_action + max_timestep = rf.noise_scheduler.config.num_train_timesteps # int + + # Resolve shift. shift_action, when provided, must be an int. + if rf_cfg.shift_action is not None: + if not isinstance(rf_cfg.shift_action, int): + raise ValueError( + f"shift_action must be an int; got {type(rf_cfg.shift_action).__name__}. " + "Dict-keyed per-resolution shifts are vision-only." + ) + shift_val = rf_cfg.shift_action # int + elif isinstance(rf_cfg.shift, int): + shift_val = rf_cfg.shift # inherit the global int shift + else: + raise ValueError( + "shift_action=None requires the global `shift` to be an int. When `shift` is a " + f"dict (multi-resolution vision training), set shift_action explicitly as an int. " + f"Got shift={rf_cfg.shift!r}." + ) + + shifts = torch.full((batch_size,), shift_val, dtype=torch.float32) + sigmas = ( + rf.sample_train_time(batch_size, iteration=iteration, shifts=shifts) + .to(**self.tensor_kwargs_fp32) + .unsqueeze(1) + ) # [B,1] + timesteps = sigmas * max_timestep # [B,1] + return timesteps, sigmas + + def _get_train_noise_level_sound(self, batch_size: int) -> tuple[torch.Tensor, torch.Tensor]: + """Sample ``(timesteps, sigmas)`` of shape ``[batch_size, 1]`` from ``rectified_flow_sound``. + + Sound uses a shared scalar sigma per audio-bearing sample, then training_step + reindexes the full-batch samples to the dense sound tensor list. + """ + rf_cfg = self.config.rectified_flow_training_config + rf = self.rectified_flow_sound + max_timestep = rf.noise_scheduler.config.num_train_timesteps # int + + # Resolve shift. shift_sound, when provided, must be an int. + if rf_cfg.shift_sound is not None: + if not isinstance(rf_cfg.shift_sound, int): + raise ValueError( + f"shift_sound must be an int; got {type(rf_cfg.shift_sound).__name__}. " + "Dict-keyed per-resolution shifts are vision-only." + ) + shift_val = rf_cfg.shift_sound # int + elif isinstance(rf_cfg.shift, int): + shift_val = rf_cfg.shift # inherit the global int shift + else: + raise ValueError( + "shift_sound=None requires the global `shift` to be an int. When `shift` is a " + f"dict (multi-resolution vision training), set shift_sound explicitly as an int. " + f"Got shift={rf_cfg.shift!r}." + ) + + shifts = torch.full((batch_size,), shift_val, dtype=torch.float32) + sigmas = rf.sample_train_time(batch_size, shifts=shifts).to(**self.tensor_kwargs_fp32).unsqueeze(1) # [B,1] + timesteps = sigmas * max_timestep # [B,1] + return timesteps, sigmas + + def _add_noise_to_input( + self, + gen_data_clean: GenerationDataClean, + packed_sequence: PackedSequence, + sigmas: torch.Tensor, + sigmas_action: torch.Tensor | None = None, + sigmas_sound: torch.Tensor | None = None, + iteration: int | None = None, + ) -> GenerationDataNoised: + """ + Diffusion / Flow matching forward process: apply noise of given noise level (sigmas) to input data. + + Args: + gen_data_clean (GenerationDataClean): The input dataclass containing the clean data *latents* (tokens). + packed_sequence (PackedSequence): Packed sequence with condition masks attached to modalities. + sigmas (torch.Tensor): The noise levels. Shape [B,1] for base/teacher_forcing (all video + latent frames share the same sigma) or [B,T_max] for diffusion_forcing (per-latent-frame + independent sigma). T_max is the number of video latent frames (temporally compressed + tokens), not RGB frames. In all modes, sigmas are multiplied by (1 - condition_mask) + so conditioning latent frames get sigma_eff=0 and only non-conditioned frames contribute + to the loss. + sigmas_action: Optional ``[n_action, 1]`` override for action noising — dense over + action-bearing samples, matching ``packed_sequence.action.*``. When None, action + reuses ``sigmas`` (vision σ, legacy behavior). Set by ``training_step`` when + ``independent_action_schedule=True``. + sigmas_sound: Optional dense sound sigma tensor matching ``packed_sequence.sound.*``. + When None, sound reuses ``sigmas``. + + Returns: + GenerationDataNoised: A dataclass containing the noise, noisy data (xt), and velocity field (vt). + """ + # Action sigma defaults to the shared vision sigma (legacy behavior). + # Legacy (sigmas_action=None): vision σ of shape [B_items, T_vis]. + # Independent (sigmas_action provided): dense action σ of shape [n_action, 1]. + sigmas_for_action = sigmas if sigmas_action is None else sigmas_action # [B_items,T_vis] or [n_action,1] + # Sound uses a dense view of the per-sample vision schedule so mixed audio/no-audio + # batches do not index full-batch sigmas with dense sound positions. + sigmas_for_sound = sigmas if sigmas_sound is None else sigmas_sound # [B_items,T_vis] or [n_sound,...] + + # Seeded noise generator (deterministic mode only): keyed on (iteration, rank). + # Offset +32768 keeps this seed distinct from the sigma seed in sample_train_time. + noise_gen: torch.Generator | None = None + if iteration is not None and torch.are_deterministic_algorithms_enabled(): + rank = torch.distributed.get_rank() if torch.distributed.is_initialized() else 0 + noise_gen = torch.Generator(device=self.tensor_kwargs_fp32["device"]) + noise_gen.manual_seed(iteration * 65536 + rank + 32768) + + # Vision + x0_vision = gen_data_clean.x0_tokens_vision # list of [C,T,H,W] + assert x0_vision is not None, "Vision tokens are required for VFM noising." + epsilon_vision = [ + torch.randn(x0_vision_i.size(), generator=noise_gen, **self.tensor_kwargs_fp32) for x0_vision_i in x0_vision + ] # list of [C,T,H,W] + # Under CP, every rank holds the same x0 (the post-tokenizer payload is broadcast + # round-robin above) but each samples its own ε from a rank-divergent RNG. Broadcasting + # from CP rank 0 makes ε (and therefore xt) identical across the CP group so the + # seq-sharded packed sequence is consistent. No-op when CP is disabled. + context_parallel_broadcast_tensor_list(epsilon_vision, self.parallel_dims) + + # Derive noisy mask (1 for noised, 0 for clean) for sigmas computation + assert packed_sequence.vision is not None, "Packed vision data required for noise scheduling" + assert packed_sequence.vision.condition_mask is not None, "Vision condition mask required for noise scheduling" + assert isinstance(packed_sequence.vision.condition_mask, list), ( + "Vision condition mask must be a list of tensors for noise scheduling" + ) + + # Compute sigmas per vision item (supports variable shapes). + # For image editing, x0_tokens_vision is a flat list with multiple items per sample + # and sigmas has already been expanded to match (see _expand_per_sample_to_per_vision_item). + # Conditioning latent frames are zeroed via (1 - condition_mask) in all modes (base/TF/DF). + # view(-1,1,1)[:T_latent]: for base/TF sigmas[i] is (1,), view gives (1,1,1) and the slice is a no-op; + # for DF sigmas[i] is (T_max,) — one sigma per video latent frame — view gives (T_max,1,1) + # and [:T_latent] slices to (T_latent,1,1) matching the per-item latent frame count. + num_vision_items = len(packed_sequence.vision.condition_mask) + noisy_mask_vision = [1.0 - cond_mask for cond_mask in packed_sequence.vision.condition_mask] + sigmas_vision = [ + sigmas[i].view(-1, 1, 1)[: x0_vision[i].shape[2]] * noisy_mask_vision[i] for i in range(num_vision_items) + ] + rectified_flow_vision = ( + self.rectified_flow_image if gen_data_clean.is_image_batch else self.rectified_flow_video + ) + xt_vision, vt_vision = rectified_flow_vision.get_interpolation( + epsilon_vision, x0_vision, sigmas_vision + ) # list of [C,T,H,W], list of [C,T,H,W] + + xt_vision = [ + xt_vision_i.to(**self.tensor_kwargs) for xt_vision_i in xt_vision + ] # list of [C,T,H,W]; to make tensor compatible with the precision of the model + + # Action (x0_tokens_action is already a dense list with no None entries). + # Gate on action_gen: the dataset may emit action tensors for models that + # don't consume them (e.g. camera dataset on a vision-only config), in + # which case packed_sequence.action is None and we must skip this block. + x0_action = gen_data_clean.x0_tokens_action # list of [T,action_dim] + if self.config.action_gen and x0_action is not None and len(x0_action) > 0: + assert packed_sequence.action is not None, "Packed action data required when action tokens exist" + assert packed_sequence.action.condition_mask is not None, ( + "Action condition mask required when action tokens exist" + ) + action_batch_size = len(packed_sequence.action.condition_mask) + all_actions_are_conditioning = all( + torch.all(condition_mask == 1).item() for condition_mask in packed_sequence.action.condition_mask + ) + if all_actions_are_conditioning: + epsilon_action = [ + torch.zeros(x0_action_i.size(), **self.tensor_kwargs_fp32) for x0_action_i in x0_action + ] # list of [T,action_dim] + sigmas_action = [ + torch.zeros_like(condition_mask, dtype=torch.float32, device=condition_mask.device) + for condition_mask in packed_sequence.action.condition_mask + ] # list of [T,1] + xt_action = [ + x0_action_i.to(**self.tensor_kwargs) for x0_action_i in x0_action + ] # list of [T,action_dim] + vt_action = [ + torch.zeros(x0_action_i.size(), **self.tensor_kwargs_fp32) for x0_action_i in x0_action + ] # list of [T,action_dim] + else: + epsilon_action = [ + torch.randn(x0_action_i.size(), generator=noise_gen, **self.tensor_kwargs_fp32) + for x0_action_i in x0_action + ] # list of [T,action_dim] + context_parallel_broadcast_tensor_list(epsilon_action, self.parallel_dims) + # Conditioning action timesteps are zeroed via (1 - condition_mask) in all modes (base/TF/DF). + # Action timesteps are aligned 1-to-1 with video latent frames, not RGB frames. + # view(-1,1)[:T_i]: for base/TF sigmas[i] is (1,) → (1,1), slice is a no-op; + # for DF sigmas[i] is (T_max,) → (T_max,1) → (T_i,1) per-action-timestep sigmas. + # condition_mask[i] shape [T_i,1]; result broadcasts with x0 shape [T_i,C]. + sigmas_action = [ + sigmas_for_action[i].view(-1, 1)[: x0_action[i].shape[0]] + * (1.0 - packed_sequence.action.condition_mask[i]) + for i in range(action_batch_size) + ] # list of [T_i,1] + assert sigmas_action is not None + xt_action, vt_action = self.rectified_flow_action.get_interpolation( + epsilon_action, x0_action, sigmas_action + ) # list of [T,action_dim], list of [T,action_dim] + xt_action = [ + xt_action_i.to(**self.tensor_kwargs) for xt_action_i in xt_action + ] # list of [T,action_dim]; to make tensor compatible with the precision of the model + for i in range(len(xt_action)): + if gen_data_clean.raw_action_dim is not None and gen_data_clean.raw_action_dim[i] is not None: + xt_action[i][:, gen_data_clean.raw_action_dim[i] :] = 0 + + else: + epsilon_action = None + sigmas_action = None + xt_action = None + vt_action = None + + # Sound (x0_tokens_sound is a list of [C, T] tensors, or None) + x0_sound = gen_data_clean.x0_tokens_sound # list of [sound_channels,T_sound] + if x0_sound is not None and len(x0_sound) > 0: + assert packed_sequence.sound is not None, "Packed sound data required when sound tokens exist" + assert packed_sequence.sound.condition_mask is not None, ( + "Sound condition mask required when sound tokens exist" + ) + sound_batch_size = len(packed_sequence.sound.condition_mask) + epsilon_sound = [ + torch.randn(x0_i.size(), generator=noise_gen, **self.tensor_kwargs_fp32) for x0_i in x0_sound + ] # list of [C,T_sound] + context_parallel_broadcast_tensor_list(epsilon_sound, self.parallel_dims) + # Conditioning frames are zeroed via (1 - condition_mask) in all modes (base/TF/DF). + # view(-1,1)[:T_sound].T: for base/TF sigmas[i] is (1,) → (1,1) → no-op → (1,1); + # for DF sigmas[i] is (T_max,) → (T_max,1) → (T_sound,1) → (1,T_sound). + # condition_mask[i] shape [T_sound,1]; .T gives [1,T_sound]; result broadcasts with x0 [C,T_sound]. + sigmas_sound = [ + sigmas_for_sound[i].view(-1, 1)[: x0_sound[i].shape[1]].T + * (1.0 - packed_sequence.sound.condition_mask[i].T) + for i in range(sound_batch_size) + ] + assert sigmas_sound is not None + xt_sound, vt_sound = self.rectified_flow_sound.get_interpolation(epsilon_sound, x0_sound, sigmas_sound) + xt_sound = [xt_i.to(**self.tensor_kwargs) for xt_i in xt_sound] + else: + epsilon_sound = None + sigmas_sound = None + xt_sound = None + vt_sound = None + + # create the GenerationDataNoised object + gen_data_noised = GenerationDataNoised( + batch_size=gen_data_clean.batch_size, + # vision + epsilon_vision=epsilon_vision, + xt_tokens_vision=xt_vision, + vt_target_vision=vt_vision, + sigmas_vision=sigmas_vision, + # action + epsilon_action=epsilon_action, + xt_tokens_action=xt_action, + vt_target_action=vt_action, + sigmas_action=sigmas_action, + raw_action_dim=gen_data_clean.raw_action_dim, + # sound + epsilon_sound=epsilon_sound, + xt_tokens_sound=xt_sound, + vt_target_sound=vt_sound, + sigmas_sound=sigmas_sound, + ) + + return gen_data_noised + + def _replace_clean_with_noised( + self, + packed_sequence: PackedSequence, + gen_data_noised: GenerationDataNoised, + ) -> None: + """Replace packed clean tokens with noised tokens.""" + if packed_sequence.vision is not None: + packed_sequence.vision.tokens = gen_data_noised.xt_tokens_vision + if packed_sequence.action is not None and gen_data_noised.xt_tokens_action is not None: + action_all_conditioning = all( + torch.all(condition_mask == 1).item() for condition_mask in packed_sequence.action.condition_mask + ) + if not action_all_conditioning: + packed_sequence.action.tokens = gen_data_noised.xt_tokens_action + if packed_sequence.sound is not None and gen_data_noised.xt_tokens_sound is not None: + packed_sequence.sound.tokens = gen_data_noised.xt_tokens_sound + + # ------------------------ Inference Utils ------------------------ + def _get_inference_text_tokens( + self, data_batch: dict, has_negative_prompt: bool + ) -> tuple[list[list[int]], list[list[int]]]: + """Tokenize conditional and unconditional captions for inference. + + Delegates the per-caption chat-template tokenization to + :meth:`_tokenize_captions` (the same helper backing the public + :meth:`tokenize_text`) so there is a single source of truth for + how raw captions become token ids. + """ + use_system_prompt = self.vlm_config.use_system_prompt + system_prompt: str | None = data_batch.get("system_prompt") + + cond_tokens = self._tokenize_captions( + data_batch[self.input_caption_key], + use_system_prompt=use_system_prompt, + system_prompt=system_prompt, + is_video=False, + ) + + if has_negative_prompt: + neg_key = "neg_" + self.input_caption_key + if neg_key not in data_batch: + raise ValueError(f"Negative prompt ({neg_key}) not found") + uncond_captions = data_batch[neg_key] + else: + uncond_captions = [""] * len(cond_tokens) + + uncond_tokens = self._tokenize_captions( + uncond_captions, + use_system_prompt=use_system_prompt, + system_prompt=system_prompt, + is_video=False, + ) + return cond_tokens, uncond_tokens + + def _prepare_inference_data( + self, + data_batch: dict, + seed: list[int], + has_negative_prompt: bool = False, + ) -> tuple[ + list[SequencePlan], + GenerationDataClean, + list[list[int]], + list[list[int]], + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + bool, + ]: + """ + Prepare all data needed for inference sampling. + Mirrors training_step's data preparation flow. + + This method: + 1. Builds sequence plans (conditioning information) + 2. Gets data and condition (encodes vision) + 3. Tokenizes text (conditional and unconditional for CFG) + 4. Builds a packed sequence to fetch conditioning masks + 5. Initializes noise with conditioning applied (as lists for variable shapes) + 6. Concatenates action noise with vision noise when the plan has action targets + + Args: + data_batch: Raw data batch from dataloader. + seed: Random seed(s) for noise generation. + has_negative_prompt: If True, use negative prompt for unconditional branch. + + Returns: + Tuple of: + - sequence_plans: List of SequencePlan objects + - gen_data_clean: GenerationDataClean with encoded tokens + - cond_text_tokens: Conditional text tokens + - uncond_text_tokens: Unconditional text tokens (for CFG) + - initial_noise: List of noise tensors (one per sample), each containing + flattened vision (and optionally action) noise concatenated + - condition_reference: List of clean reference tensors flattened + in the same order as initial_noise + - condition_mask: List of masks flattened in the same order as + initial_noise, where 1 keeps condition_reference values fixed + - has_noisy_actions: True when the packed sequence marks action + tokens as denoising targets. Determines whether the flattened + noise layout is [vision | action | sound] or [vision | sound]; + callers must thread it to _get_velocity so both sides split the + flat state identically. + """ + # 1. Build sequence plans (same as training) + sequence_plans = build_sequence_plans_from_data_batch( + data_batch=data_batch, + input_video_key=self.input_video_key, + input_image_key=self.input_image_key, + ) + + # 2. Get data and condition (same as training) + # This encodes vision to x0_tokens. Pass each sample's vision conditioning + # frame indexes so a causal tokenizer can skip encoding pixel frames that only + # feed generated (non-conditioned) latent positions (e.g. WAM / + # forward-dynamics condition latent frame 0 only, so only the first pixel frame + # is encoded instead of the whole clip). + vision_condition_indexes = [plan.condition_frame_indexes_vision for plan in sequence_plans] + per_camera_vae_encoding = "enable_per_camera_vae_encoding" in data_batch + gen_data_clean = self.get_data_and_condition( + data_batch, + vision_condition_indexes=vision_condition_indexes, + retain_raw_state_vision=not per_camera_vae_encoding, + ) + + num_items_per_sample = gen_data_clean.num_vision_items_per_sample # None for standard T2I/T2V + + # 3. Tokenize text (similar to training's _load_and_tokenize_text_data) + cond_text_tokens, uncond_text_tokens = self._get_inference_text_tokens(data_batch, has_negative_prompt) + + # 4. Build packed sequence to fetch conditioning masks + mask_timesteps = torch.zeros((gen_data_clean.batch_size,), dtype=torch.float32) # [B] + packed_sequence = self._pack_input_sequence( + sequence_plans, + cond_text_tokens, + gen_data_clean, + mask_timesteps, + include_end_of_generation_token=self._derive_include_end_of_generation_token(), + ) + + # 5. Initialize vision noise with conditioning + assert packed_sequence.vision is not None, "Packed vision data required for inference noise" + assert packed_sequence.vision.condition_mask is not None, "Vision condition mask required for inference noise" + assert isinstance(packed_sequence.vision.condition_mask, list), ( + "Vision condition mask must be a list of tensors for inference noise" + ) + assert gen_data_clean.x0_tokens_vision is not None, "Vision data required for inference noise" + n_sample = ( + len(gen_data_clean.x0_tokens_vision) + if gen_data_clean.num_vision_items_per_sample is None + else len(gen_data_clean.num_vision_items_per_sample) + ) + + assert len(seed) == n_sample, ( + f"Seed list length {len(seed)} must have the same length as the number of samples {n_sample}" + ) + + # For image2image, num_items_per_sample could be > 1 (multi-vision), + # so we need to repeat the seed for each vision item. + seed_dict = {"vision": [], "action": [], "sound": []} + for sample_idx in range(n_sample): + num_vision_items = num_items_per_sample[sample_idx] if num_items_per_sample is not None else 1 + seed_dict["vision"].extend([seed[sample_idx]] * num_vision_items) + seed_dict["action"].append(seed[sample_idx]) + seed_dict["sound"].append(seed[sample_idx]) + + # Generate noise and apply conditioning per vision item (supports variable shapes). + # Noise and the conditioning blend are kept in fp32 so the sampler accumulates + # in full precision. x0_token is already fp32 (forced by .float() in + # get_data_and_condition). The cast to model dtype happens inside velocity_fn. + noise_vision_list: list[torch.Tensor] = [] + for i, (x0_token, cond_mask) in enumerate( + zip(gen_data_clean.x0_tokens_vision, packed_sequence.vision.condition_mask, strict=True) + ): + pure_noise_i = misc.arch_invariant_rand( + tuple(x0_token.shape), + self.tensor_kwargs_fp32["dtype"], + self.tensor_kwargs_fp32["device"], + seed_dict["vision"][i], # Different seed per sample for diversity + ) # [C,T,H,W] + noise_i = cond_mask * x0_token + (1.0 - cond_mask) * pure_noise_i # [C,T,H,W] + noise_vision_list.append(noise_i) + + # 6. Initialize action noise if action_gen is True + has_action = self.config.action_gen and any(plan.has_action for plan in sequence_plans) + # Actions are denoising targets only when the packer marked action tokens + # as noisy/supervised (WAM / inverse dynamics leave predicted steps + # un-conditioned). Forward-dynamics plans and the temporal-causal packer + # emit all-conditioning action tokens (actions are pure inputs), so there + # is nothing to denoise — the network's _decode_action returns dummy zero + # predictions in that case (same has_noisy_tokens predicate). + has_noisy_actions = has_action and has_noisy_tokens(packed_sequence.action) + noise_action_list: list[torch.Tensor] | None = None + + if has_noisy_actions: + assert gen_data_clean.x0_tokens_action is not None, "Action data required when sequence plan has action" + # Generate action noise per sample (x0_tokens_action is already dense, no None entries) + noise_action_list = [] + for i, (x0_action, cond_mask_action) in enumerate( + zip(gen_data_clean.x0_tokens_action, packed_sequence.action.condition_mask, strict=True) + ): + pure_noise_action_i = misc.arch_invariant_rand( + tuple(x0_action.shape), + self.tensor_kwargs["dtype"], + self.tensor_kwargs["device"], + seed_dict["action"][i], # Different seed per sample for diversity + ) # [T,action_dim] + noise_action_i = ( + cond_mask_action * x0_action.to(**self.tensor_kwargs) + + (1.0 - cond_mask_action) * pure_noise_action_i + ) + if gen_data_clean.raw_action_dim is not None and gen_data_clean.raw_action_dim[i] is not None: + noise_action_i[:, gen_data_clean.raw_action_dim[i] :] = 0 + noise_action_list.append(noise_action_i) + + # 7. Initialize sound noise if sound_gen is True + has_sound = self.config.sound_gen and any(plan.has_sound for plan in sequence_plans) + noise_sound_list: list[torch.Tensor] | None = None + + if has_sound: + assert gen_data_clean.x0_tokens_sound is not None, "Sound data required when sequence plan has sound" + assert packed_sequence.sound is not None, "Packed sound data required when sound_gen is True" + assert packed_sequence.sound.condition_mask is not None, "Sound condition mask required" + assert isinstance(packed_sequence.sound.condition_mask, list), ( + "Sound condition mask must be a list of tensors for inference noise" + ) + + noise_sound_list = [] + for i, (x0_sound, cond_mask_sound) in enumerate( + zip(gen_data_clean.x0_tokens_sound, packed_sequence.sound.condition_mask, strict=True) + ): + pure_noise_sound_i = misc.arch_invariant_rand( + tuple(x0_sound.shape), + self.tensor_kwargs["dtype"], + self.tensor_kwargs["device"], + seed_dict["sound"][i], # Different seed per sample for diversity + ) # [sound_channels,T_sound] + # cond_mask_sound is (T, 1), x0_sound is (C, T) — transpose mask for broadcasting + noise_sound_i = ( + cond_mask_sound.T * x0_sound.to(**self.tensor_kwargs) + + (1.0 - cond_mask_sound.T) * pure_noise_sound_i + ) # [sound_channels,T_sound] + noise_sound_list.append(noise_sound_i) + + # 8. Concatenate vision, action, and sound noise per sample (flattened) + # Order: [vision | action (if present) | sound (if present)] + # noise_action_list and noise_sound_list are dense (only modality-having samples), + # so we use separate indexes. + initial_noise: list[torch.Tensor] = [] + condition_reference: list[torch.Tensor] = [] + condition_mask: list[torch.Tensor] = [] + idx_vision = 0 + idx_action = 0 + idx_sound = 0 + + for i in range(n_sample): + parts = [] + condition_reference_parts = [] + condition_mask_parts = [] + + # Flatten and concatenate all vision items for this sample + num_vis = num_items_per_sample[i] if num_items_per_sample is not None else 1 + for _ in range(num_vis): + parts.append(noise_vision_list[idx_vision].reshape(-1)) + x0_vision = gen_data_clean.x0_tokens_vision[idx_vision] # [C,T,H,W] + mask_vision = packed_sequence.vision.condition_mask[idx_vision].to( # [T,1,1] + dtype=x0_vision.dtype, device=x0_vision.device + ) + condition_reference_parts.append(x0_vision.reshape(-1)) # [N_vision] + condition_mask_parts.append((mask_vision * torch.ones_like(x0_vision)).reshape(-1)) # [N_vision] + idx_vision += 1 + + if noise_action_list is not None and sequence_plans[i].has_action: + assert packed_sequence.action is not None + assert packed_sequence.action.condition_mask is not None + assert gen_data_clean.x0_tokens_action is not None + parts.append(noise_action_list[idx_action].reshape(-1)) + x0_action = gen_data_clean.x0_tokens_action[idx_action].to( # [T,D] + dtype=noise_action_list[idx_action].dtype, + device=noise_action_list[idx_action].device, + ) + if gen_data_clean.raw_action_dim is not None and gen_data_clean.raw_action_dim[idx_action] is not None: + x0_action = x0_action.clone() # [T,D] + x0_action[:, gen_data_clean.raw_action_dim[idx_action] :] = 0 # [T,D] + mask_action = packed_sequence.action.condition_mask[idx_action].to( # [T,1] + dtype=x0_action.dtype, device=x0_action.device + ) + condition_reference_parts.append(x0_action.reshape(-1)) # [N_action] + condition_mask_parts.append((mask_action * torch.ones_like(x0_action)).reshape(-1)) # [N_action] + idx_action += 1 + + if noise_sound_list is not None and sequence_plans[i].has_sound: + assert packed_sequence.sound is not None + assert packed_sequence.sound.condition_mask is not None + assert gen_data_clean.x0_tokens_sound is not None + parts.append(noise_sound_list[idx_sound].reshape(-1)) + x0_sound = gen_data_clean.x0_tokens_sound[idx_sound].to( # [C_sound,T_sound] + dtype=noise_sound_list[idx_sound].dtype, + device=noise_sound_list[idx_sound].device, + ) + mask_sound = packed_sequence.sound.condition_mask[idx_sound].T.to( # [1,T_sound] + dtype=x0_sound.dtype, device=x0_sound.device + ) + condition_reference_parts.append(x0_sound.reshape(-1)) # [N_sound] + condition_mask_parts.append((mask_sound * torch.ones_like(x0_sound)).reshape(-1)) # [N_sound] + idx_sound += 1 + + initial_noise.append(torch.cat(parts, dim=0)) # [N_tokens_flat] + condition_reference.append(torch.cat(condition_reference_parts, dim=0)) # [N_tokens_flat] + condition_mask.append(torch.cat(condition_mask_parts, dim=0)) # [N_tokens_flat] + + return ( + sequence_plans, + gen_data_clean, + cond_text_tokens, + uncond_text_tokens, + initial_noise, + condition_reference, + condition_mask, + has_noisy_actions, + ) + + def _can_reuse_inference_pack_templates( + self, + sequence_plans: list[SequencePlan], + gen_data_clean: GenerationDataClean, + ) -> bool: + """Return whether denoising can reuse request-local packed metadata templates.""" + if gen_data_clean.num_vision_items_per_sample is not None: + return False + if self.config.video_temporal_causal: + return False + if self.config.sound_gen and any(plan.has_sound for plan in sequence_plans): + return False + return True + + def _can_reuse_inference_text_kv( + self, + sequence_plans: list[SequencePlan], + gen_data_clean: GenerationDataClean, + *, + reuse_pack_templates: bool, + has_velocity_postprocess: bool, + ) -> bool: + """Return whether text K/V can be cached within a single diffusion request.""" + if has_velocity_postprocess or not reuse_pack_templates: + return False + if self.parallel_dims is not None and ( + self.parallel_dims.cp_enabled or self.parallel_dims.cfgp_enabled or self.parallel_dims.dp_shard_enabled + ): + return False + if self.config.joint_attn_implementation != "two_way": + return False + if self.config.video_temporal_causal: + return False + if self.config.sound_gen and any(plan.has_sound for plan in sequence_plans): + return False + if gen_data_clean.batch_size != 1 or len(sequence_plans) != 1: + return False + if gen_data_clean.num_vision_items_per_sample is not None: + return False + return True + + def _make_inference_text_kv_cache(self, net: torch.nn.Module | None = None) -> list[UndKVCache]: + """Create per-layer request-local text K/V caches for one CFG branch.""" + target_net = net or self.net + return make_inference_text_kv_cache(len(target_net.language_model.model.layers)) + + def _copy_timestep_to_template(self, timesteps: torch.Tensor | None, timestep: torch.Tensor) -> None: + """Copy the sampler timestep into a packed template without a device-to-host round trip.""" + if timesteps is None or timesteps.numel() == 0: + return + timestep_values = timestep.reshape(-1).to(device=timesteps.device, dtype=timesteps.dtype) # [B_or_1] + timestep_value = timestep_values[0] # [] + timesteps.copy_(timestep_value.expand_as(timesteps)) # [N_noisy_tokens] + + def _update_inference_pack_template( + self, + packed_sequence: PackedSequence, + noise_x_vision: list[torch.Tensor], + noise_x_action: list[torch.Tensor] | None, + noise_x_sound: list[torch.Tensor] | None, + timestep: torch.Tensor, + ) -> PackedSequence: + """Refresh noisy tokens and timesteps in a request-local packed sequence template.""" + if packed_sequence.vision is not None: + packed_sequence.vision.tokens = [x.to(**self.tensor_kwargs) for x in noise_x_vision] # list[[C,T,H,W]] + self._copy_timestep_to_template(packed_sequence.vision.timesteps, timestep) + + if noise_x_action is not None: + assert packed_sequence.action is not None, "packed_sequence.action must exist when action noise is present" + packed_sequence.action.tokens = [x.to(**self.tensor_kwargs) for x in noise_x_action] # list[[T,D]] + self._copy_timestep_to_template(packed_sequence.action.timesteps, timestep) + + if noise_x_sound is not None: + assert packed_sequence.sound is not None, "packed_sequence.sound must exist when sound noise is present" + packed_sequence.sound.tokens = [x.to(**self.tensor_kwargs) for x in noise_x_sound] # list[[C_sound,T]] + self._copy_timestep_to_template(packed_sequence.sound.timesteps, timestep) + + return packed_sequence + + def _get_velocity( + self, + *, + net: torch.nn.Module | None = None, + noise_x: list[torch.Tensor], + timestep: torch.Tensor, + text_tokens: list[list[int]], + sequence_plans: list[SequencePlan], + gen_data_clean: GenerationDataClean, + skip_text_tokens: bool = False, + packed_sequence_template: PackedSequence | None = None, + memory: MemoryState | None = None, + has_noisy_actions: bool, + stage2_data_batch: dict | None = None, + stage2_action_sample_indices: list[int] | None = None, + ) -> list[torch.Tensor]: + """ + Compute velocity prediction for a single sampling step. + + This method handles the full pipeline for one denoising step: + 1. Splits flattened noise_x into vision (and action) parts per sample + 2. Packs the input sequence with current noisy latents + 3. Runs the network via self.denoise() + 4. Applies velocity masks (zeroes out conditioned parts) + 5. Returns flattened velocities (concatenated vision + action per sample) + + Args: + noise_x: List of noisy latents, each containing concatenated + vision (and optionally action) noise. + len(noise_x) == B, noise_x[i] is shape (D) + timestep: Current timestep for each sample + text_tokens: Tokenized text for each sample + sequence_plans: Pre-computed sequence plans (from _prepare_inference_data) + gen_data_clean: Pre-computed clean data (from _prepare_inference_data) + skip_text_tokens: If True, skip text tokens (for CFG unconditional branch) + packed_sequence_template: Optional request-local packed metadata template. + memory: Optional request-local text K/V cache state for this CFG branch. + has_noisy_actions: Whether actions are denoising targets, i.e. whether + noise_x was laid out as [vision | action | sound]. Must be the + packer-derived value from _prepare_inference_data so both sides + split the flat state identically. + + Returns: + Stacked flattened velocity tensors (one per sample), each containing + concatenated vision (and optionally action) velocity + """ + n_samples = len(noise_x) + is_image_batch = gen_data_clean.is_image_batch + has_action = self.config.action_gen and any(plan.has_action for plan in sequence_plans) + if has_noisy_actions and not has_action: + raise ValueError("has_noisy_actions=True requires an action-bearing sequence") + num_items = gen_data_clean.num_vision_items_per_sample # None for standard T2I/T2V + has_sound = self.config.sound_gen and any(plan.has_sound for plan in sequence_plans) + + # Split flattened noise_x into vision, action, and sound parts per sample + # Order must match _prepare_inference_data: [vision | action (if present) | sound (if present)] + noise_x_vision: list[torch.Tensor] = [] + noise_x_action: list[torch.Tensor] | None = [] if has_noisy_actions else None + noise_x_sound: list[torch.Tensor] | None = [] if has_sound else None + + vision_offset = 0 # tracks position in the flat x0_tokens_vision list + idx_action = 0 + idx_sound = 0 + for i in range(n_samples): + n_vis = num_items[i] if num_items is not None else 1 + offset = 0 + for j in range(n_vis): + vision_shape = gen_data_clean.x0_tokens_vision[vision_offset + j].shape + vision_dim = int(torch.prod(torch.tensor(vision_shape))) + noise_vision_ij = noise_x[i][offset : offset + vision_dim].reshape(vision_shape) + noise_x_vision.append(noise_vision_ij) + offset += vision_dim + vision_offset += n_vis + + if has_noisy_actions and noise_x_action is not None: + assert gen_data_clean.x0_tokens_action is not None + action_shape = gen_data_clean.x0_tokens_action[idx_action].shape + action_dim = int(torch.prod(torch.tensor(action_shape))) + noise_x_action.append(noise_x[i][offset : offset + action_dim].reshape(action_shape)) # [T,action_dim] + offset += action_dim + idx_action += 1 + + # Extract sound if present for this sample + if has_sound and noise_x_sound is not None and sequence_plans[i].has_sound: + assert gen_data_clean.x0_tokens_sound is not None + sound_shape = gen_data_clean.x0_tokens_sound[idx_sound].shape + sound_dim = int(torch.prod(torch.tensor(sound_shape))) + noise_x_sound.append( + noise_x[i][offset : offset + sound_dim].reshape(sound_shape) + ) # [sound_channels,T_sound] + offset += sound_dim + idx_sound += 1 + + if has_action: + if has_noisy_actions: + x0_action_tokens = noise_x_action + else: + x0_action_tokens = gen_data_clean.x0_tokens_action + else: + x0_action_tokens = None + + gen_data_for_packing = GenerationDataClean( + batch_size=n_samples, + is_image_batch=is_image_batch, + raw_state_vision=gen_data_clean.raw_state_vision, + x0_tokens_vision=noise_x_vision, + fps_vision=gen_data_clean.fps_vision, + temporal_positions_vision=gen_data_clean.temporal_positions_vision, + # Action fields + raw_state_action=gen_data_clean.raw_state_action if has_action else None, + x0_tokens_action=x0_action_tokens, + action_domain_id=gen_data_clean.action_domain_id if has_action else None, + fps_action=gen_data_clean.fps_action if has_action else None, + raw_action_dim=gen_data_clean.raw_action_dim if has_action else None, + action_residual_gate=gen_data_clean.action_residual_gate if has_action else None, + proprio_condition=gen_data_clean.proprio_condition if has_action else None, + # Sound fields + raw_state_sound=gen_data_clean.raw_state_sound if has_sound else None, + x0_tokens_sound=noise_x_sound if has_sound else None, + fps_sound=gen_data_clean.fps_sound if has_sound else None, + num_vision_items_per_sample=num_items, + # Multi-control transfer: carry per-control weights so the packer can + # populate vision_item_split_lens / control_weights on the packed + # sequence. Without this, multi_control_two_way_attention never runs + # and all controls are blended equally (weights ignored). + control_weights=gen_data_clean.control_weights, + ) + + if packed_sequence_template is None: + packed_sequence = self._pack_input_sequence( + sequence_plans, + text_tokens, + gen_data_for_packing, + timestep.cpu(), + include_end_of_generation_token=self._derive_include_end_of_generation_token(), + skip_text_tokens=skip_text_tokens, + ) + + # Set the actual noisy latents (as lists) + if packed_sequence.vision is not None: + packed_sequence.vision.tokens = [x.to(**self.tensor_kwargs) for x in noise_x_vision] # list[[C,T,H,W]] + + if has_noisy_actions and noise_x_action is not None: + assert packed_sequence.action is not None, "packed_sequence.action must exist when has_action is True" + packed_sequence.action.tokens = [x.to(**self.tensor_kwargs) for x in noise_x_action] # list[[T,D]] + packed_sequence.action.domain_id = gen_data_clean.action_domain_id + + if has_sound and noise_x_sound is not None: + assert packed_sequence.sound is not None, "packed_sequence.sound must exist when has_sound is True" + packed_sequence.sound.tokens = [x.to(**self.tensor_kwargs) for x in noise_x_sound] # list[[C_sound,T]] + + packed_sequence.to_cuda() + self._attach_proprio_condition(packed_sequence, gen_data_for_packing) + else: + packed_sequence = self._update_inference_pack_template( + packed_sequence_template, + noise_x_vision, + noise_x_action, + noise_x_sound, + timestep, + ) + + # Training attaches the frozen CTE features after packing. Do + # exactly the same for every inference denoising step (including both + # CFG branches), otherwise an enabled Zeva policy prior sees no prefix. + if self.config.behavior_stage2.enabled: + if stage2_data_batch is None or stage2_action_sample_indices is None: + raise KeyError("Zeva inference requires CTE feature tensors") + self._attach_stage2_behavior( + packed_sequence, + stage2_data_batch, + gen_data_clean, + stage2_action_sample_indices, + ) + + # --- Network forward --- + out = self.denoise( + net=net, + data_batch_packed=packed_sequence, + memory=memory, + ) + + # --- Apply velocity masks --- + # Zero out velocity for conditioned parts (they don't change during sampling) + assert packed_sequence.vision is not None, "packed_sequence.vision must exist for velocity masking" + assert packed_sequence.vision.condition_mask is not None, "Vision condition mask required for masking" + assert isinstance(packed_sequence.vision.condition_mask, list), ( + "Vision condition mask must be a list of tensors for masking" + ) + # Compute noisy_mask per sample (supports variable shapes) + noisy_mask_vision = [1.0 - cond_mask for cond_mask in packed_sequence.vision.condition_mask] + + # Apply velocity mask per element - check if each sample has noisy tokens + velocity_vision: list[torch.Tensor] = [] + for i, (pred, noisy_mask) in enumerate(zip(out["preds_vision"], noisy_mask_vision)): + # pred: [C,T,H,W], noisy_mask: [T,1,1] + has_noisy_tokens_i = noisy_mask.sum() > 0 + if has_noisy_tokens_i: + # Apply mask to prediction + velocity_vision.append(pred * noisy_mask.to(dtype=pred.dtype, device=pred.device)) # [C,T,H,W] + else: + # All tokens are conditioned - velocity should be zero + velocity_vision.append(torch.zeros_like(pred)) # [C,T,H,W] + + # Handle action velocity + velocity_action: list[torch.Tensor] | None = None + if ( + has_noisy_actions + and packed_sequence.action is not None + and packed_sequence.action.condition_mask is not None + and isinstance(packed_sequence.action.condition_mask, list) + ): + noisy_mask_action = [1.0 - cond_mask for cond_mask in packed_sequence.action.condition_mask] + + velocity_action = [] + for i, (pred, noisy_mask) in enumerate(zip(out["preds_action"], noisy_mask_action)): + # pred: [T,action_dim], noisy_mask: [T,1] + has_noisy_tokens_i = noisy_mask.sum() > 0 + if has_noisy_tokens_i: + v = pred * noisy_mask.to(dtype=pred.dtype, device=pred.device) # [T,action_dim] + else: + v = torch.zeros_like(pred) # [T,action_dim] + if gen_data_clean.raw_action_dim is not None and gen_data_clean.raw_action_dim[i] is not None: + v[:, gen_data_clean.raw_action_dim[i] :] = 0 + velocity_action.append(v) + + # Handle sound velocity + velocity_sound: list[torch.Tensor] | None = None + if ( + has_sound + and packed_sequence.sound is not None + and packed_sequence.sound.condition_mask is not None + and isinstance(packed_sequence.sound.condition_mask, list) + ): + noisy_mask_sound = [1.0 - cond_mask for cond_mask in packed_sequence.sound.condition_mask] + + velocity_sound = [] + for i, (pred, noisy_mask) in enumerate(zip(out["preds_sound"], noisy_mask_sound)): + # pred: [sound_channels,T_sound], noisy_mask: [T_sound,1] + has_noisy_tokens_i = noisy_mask.sum() > 0 + if has_noisy_tokens_i: + # noisy_mask is (T, 1), pred is (C, T) — transpose mask for broadcasting + velocity_sound.append( + pred * noisy_mask.T.to(dtype=pred.dtype, device=pred.device) + ) # [sound_channels,T_sound] + else: + velocity_sound.append(torch.zeros_like(pred)) # [sound_channels,T_sound] + + # Concatenate vision, action, and sound velocities per sample (flattened) + # Order must match _prepare_inference_data: [vision | action | sound] + velocity_output: list[torch.Tensor] = [] + vis_offset = 0 + idx_action = 0 + idx_sound = 0 + for i in range(n_samples): + parts = [] + n_vis = num_items[i] if num_items is not None else 1 + + for _ in range(n_vis): + parts.append(velocity_vision[vis_offset].reshape(-1)) + vis_offset += 1 + + if velocity_action is not None and sequence_plans[i].has_action: + parts.append(velocity_action[idx_action].reshape(-1)) + idx_action += 1 + + if velocity_sound is not None and sequence_plans[i].has_sound: + parts.append(velocity_sound[idx_sound].reshape(-1)) + idx_sound += 1 + + velocity_output.append(torch.cat(parts, dim=0)) # [N_tokens_flat] + + return velocity_output + + def _remove_padding_from_latent( + self, x0_tokens_vision: list[torch.Tensor], frame_size: list[torch.Tensor] + ) -> list[torch.Tensor]: + """ + Remove reflection padding from encoded latent vision tokens. + + Each sample in the batch may have different original dimensions, so we process + each sample individually and return a list of latents with varying spatial sizes. + + The padding coordinates are scaled down by the spatial compression factor since + we're operating in latent space. + + Args: + x0_tokens_vision (list[torch.Tensor]): List of encoded latent tensors, + each of shape (1, C, T, H_latent, W_latent) + where H_latent, W_latent include scaled padding. + frame_size (list[torch.Tensor]): List of tensors, each of shape (1,4) or (4,) containing + [target_h, target_w, orig_h, orig_w] for each sample (in pixel space). + + Returns: + list[torch.Tensor]: List of cropped latent tokens, each of shape (1, C, T, H_latent_cropped, W_latent_cropped). + Each element may have different spatial sizes based on original image dimensions. + """ + batch_size = len(x0_tokens_vision) + spatial_factor = self.tokenizer_vision_gen.spatial_compression_factor + cropped_latents = [] + for i in range(batch_size): + # frame_size: [target_h, target_w, orig_h, orig_w] in pixel space + # Normalize: frame_size[i] may be (1, 4) from IterativeJointDataLoader + # or (4,) when loaded from safetensors in the eval/export path. + fs = frame_size[i] + if fs.dim() == 2: + fs = fs[0] + orig_h = int(fs[2].item()) + orig_w = int(fs[3].item()) + + # Scale to latent space + if orig_h // spatial_factor == 0 or orig_w // spatial_factor == 0: + log.warning( + f"Zero-sized latent found: orig_h: {orig_h}, orig_w: {orig_w}, spatial_factor: {spatial_factor}" + ) + + orig_h_latent = max(orig_h // spatial_factor, 1) + orig_w_latent = max(orig_w // spatial_factor, 1) + + # Crop to remove padding: x0_tokens_vision[i] shape is (1, C, T, H, W) + cropped_latent = x0_tokens_vision[i][:, :, :, :orig_h_latent, :orig_w_latent].contiguous() + cropped_latents.append(cropped_latent) + + return cropped_latents + + def _run_classifier_free_guidance( + self, + cond_tokens: list[list[int]], + uncond_tokens: list[list[int]], + skip_text_tokens_for_cfg: bool, + single_velocity_fn: Callable[[list[list[int]], bool], list[torch.Tensor]], + ) -> tuple[list[torch.Tensor], list[torch.Tensor]]: + """Run classifier-free guidance, optionally in parallel via CFG parallelism. + + Args: + cond_tokens: Tokenized text for the conditional branch. + uncond_tokens: Tokenized text for the unconditional branch. + skip_text_tokens_for_cfg: If True, skip text tokens in the + unconditional branch. + single_velocity_fn: Computes velocity for a given set of tokens. + Accepts ``(tokens, skip_text_tokens)`` and returns a list of + velocity tensors (one per sample). + + Returns: + A tuple ``(cond_v, uncond_v)`` where each element is a list of + velocity tensors (one per sample). + """ + if self.parallel_dims is None or not self.parallel_dims.cfgp_enabled: + return ( + single_velocity_fn(cond_tokens, False), + single_velocity_fn(uncond_tokens, skip_text_tokens_for_cfg), + ) + + cfgp_rank = self.parallel_dims.cfgp_rank + cfgp_size = self.parallel_dims.cfgp_size + cfgp_group = self.parallel_dims.cfgp_mesh.get_group() + cfgp_peer = (cfgp_rank + 1) % cfgp_size + + if cfgp_rank == 0: + v_list = single_velocity_fn(cond_tokens, False) + else: + v_list = single_velocity_fn(uncond_tokens, skip_text_tokens_for_cfg) + + other_v_list = [torch.empty_like(v_i) for v_i in v_list] + + ops: list[dist.P2POp] = [] + for v_i, other_v_i in zip(v_list, other_v_list): + ops.append(dist.P2POp(op=dist.isend, tensor=v_i, group_peer=cfgp_peer, group=cfgp_group)) + ops.append(dist.P2POp(op=dist.irecv, tensor=other_v_i, group_peer=cfgp_peer, group=cfgp_group)) + + reqs = dist.batch_isend_irecv(ops) + for req in reqs: + req.wait() + + if cfgp_rank == 0: + return v_list, other_v_list + else: + return other_v_list, v_list + + @torch.no_grad() + def generate_samples_from_batch( + self, + data_batch: Dict, + net: torch.nn.Module | None = None, + sampler: Any | None = None, + guidance: float = 1.5, + guidance_interval: Optional[list[float]] = None, + velocity_postprocess_builder: Optional[ + Callable[ + ..., Optional[Callable[[list[torch.Tensor], list[torch.Tensor], torch.Tensor], list[torch.Tensor]]] + ] + ] = None, + seed: list[int] | int = 1, + n_sample: int | None = None, + has_negative_prompt: bool = False, + num_steps: int = 35, + shift: float = 5.0, + sigma_max: float = 80.0, + skip_text_tokens_for_cfg: bool = False, + normalize_cfg: bool = False, + upsample_task: str | None = None, + upsample_max_new_tokens: int = 2048, + upsample_temperature: float | None = 0.7, + upsample_top_k: int | None = 20, + upsample_top_p: float | None = 0.8, + upsample_repetition_penalty: float = 1.0, + upsample_presence_penalty: float = 0.0, + upsample_seed: int | None = None, + **kwargs, + ) -> dict[str, list[torch.Tensor]]: + """ + Generate samples from the batch. Based on given batch, it will automatically + determine whether to generate image or video samples. + + This method follows the same structure as training_step: + 1. Build sequence plans + 2. Get data and condition (encode vision) + 3. Initialize noise with conditioning (as lists for variable shapes) + 4. Run sampling loop with velocity function + 5. Return latents as lists (supports variable shapes) + + If ``upsample_task`` is not ``None``, the conditional captions are + upsampled with the corresponding canonical task (``"t2i"``, ``"t2v"``, + or ``"i2v"``) before sample generation. + + Args: + data_batch (dict): Raw data batch from the dataloader. + guidance (float): Classifier-free guidance weight. + guidance_interval (list[float] | None): Optional timestep interval to apply guidance. + For the timesteps (ranging between 0-1000) that fall between the interval, we perform CFG, otherwise, we skip the unconditional generation. + seed (list[int] | int): Random seeds for noise generation. For all new use-cases, + we use a list of seeds, one for each sample. The length of the list must match + the number of samples. Legacy use-cases use a single integer seed which is + incremented by 1 for each sample. But this is not supported anymore, and will + raise an error if used. + n_sample (int | None): Number of samples to generate; defaults to batch size. + has_negative_prompt (bool): If True, use negative prompt for unconditional branch. + num_steps (int): Number of sampling steps for the diffusion process. + shift (float): Time shift parameter for the sampler. + sigma_max (float): Maximum sigma for the EDM sampler. + skip_text_tokens_for_cfg (bool): If True, skip text tokens in unconditional branch. + normalize_cfg (bool): If True, normalize the CFG output. + upsample_task (str | None): Canonical V4.2 task resolved by the + inference caller. ``None`` disables native prompt upsampling. + Otherwise, the conditional captions in + ``data_batch[self.input_caption_key]`` are expanded via + :meth:`upsample_captions` (which drives the reasoner tower's + autoregressive loop) BEFORE downstream tokenization, so all + subsequent code paths — cond/uncond build, sequence plans, + velocity_fn, CFG — operate on the upsampled prompts uniformly. + When ``upsample_task`` is ``"i2v"``, the + anchor (first) raw frame of each sample's video — extracted + from ``data_batch[self.input_video_key]`` via + :meth:`_extract_upsample_conditioning_images` — is also + forwarded to the upsampler's Qwen3-VL multimodal chat + template so the rewritten caption is grounded in the + actual conditioning frame, not just the original caption + text. The unconditional captions are NOT upsampled + (negative prompts and empty strings pass through as-is). + upsample_max_new_tokens (int): Maximum tokens generated per + caption during upsampling. Defaults to 2048. + upsample_temperature, upsample_top_k, upsample_top_p: Native + reasoner prompt upsampling sampling controls. + upsample_repetition_penalty (float): CTRL/HF-style + multiplicative logit penalty on tokens already seen + in each caption's history. ``>1.0`` discourages + verbatim repetition, ``<1.0`` encourages it, ``1.0`` + (default) is identity and adds zero overhead. + upsample_presence_penalty (float): OpenAI-style additive + logit penalty (binary presence, not frequency) on + tokens already seen. ``>0`` discourages reuse, + ``<0`` encourages it, ``0.0`` (default) is identity. + upsample_seed (int | None): Optional integer seed for the + native prompt upsampler's sampling RNG. Forwarded to + :meth:`upsample_captions` and through to + :func:`unified_mot._impl_generate_reasoner_text`, which + seeds a fresh device-local ``torch.Generator`` once and + threads it into every ``torch.multinomial`` draw. + ``None`` (default) uses the device's default RNG and is + bit-identical to the pre-seed behavior. Greedy + upsampling (``upsample_temperature`` 0) never reads the + generator, so the value has no effect in that case. + NOTE: distinct from the per-sample ``seed`` argument + above, which seeds the diffusion noise. + + Returns: + Dict with keys: + - "vision": List of vision latent tensors (one per sample, variable shapes) + - "action": List of external-space action tensors + (only present when the packed sequence marks action tokens as + denoising targets, i.e. WAM / inverse dynamics. Plans whose + actions are pure conditioning — forward dynamics, temporal-causal + action conditioning — generate no actions and return no key) + + Raises: + ValueError: If the number of samples does not match the number of noise tensors or seeds. + ValueError: If the seed is a single integer. This is not supported anymore: `seed` must be + a list of integers, one for each sample. + """ + if isinstance(seed, int): + raise ValueError( + "Single integer seed is not supported anymore: `seed` must be a list of integers, one for each sample." + ) + assert isinstance(seed, list) + + if self.parallel_dims is not None and self.parallel_dims.cp_enabled: + seed = _broadcast_seed(seed, self.parallel_dims.cp_mesh.get_group(), self.parallel_dims.cp_rank) + + if self.parallel_dims is not None and self.parallel_dims.cfgp_enabled: + seed = _broadcast_seed(seed, self.parallel_dims.cfgp_mesh.get_group(), self.parallel_dims.cfgp_rank) + + # Optional reasoner-tower prompt upsampling. See + # :meth:`_maybe_apply_prompt_upsampling` for the full per-task + # contract (task inference, image conditioning for i2v, V4.2 + # template specs, FSDP-safe caption broadcast). Returns a + # fresh ``data_batch`` (caller's dict is never mutated) with + # ``self.input_caption_key`` overwritten by the upsampled + # captions; returns the input unchanged when ``upsample_task=None``. + data_batch = self._maybe_apply_prompt_upsampling( + data_batch, + upsample_task=upsample_task, + upsample_max_new_tokens=upsample_max_new_tokens, + upsample_temperature=upsample_temperature, + upsample_top_k=upsample_top_k, + upsample_top_p=upsample_top_p, + upsample_repetition_penalty=upsample_repetition_penalty, + upsample_presence_penalty=upsample_presence_penalty, + upsample_seed=upsample_seed, + ) + + # Prepare all data (initial noise as list of flattened tensors per sample) + ( + sequence_plans, + gen_data_clean, + cond_tokens, + uncond_tokens, + initial_noise, + condition_reference, + condition_mask, + has_noisy_actions, + ) = self._prepare_inference_data(data_batch, seed, has_negative_prompt) + + if n_sample is not None: + assert n_sample == len(initial_noise), ( + f"Number of samples {n_sample} must match number of noise tensors {len(initial_noise)}" + ) + else: + n_sample = len(initial_noise) + + assert n_sample == len(seed), f"Number of samples {n_sample} must match number of seeds {len(seed)}" + + stage2_action_sample_indices: list[int] | None = None + if self.config.behavior_stage2.enabled: + stage2_action_sample_indices = [ + index for index, plan in enumerate(sequence_plans) if plan.has_action + ] + + reuse_pack_templates = self._can_reuse_inference_pack_templates(sequence_plans, gen_data_clean) + cond_packed_sequence_template: PackedSequence | None = None + uncond_packed_sequence_template: PackedSequence | None = None + if reuse_pack_templates: + include_end_of_generation_token = self._derive_include_end_of_generation_token() + zero_timesteps = torch.zeros((gen_data_clean.batch_size,), dtype=torch.float32) # [B] + cond_packed_sequence_template = self._pack_input_sequence( + sequence_plans, + cond_tokens, + gen_data_clean, + zero_timesteps, + include_end_of_generation_token=include_end_of_generation_token, + skip_text_tokens=False, + ) + cond_packed_sequence_template.to_cuda() + self._attach_proprio_condition(cond_packed_sequence_template, gen_data_clean) + if guidance != 1.0 or velocity_postprocess_builder is not None: + uncond_packed_sequence_template = self._pack_input_sequence( + sequence_plans, + uncond_tokens, + gen_data_clean, + zero_timesteps, + include_end_of_generation_token=include_end_of_generation_token, + skip_text_tokens=skip_text_tokens_for_cfg, + ) + uncond_packed_sequence_template.to_cuda() + self._attach_proprio_condition(uncond_packed_sequence_template, gen_data_clean) + + # Optional per-step velocity postprocess hook. Built once via a builder + # that receives the prepared inference state. The returned callable (if + # any) is invoked after the conditional forward on every step and can + # modify the conditional velocity (e.g. inject control-CFG, attention + # weighting, etc.). The model itself stays agnostic of what the hook + # does — all transfer/edit-specific logic lives in the caller. + velocity_postprocess: Optional[ + Callable[[list[torch.Tensor], list[torch.Tensor], torch.Tensor], list[torch.Tensor]] + ] = None + if velocity_postprocess_builder is not None: + velocity_postprocess = velocity_postprocess_builder( + model=self, + net=net, + cond_tokens=cond_tokens, + sequence_plans=sequence_plans, + gen_data_clean=gen_data_clean, + ) + + # Create a velocity function for a single sample (for use with self.sampler). + # FSDP collective-sequence alignment (throughput-preset inference). + # + # In throughput-preset inference each rank holds a different sample, + # and different samples can diverge on (a) the CFG decision per + # step — ``guidance != 1.0`` (and the optional ``guidance_interval`` + # gate) determines whether ``velocity_fn`` issues 1 or 2 model + # forwards — and (b) ``num_steps``. Either divergence makes the + # FSDP allgather sequence misalign across ranks, deadlocking NCCL + # at the 30-min watchdog timeout. + # + # We align in two places: + # 1. Inside velocity_fn (per call): all_reduce the local CFG + # decision; if ANY rank needs CFG, every rank does both + # forwards (cond + uncond). Ranks whose local decision was + # "no CFG" return ``cond_v`` directly — bit-identical to the + # original no-CFG path (no guidance blend, no normalize_cfg). + # 2. Around the sampler call: all_reduce the local num_steps; + # ranks with local < max issue a dummy sampler call with the + # remaining steps to pad the FSDP allgather stream. The + # dummy call's output is discarded; ``latents`` is never + # re-bound. + # + # Both collectives are scoped to the FSDP shard group (the only + # process group whose collective sequence is at risk), so they're + # safe under non-trivial parallel layouts. + if ( + self.parallel_dims is not None + and self.parallel_dims.dp_shard_mesh is not None + and torch.distributed.is_initialized() + and self.parallel_dims.dp_shard_mesh.size() > 1 + ): + _dp_shard_group = self.parallel_dims.dp_shard_mesh.get_group() + _align_device = self.tensor_kwargs["device"] + else: + _dp_shard_group = None + _align_device = None + + reuse_text_kv = self._can_reuse_inference_text_kv( + sequence_plans, + gen_data_clean, + reuse_pack_templates=reuse_pack_templates, + has_velocity_postprocess=velocity_postprocess is not None, + ) + cond_text_kv_cache: list[UndKVCache] | None = None + uncond_text_kv_cache: list[UndKVCache] | None = None + # Request-scoped: install only for this generate call and restore afterward so we + # never permanently shadow another dispatch_attention_fn on the model. + previous_attention_dispatch = None + try: + if reuse_text_kv: + target_net = net or self.net + if target_net is None: + raise RuntimeError( + "Cannot install memory-aware attention dispatch: net is None " + "(pass net= or ensure self.net is built)." + ) + previous_attention_dispatch = install_inference_memory_attention_dispatch(target_net) + cond_text_kv_cache = self._make_inference_text_kv_cache(target_net) + if guidance != 1.0 or velocity_postprocess_builder is not None: + uncond_text_kv_cache = self._make_inference_text_kv_cache(target_net) + + def velocity_fn(noise_x: list[torch.Tensor], timestep: torch.Tensor) -> list[torch.Tensor]: + # len(noise_x) == B, noise_x[i] is shape (D) + # timestep is shape (B, 1) + torch.compiler.cudagraph_mark_step_begin() + + assert timestep.ndim == 2, f"timestep must be 2D, got {timestep.shape}" + assert timestep.shape == (1, 1), f"timestep must be (1, 1), got {timestep.shape}" + + # Expand timestep to (B, 1) + timestep = timestep.repeat(len(noise_x), 1) # [B,1] + + def _single_velocity_fn(tokens: list[list[int]], skip_text_tokens: bool) -> list[torch.Tensor]: + nonlocal uncond_text_kv_cache + packed_sequence_template = None + text_kv_cache: list[UndKVCache] | None = None + if reuse_pack_templates: + if tokens is cond_tokens and not skip_text_tokens: + packed_sequence_template = cond_packed_sequence_template + text_kv_cache = cond_text_kv_cache + elif tokens is uncond_tokens and skip_text_tokens == skip_text_tokens_for_cfg: + packed_sequence_template = uncond_packed_sequence_template + if reuse_text_kv and uncond_text_kv_cache is None: + uncond_text_kv_cache = self._make_inference_text_kv_cache(net) + text_kv_cache = uncond_text_kv_cache + memory: MemoryState | None = ( + InferenceTextKVMemoryState(text_kv_cache) if text_kv_cache is not None else None + ) + return self._get_velocity( + net=net, + noise_x=noise_x, + timestep=timestep, + text_tokens=tokens, + sequence_plans=sequence_plans, + gen_data_clean=gen_data_clean, + skip_text_tokens=skip_text_tokens, + packed_sequence_template=packed_sequence_template, + memory=memory, + has_noisy_actions=has_noisy_actions, + stage2_data_batch=data_batch, + stage2_action_sample_indices=stage2_action_sample_indices, + ) + + needs_text_cfg = guidance != 1.0 + if needs_text_cfg and guidance_interval is not None: + assert len(guidance_interval) == 2, f"guidance_interval must be [lo, hi], got {guidance_interval}" + t_lo, t_hi = guidance_interval + needs_text_cfg = t_lo < timestep[0].item() < t_hi + + # FSDP alignment: if ANY rank in the shard group needs text-CFG + # this call, every rank must take the CFG path so the allgather + # sequence stays aligned across ranks. + if _dp_shard_group is not None: + _cfg_t = torch.tensor([1 if needs_text_cfg else 0], device=_align_device, dtype=torch.int32) + torch.distributed.all_reduce(_cfg_t, op=torch.distributed.ReduceOp.MAX, group=_dp_shard_group) + _any_needs_text_cfg = bool(_cfg_t.item()) + else: + _any_needs_text_cfg = needs_text_cfg + + # Fast path: no text-CFG anywhere and no postprocess hook — single forward. + if not _any_needs_text_cfg and velocity_postprocess is None: + return _single_velocity_fn(cond_tokens, skip_text_tokens=False) + + # Fast path: only text-CFG and no postprocess — preserve the + # cfgp-parallel branch so two-rank CFG parallelism stays available. + if velocity_postprocess is None: + cond_v, uncond_v = self._run_classifier_free_guidance( + cond_tokens=cond_tokens, + uncond_tokens=uncond_tokens, + skip_text_tokens_for_cfg=skip_text_tokens_for_cfg, + single_velocity_fn=_single_velocity_fn, + ) + if not needs_text_cfg: + # Peers needed CFG so we ran the uncond forward to keep + # FSDP allgather aligned; locally we still return cond. + return cond_v + v_pred = [u_i + guidance * (c_i - u_i) for c_i, u_i in zip(cond_v, uncond_v)] + if normalize_cfg: + v_pred = [ + v_i * (torch.norm(c_i) / (torch.norm(v_i) + 1e-8)).clamp(min=0.0, max=1.0) + for v_i, c_i in zip(v_pred, cond_v) + ] + return v_pred + + # Conditional forward, then per-step postprocess hook. Hook runs + # sequentially; cfgp parallelism not used on this path. + cond_v_full = _single_velocity_fn(cond_tokens, skip_text_tokens=False) + cond_v = velocity_postprocess(cond_v_full, noise_x, timestep) + + uncond_v = _single_velocity_fn(uncond_tokens, skip_text_tokens=skip_text_tokens_for_cfg) + if not needs_text_cfg: + # Same alignment story as above for the postprocess branch. + return cond_v + + v_pred = [u_i + guidance * (c_i - u_i) for c_i, u_i in zip(cond_v, uncond_v)] + + if normalize_cfg: + v_pred = [ + v_i * (torch.norm(c_i) / (torch.norm(v_i) + 1e-8)).clamp(min=0.0, max=1.0) + for v_i, c_i in zip(v_pred, cond_v) + ] + + return v_pred + + # Run sampler for all samples at once. + sampler = sampler or self.sampler + scheduler_type = self.config.rectified_flow_inference_config.scheduler_type + if isinstance(sampler, FixedStepSampler): + num_steps = len(sampler.t_list) - 1 + shift = 0.0 + + # FSDP collective-sequence alignment (sampler outer loop). See the + # large block above the velocity_fn definition for the full + # rationale. all_reduce on the local num_steps so every rank knows + # the max; below, ranks with local < max issue a dummy sampler call + # to pad their FSDP allgather sequence. + if _dp_shard_group is not None: + _local_steps_t = torch.tensor([num_steps], device=_align_device, dtype=torch.int32) + torch.distributed.all_reduce(_local_steps_t, op=torch.distributed.ReduceOp.MAX, group=_dp_shard_group) + _max_num_steps = int(_local_steps_t.item()) + else: + _max_num_steps = num_steps + _extra_num_steps = _max_num_steps - num_steps + + if isinstance(sampler, FixedStepSampler): + log.info(f"Using sampler: FixedStep (t_list={sampler.t_list}, sample_type={sampler.sample_type})") + elif scheduler_type == "unipc": + log.info(f"Using sampler: UniPC (shift={shift}, num_steps={num_steps})") + else: + log.info(f"Using sampler: EDM (sigma_max={sigma_max}, num_steps={num_steps})") + + fixed_step_sampler_kwargs = {} + if isinstance(sampler, FixedStepSampler): + fixed_step_sampler_kwargs = { + "condition_reference": condition_reference, + "condition_mask": condition_mask, + } + + if isinstance(sampler, FixedStepSampler) or scheduler_type == "unipc": + latents = sampler( + velocity_fn, + initial_noise, + num_steps=num_steps, + shift=shift, + seed=seed, + **fixed_step_sampler_kwargs, + ) + if _extra_num_steps > 0: + # Dummy sampler call to issue (_extra_num_steps × per-step) + # FSDP allgathers; output discarded so `latents` keeps the + # real result captured above. Slow ranks have _extra_num_steps==0 + # here, but they're issuing the SAME number of in-sampler + # collectives via their longer real call. + log.debug( + f"FSDP alignment: dummy sampler run with {_extra_num_steps} " + f"extra steps (local={num_steps}, max={_max_num_steps})" + ) + _ = sampler( + velocity_fn, + latents, + num_steps=_extra_num_steps, + shift=shift, + seed=seed, + **fixed_step_sampler_kwargs, + ) + else: + # EDM Sampler + chunk_sizes = [_x.shape[0] for _x in initial_noise] + initial_noise = torch.cat(initial_noise, dim=0) + + def x0_fn(noise_x: torch.Tensor, sigma: torch.Tensor) -> torch.Tensor: + assert sigma.ndim == 0, f"sigma must be 0D, got {sigma.shape}" + timestep_rf = sigma * float(self.config.rectified_flow_inference_config.num_train_timesteps) + + # Convert noise_x to list of tensors for velocity_fn, and then + # concatenate the results back into a single tensor. + _noise_x = list(torch.split(noise_x, chunk_sizes, dim=0)) + _velocity_pred = velocity_fn(_noise_x, timestep_rf.reshape(1, 1)) + velocity_pred = torch.cat(_velocity_pred, dim=0) + + x0_pred = noise_x - sigma * velocity_pred + return x0_pred + + latents = sampler( + x0_fn, + initial_noise, + num_steps=num_steps, + sigma_max=sigma_max, + sigma_min=0.002, + solver_option="2ab", + ) + if _extra_num_steps > 0: + # Pad the FSDP allgather sequence with ``_extra_num_steps`` + # direct ``x0_fn`` calls instead of a second EDM sampler + # run. Avoids two EDM-specific footguns: + # (1) ``EDMSampler._forward_impl`` always runs an extra + # ``sample_clean`` denoiser forward (see + # ``cosmos_framework/model/vfm/diffusion/samplers/edm.py``). + # A nested sampler call would add one too many + # forwards on fast ranks, since the slow rank's + # single call also pays the ``sample_clean`` cost. + # (2) ``get_rev_ts(..., num_steps=0)`` divides by zero, + # producing NaN sigmas. The fix's ``extra==1`` edge + # case would need num_steps=0 to balance the count. + # Direct ``x0_fn`` calls bypass both: each call routes + # through the same ``velocity_fn`` closure (so the + # per-call CFG all_reduce still aligns ranks), issues + # exactly one model forward, and discards its return. + # ``latents`` is the catted single tensor at this point; + # the dummy sigma value is irrelevant for collective + # alignment because the model's allgather sequence is + # determined by tensor shapes, not sigma. + log.debug( + f"FSDP alignment: padding {_extra_num_steps} dummy x0_fn calls " + f"(local={num_steps}, max={_max_num_steps})" + ) + # ``x0_fn`` expects a sigma in the RF domain (the real EDM + # loop converts raw sigmas via ``sigmas_L / (1 + sigmas_L)`` + # at edm.py:174, landing them in ``(0, 1)``). Mirror that + # transform here so the dummy call's timestep stays in the + # same numerical domain as a real sampler step. The exact + # value doesn't matter for collective alignment, only the + # domain. + _dummy_sigma = latents.new_tensor(sigma_max / (1.0 + sigma_max)) + for _ in range(_extra_num_steps): + _ = x0_fn(latents, _dummy_sigma) + latents = list(torch.split(latents, chunk_sizes, dim=0)) + + # Split flattened latents back into vision latents, external actions, and sound latents + # Mirror the per-sample logic from _prepare_inference_data: + # Order: [vision | action (if present) | sound (if present)] + # action/sound lists are dense (only modality-having samples), so use separate indexes. + result_vision: list[torch.Tensor] = [] + result_action: list[torch.Tensor] = [] + result_sound: list[torch.Tensor] = [] + action_processing_records = get_action_processing_records(data_batch) + idx_vision = 0 + idx_action = 0 + idx_sound = 0 + num_vision_items = gen_data_clean.num_vision_items_per_sample + + for i in range(n_sample): + offset = 0 + + # Extract vision + n_vis = num_vision_items[i] if num_vision_items is not None else 1 + for j in range(n_vis): + vision_shape = gen_data_clean.x0_tokens_vision[idx_vision + j].shape + vision_dim = int(torch.prod(torch.tensor(vision_shape))) + if j == n_vis - 1: # the last vision item is the only target for each sample. + result_vision.append(latents[i][offset : offset + vision_dim].reshape(vision_shape)) + else: # the other vision items are the condition inputs that we don't need to return + pass + offset += vision_dim + idx_vision += n_vis + + # Extract action if present + if has_noisy_actions and sequence_plans[i].has_action: + assert gen_data_clean.x0_tokens_action is not None + action_shape = gen_data_clean.x0_tokens_action[idx_action].shape + action_dim = int(torch.prod(torch.tensor(action_shape))) + action_model = latents[i][offset : offset + action_dim].reshape(action_shape) # [T,D_model] + action_record = action_processing_records[i] if i < len(action_processing_records) else None + if action_record is None: + raise ValueError( + f"Generated action output for sample {i} cannot be externalized without " + "action_processing_record" + ) + action_external = ActionProcessor.postprocess_action(action_model, action_record) # [T,D_raw] + result_action.append(action_external) + offset += action_dim + idx_action += 1 + + # Extract sound if present + if self.config.sound_gen and sequence_plans[i].has_sound: + assert gen_data_clean.x0_tokens_sound is not None + sound_shape = gen_data_clean.x0_tokens_sound[idx_sound].shape + sound_dim = int(torch.prod(torch.tensor(sound_shape))) + result_sound.append(latents[i][offset : offset + sound_dim].reshape(sound_shape)) + offset += sound_dim + idx_sound += 1 + + result: dict[str, list[torch.Tensor]] = {"vision": result_vision} + if has_noisy_actions and result_action: + result["action"] = result_action + if self.config.sound_gen and len(result_sound) > 0: + result["sound"] = result_sound + return result + finally: + if previous_attention_dispatch is not None: + restore_inference_attention_dispatch(previous_attention_dispatch) + + def _extract_condition_images_for_visualization( + self, + gen_data_clean: GenerationDataClean, + sequence_plans: list[SequencePlan], + n_samples: int, + ) -> list[torch.Tensor | None]: + """Extract condition images from gen_data_clean for visualization. + + For image editing, raw_state_vision is a flat list of individually-encoded + images (e.g. [src1, tgt1, src2, tgt2, ...]). The first vision item for + each sample is the condition (source) image. This method extracts it and + resizes to match the target for side-by-side display. + + Args: + gen_data_clean: Clean data containing raw vision states. + sequence_plans: Sequence plans for each sample. + n_samples: Number of samples to process. + + Returns: + List of condition image tensors (one per sample with condition frames). + """ + condition_images: list[torch.Tensor | None] = [] + + if gen_data_clean.num_vision_items_per_sample is not None: + # Multi-item (image editing): raw_state_vision is flat [src1, tgt1, src2, tgt2, ...] + vision_offset = 0 + for i in range(n_samples): + num_items = gen_data_clean.num_vision_items_per_sample[i] + if num_items >= 2: + cond_frame = gen_data_clean.raw_state_vision[vision_offset] # (1, C, 1, H_s, W_s) + target_frame = gen_data_clean.raw_state_vision[vision_offset + 1] # (1, C, 1, H_t, W_t) + # Resize condition frame to match target size for visualization + if cond_frame.shape[-2:] != target_frame.shape[-2:]: + cond_frame = torch.nn.functional.interpolate( + cond_frame.squeeze(2), # (1, C, H, W) + size=target_frame.shape[-2:], + mode="bilinear", + align_corners=False, + ).unsqueeze(2) # (1, C, 1, H, W) + condition_images.append(cond_frame) + else: + condition_images.append(None) + vision_offset += num_items + else: + # Standard single-item mode: check condition_frame_indexes_vision + for i in range(n_samples): + plan = sequence_plans[i] + if len(plan.condition_frame_indexes_vision) > 0 and gen_data_clean.raw_state_vision is not None: + raw_vision = gen_data_clean.raw_state_vision[i] # (1, C, T, H, W) + condition_images.append(raw_vision[:, :, 0:1, :, :]) + else: + condition_images.append(None) + + return condition_images + + def _slice_gen_data_clean(self, gen_data_clean: GenerationDataClean, start: int, limit: int) -> GenerationDataClean: + """Extract a subset of GenerationDataClean for inference. + + The samples in [start:limit] are extracted from the original GenerationDataClean. + + For image editing (``num_vision_items_per_sample`` is set), the sample index refers to + the *real sample* index. The method computes the correct slice of the flat + ``x0_tokens_vision`` / ``raw_state_vision`` lists using the item counts and + preserves ``num_vision_items_per_sample`` on the returned subset so that + downstream packing works correctly. + + Args: + gen_data_clean: GenerationDataClean to slice. + start: Start index of the slice. + limit: Limit index of the slice. + + Returns: + Sliced GenerationDataClean. + """ + # x0_tokens_action can be an empty list for general-video samples, not just None. + has_action = bool(gen_data_clean.x0_tokens_action) + has_sound = bool(gen_data_clean.x0_tokens_sound) + + # Determine vision slice for this sample + num_items = gen_data_clean.num_vision_items_per_sample + if num_items is not None: + # Multi-item mode: compute flat-list offset + vis_start = sum(num_items[:start]) # number of all the vision tokens before the start + vis_end = sum(num_items[:limit]) + subset_x0_vision = gen_data_clean.x0_tokens_vision[vis_start:vis_end] + subset_raw_vision = ( + gen_data_clean.raw_state_vision[vis_start:vis_end] if gen_data_clean.raw_state_vision else None + ) + subset_temporal_positions_vision = ( + gen_data_clean.temporal_positions_vision[vis_start:vis_end] + if gen_data_clean.temporal_positions_vision + else None + ) + subset_num_items = num_items[start:limit] + else: + # Standard single-item mode + subset_x0_vision = gen_data_clean.x0_tokens_vision[start:limit] + subset_raw_vision = ( + gen_data_clean.raw_state_vision[start:limit] if gen_data_clean.raw_state_vision else None + ) + subset_temporal_positions_vision = ( + gen_data_clean.temporal_positions_vision[start:limit] + if gen_data_clean.temporal_positions_vision + else None + ) + subset_num_items = None + fps_vision = gen_data_clean.fps_vision[start:limit] if gen_data_clean.fps_vision is not None else None + + if has_action: + subset_raw_action = ( + gen_data_clean.raw_state_action[start:limit] if gen_data_clean.raw_state_action else None + ) + x0_tokens_action = gen_data_clean.x0_tokens_action[start:limit] + fps_action = gen_data_clean.fps_action[start:limit] if gen_data_clean.fps_action is not None else None + action_domain_id = gen_data_clean.action_domain_id[start:limit] if gen_data_clean.action_domain_id else None + raw_action_dim = gen_data_clean.raw_action_dim[start:limit] if gen_data_clean.raw_action_dim else None + action_residual_gate = ( + gen_data_clean.action_residual_gate[start:limit] + if gen_data_clean.action_residual_gate is not None + else None + ) + else: + subset_raw_action = None + x0_tokens_action = None + fps_action = None + action_domain_id = None + raw_action_dim = None + action_residual_gate = None + + if has_sound: + subset_raw_sound = gen_data_clean.raw_state_sound[start:limit] if gen_data_clean.raw_state_sound else None + x0_tokens_sound = gen_data_clean.x0_tokens_sound[start:limit] + fps_sound = gen_data_clean.fps_sound[start:limit] if gen_data_clean.fps_sound is not None else None + else: + subset_raw_sound = None + x0_tokens_sound = None + fps_sound = None + + return GenerationDataClean( + batch_size=limit - start, + is_image_batch=gen_data_clean.is_image_batch, + raw_state_vision=subset_raw_vision, + raw_state_action=subset_raw_action, + raw_state_sound=subset_raw_sound, + x0_tokens_vision=subset_x0_vision, + x0_tokens_action=x0_tokens_action, + x0_tokens_sound=x0_tokens_sound, + fps_vision=fps_vision, + temporal_positions_vision=subset_temporal_positions_vision, + fps_action=fps_action, + fps_sound=fps_sound, + action_domain_id=action_domain_id, + raw_action_dim=raw_action_dim, + action_residual_gate=action_residual_gate, + proprio_condition=( + gen_data_clean.proprio_condition[start:limit] + if has_action and gen_data_clean.proprio_condition is not None + else None + ), + num_vision_items_per_sample=subset_num_items, + ) + + @torch.no_grad() + def validation_step(self, data_batch: dict[str, torch.Tensor], iteration: int): + pass + + @torch.no_grad() + def forward(self, xt, t): + pass + + @staticmethod + def _get_multiview_vae_metadata( + data_batch: dict[str, Any], + num_vision_items_per_sample: list[int] | None, + batch_size: int, + ) -> tuple[list[int] | None, list[int] | None]: + """Align per-sample multiview metadata with flattened vision items.""" + if "enable_per_camera_vae_encoding" not in data_batch: + return None, None + + sample_n_views = read_positive_int_metadata(data_batch, "sample_n_views", expected_count=batch_size) + sample_frames_per_view = read_positive_int_metadata( + data_batch, + "num_video_frames_per_view", + expected_count=batch_size, + ) + if sample_n_views is None or sample_frames_per_view is None: + raise ValueError( + "sample_n_views and num_video_frames_per_view are required when per-camera VAE encoding is enabled." + ) + + vision_item_counts = ( + num_vision_items_per_sample if num_vision_items_per_sample is not None else [1] * batch_size + ) + if len(vision_item_counts) != batch_size: + raise ValueError( + "num_vision_items_per_sample must align with the packed batch: " + f"got {len(vision_item_counts)} counts for batch size {batch_size}." + ) + + num_views_per_vision_item: list[int] = [] + frames_per_vision_item: list[int] = [] + for sample_idx, num_vision_items in enumerate(vision_item_counts): + if num_vision_items <= 0: + raise ValueError(f"Vision item counts must be positive, got {vision_item_counts}.") + num_views_per_vision_item.extend([sample_n_views[sample_idx]] * num_vision_items) + frames_per_vision_item.extend([sample_frames_per_view[sample_idx]] * num_vision_items) + return num_views_per_vision_item, frames_per_vision_item + + def _normalize_uint8_vision_item( + self, + state: torch.Tensor, + ) -> torch.Tensor: # state: [...,C,T,H,W], returns [...,C,T,H,W] + """Convert one GPU-resident uint8 vision item to fp32 and normalize to ``[-1,1]``.""" + if state.dtype != torch.uint8: + raise ValueError(f"Per-camera VAE encoding requires uint8 pixels, got {state.dtype}.") + normalized_state = state.to(**self.tensor_kwargs_fp32) # [...,C,T,H,W] + normalized_state.div_(127.5).sub_(1.0) # [...,C,T,H,W] + return normalized_state + + def _encode_vision_item( + self, + state: torch.Tensor, + *, + num_views: int, + frames_per_view: int | None, + ) -> torch.Tensor: # state: [B,C,T,H,W] or [C,T,H,W], returns [...,C_latent,T_latent,H_latent,W_latent] + """Encode one vision item, normalizing camera-major views independently when requested. + + When ``frames_per_view`` is present, ``state`` contains ``num_views`` + complete uint8 camera clips concatenated along T. Each clip is sliced as + a view, converted to fp32, normalized, and encoded separately so the + full normalized multiview tensor is never materialized. + """ + if frames_per_view is None: + if num_views != 1: + raise ValueError("frames_per_view is required when num_views is greater than one.") + return self.encode(state).contiguous().float() # [...,C_latent,T_latent,H_latent,W_latent] + + temporal_dim = state.ndim - 3 + expected_frames = num_views * frames_per_view + actual_frames = int(state.shape[temporal_dim]) + if actual_frames != expected_frames: + raise ValueError( + "Multiview vision length must equal num_views * frames_per_view: " + f"got T={actual_frames}, num_views={num_views}, frames_per_view={frames_per_view}." + ) + + encoded_views: list[torch.Tensor] = [] + for view_idx in range(num_views): + view_state = state.narrow( # [...,C,T_v,H,W] + temporal_dim, + view_idx * frames_per_view, + frames_per_view, + ) + normalized_view = self._normalize_uint8_vision_item(view_state) # [...,C,T_v,H,W] + encoded_view = ( + self.encode(normalized_view).contiguous().float() + ) # [...,C_latent,T_latent_v,H_latent,W_latent] + # The VAE is frozen/no-grad, so its output does not retain the + # normalized pixels. Release this reference before the next view. + del normalized_view + encoded_views.append(encoded_view) + + # Do camera-major repacking for now (instead of timestamp-major). + return torch.cat(encoded_views, dim=temporal_dim) # [...,C_latent,V*T_latent_v,H_latent,W_latent] + + def _encode_vision_x0_tokens( + self, + raw_state_vision: list[torch.Tensor], + num_vision_items_per_sample: list[int] | None, + vision_condition_indexes: list[list[int]] | None, + num_views_per_vision_item: list[int] | None = None, + frames_per_vision_item: list[int] | None = None, + ) -> list[torch.Tensor]: + """Encode vision items into x0 latent tokens, optionally splitting camera views. + + Default behavior (``vision_condition_indexes is None``) encodes every pixel + frame of every vision item. This is the path used during training and by any + caller that does not opt in. Multiview items are camera-major along the raw + temporal axis; each camera is normalized and encoded independently before + its latent sequence is concatenated back in the same camera-major order. + + Inference optimization: when ``vision_condition_indexes`` is provided (one + conditioning-frame-index list per sample, from each ``SequencePlan``) and the + vision tokenizer is temporally causal, only the pixel-frame prefix required to + reconstruct the highest conditioned latent frame is encoded. The remaining + latent frames are generated (pure-noise) positions that the ``condition_mask`` + blend discards, so they are zero-filled instead of encoded. Under a causal VAE + the kept latents are identical to the corresponding frames of a full-clip + encode, while the encode processes far fewer frames (e.g. 1 pixel frame instead + of the full clip for WAM / forward-dynamics modes that only condition latent + frame 0). Inverse-dynamics conditions every latent frame, so it keeps the full + encode automatically. + + The optimization falls back to a full encode for multi-vision samples, + multiview items, non-causal tokenizers, samples with no conditioning frames, + and any item whose full clip is already the minimal prefix. + """ + + has_multiview_metadata = num_views_per_vision_item is not None + if has_multiview_metadata != (frames_per_vision_item is not None): + raise ValueError("num_views_per_vision_item and frames_per_vision_item must be provided together.") + if num_views_per_vision_item is None: + num_views_per_vision_item = [1] * len(raw_state_vision) + frames_per_vision_item_optional: list[int | None] = [None] * len(raw_state_vision) + else: + assert frames_per_vision_item is not None + if len(num_views_per_vision_item) != len(raw_state_vision) or len(frames_per_vision_item) != len( + raw_state_vision + ): + raise ValueError( + "Multiview VAE metadata must align with flattened vision items: " + f"got {len(num_views_per_vision_item)} view counts, {len(frames_per_vision_item)} frame " + f"counts, and {len(raw_state_vision)} vision items." + ) + frames_per_vision_item_optional = list(frames_per_vision_item) + + # Only opt in when a caller supplied per-sample conditioning indexes, the + # samples map 1:1 to single-view vision items (no multi-vision flattening), + # and the tokenizer is causal (so a pixel prefix reproduces the leading latents). + optimization_applicable = ( + vision_condition_indexes is not None + and num_vision_items_per_sample is None + and not has_multiview_metadata + and all(num_views == 1 for num_views in num_views_per_vision_item) + and self.tokenizer_vision_gen is not None + and self.tokenizer_vision_gen.is_causal + and len(vision_condition_indexes) == len(raw_state_vision) + ) + if not optimization_applicable: + # Training does not provide vision_condition_indexes, so it fully + # encodes each item in the flattened control/target list. + return [ + self._encode_vision_item( + raw_state_vision_i, + num_views=num_views, + frames_per_view=frames_per_view, + ) + for raw_state_vision_i, num_views, frames_per_view in zip( + raw_state_vision, + num_views_per_vision_item, + frames_per_vision_item_optional, + strict=True, + ) + ] + + # The prefix-encode optimization zero-fills the generated (pure-noise) latent + # frames that the condition_mask blend later discards. That is only valid when + # no gradient is required: torch.is_grad_enabled() is False under both + # torch.inference_mode() and torch.no_grad(), so this asserts we are on an + # inference path and never silently corrupts a training forward. + if torch.is_grad_enabled(): + raise ValueError( + "prefix-encode optimization is inference-only, but grad is enabled " + "(expected torch.inference_mode()/torch.no_grad())" + ) + + tokenizer = self.tokenizer_vision_gen + assert vision_condition_indexes is not None # narrowed by optimization_applicable above + x0_tokens_vision: list[torch.Tensor] = [] + for raw_state_vision_i, condition_indexes in zip( + raw_state_vision, + vision_condition_indexes, + strict=True, + ): + # The temporal axis is the first of the trailing (T, H, W) dims for both the + # [B, C, T, H, W] and [C, T, H, W] layouts the tokenizer accepts, and encode + # preserves rank so the same index locates T in the latent output. + temporal_dim = raw_state_vision_i.ndim - 3 + num_pixel_frames = int(raw_state_vision_i.shape[temporal_dim]) + num_latent_frames = tokenizer.get_latent_num_frames(num_pixel_frames) + + valid_condition = [idx for idx in condition_indexes if 0 <= idx < num_latent_frames] + if not valid_condition: + # No conditioning frames to preserve (e.g. fully generated T2V item): + # keep the full encode so behavior is unchanged for non-action items. + x0_tokens_vision.append(self._encode_vision_item(raw_state_vision_i, num_views=1, frames_per_view=None)) + continue + + needed_latent_frames = max(valid_condition) + 1 + needed_pixel_frames = tokenizer.get_pixel_num_frames(needed_latent_frames) + assert needed_pixel_frames <= num_pixel_frames, ( + f"needed_pixel_frames ({needed_pixel_frames}) cannot be greater than " + f"num_pixel_frames ({num_pixel_frames})" + ) + if needed_pixel_frames == num_pixel_frames: + # The conditioning already spans (nearly) the whole clip; no work saved. + x0_tokens_vision.append(self._encode_vision_item(raw_state_vision_i, num_views=1, frames_per_view=None)) + continue + + prefix = raw_state_vision_i.narrow(temporal_dim, 0, needed_pixel_frames) # [...,T_prefix,H,W] + prefix_latent = self._encode_vision_item( # [...,T_latent_prefix,H_latent,W_latent] + prefix, + num_views=1, + frames_per_view=None, + ) + + # The scatter below assumes the pixel->latent round trip is exact, i.e. that + # encoding ``needed_pixel_frames`` yields exactly ``needed_latent_frames`` + # latents. All current causal tokenizers satisfy this, but guard it: an + # overshoot would make the narrow below request more frames than full_latent + # holds (confusing runtime error), and an undershoot would silently zero-fill + # the highest conditioning frame and corrupt the condition_mask blend with no + # error at all. + num_prefix_latent_frames = prefix_latent.shape[temporal_dim] + assert num_prefix_latent_frames == needed_latent_frames, ( + f"causal tokenizer pixel<->latent round trip is not exact: encoding " + f"{needed_pixel_frames} pixel frames (from get_pixel_num_frames({needed_latent_frames})) " + f"produced {num_prefix_latent_frames} latent frames, expected {needed_latent_frames}" + ) + + # Scatter the encoded prefix into a full-length latent; the unconditioned + # tail frames stay zero since the condition_mask blend replaces them with noise. + full_shape = list(prefix_latent.shape) + full_shape[temporal_dim] = num_latent_frames + full_latent = prefix_latent.new_zeros(full_shape) + full_latent.narrow(temporal_dim, 0, prefix_latent.shape[temporal_dim]).copy_(prefix_latent) + x0_tokens_vision.append(full_latent) + + return x0_tokens_vision + + def get_data_and_condition( + self, + data_batch: dict[str, torch.Tensor], + iteration: int = 1, + vision_condition_indexes: list[list[int]] | None = None, + retain_raw_state_vision: bool = True, + ) -> GenerationDataClean: + """ + - Get raw data of different modalities from databatch + - Tokenize into corresponding latents + - Load other conditioning information if any (fps, etc.) + + Args: + data_batch: Raw data batch from the dataloader. + iteration: Current iteration (only used for time-based logging during training). + vision_condition_indexes: Optional per-sample list of conditioning latent + frame indexes (one list per sample, taken from each ``SequencePlan``). + When provided (inference only), it enables the causal-VAE prefix-encode + optimization in ``_encode_vision_x0_tokens`` that skips encoding pixel + frames which only feed generated (non-conditioned) latent positions. + Leaving it ``None`` (the default, used during training) encodes every + frame — the original behavior. + retain_raw_state_vision: Preserve the public normalized + ``[B,C,V*T,H,W]`` raw-state contract for multiview sampling and + inference. Training disables this to avoid materializing complete + normalized multiview inputs. + """ + # Detect whether any sample has multiple vision items (e.g. image editing). + # If so, track the count per sample before all vision items from this batch are flattened into a list. + is_image_batch = self.is_image_batch(data_batch) + sample_vision_list = data_batch[self.input_image_key if is_image_batch else self.input_video_key] + + # we should always get this information here during training. If we can read this field + # from data_batch it means we are in the visualization callback: + if "num_vision_items_per_sample" not in data_batch: + # Each element must be a list/tuple of tensors (not a bare tensor) to count + # as multi-vision. A bare tensor's len() returns its first dim size (e.g. C=3), + # which would incorrectly trigger the multi-vision path for regular video batches. + has_multiple_vision_per_sample = any( + isinstance(v, (list, tuple)) and len(v) > 1 for v in sample_vision_list + ) + num_vision_items_per_sample: list[int] | None = ( + [len(v) for v in sample_vision_list] if has_multiple_vision_per_sample else None + ) + # information is only stored in the GenerationDataClean object which will be discarded + # outside the training loop. Error will be raised when the data batch is passed to the + # visualization callbacks. + data_batch["num_vision_items_per_sample"] = num_vision_items_per_sample + + # if has_multiple_vision_per_sample, this means that the input media is a list of lists of tensors, we need to flatten it to a list of tensors + if has_multiple_vision_per_sample: + media_key = self.input_video_key if not is_image_batch else self.input_image_key + data_batch[media_key] = [item.unsqueeze(0) for sublist in sample_vision_list for item in sublist] + if data_batch[media_key][0].dtype == torch.float32 and not is_image_batch: + data_batch["is_preprocessed"] = ( + True # for video batch, is_processed = True means the video data is normalized. However, for the image batch, is_processed = True means the image data is augmented with a temporal dimension. + ) + else: + num_vision_items_per_sample = data_batch["num_vision_items_per_sample"] + + batch_size = ( + len(sample_vision_list) if num_vision_items_per_sample is None else len(num_vision_items_per_sample) + ) + + log_enc_time = False + timer = None + if TRAINING: + import wandb + + log_enc_time = iteration % self.log_enc_time_every_n == 0 and wandb.run + if log_enc_time: + timer = Timer(unit="s") + timer.start() + + num_views_per_vision_item, frames_per_vision_item = self._get_multiview_vae_metadata( + data_batch, + num_vision_items_per_sample, + batch_size, + ) + + # Vision (image/video) raw state and tokenized latent state. + media_key = self.input_image_key if is_image_batch else self.input_video_key + if num_views_per_vision_item is None: + # Legacy VFM/image path: normalize the complete input when needed and + # preserve the existing image batch-dimension handling. + self._normalize_video_databatch_inplace(data_batch) + self._augment_image_dim_inplace(data_batch) # converts each image tensor to [1,C,1,H,W] + raw_state_vision = data_batch[media_key] + else: + # Per-camera multiview path: preserve camera-major uint8 pixels here; + # _encode_vision_item normalizes only one camera at a time. + raw_state_vision = [] + for item in data_batch[media_key]: + if isinstance(item, (list, tuple)): + if len(item) != 1: + raise ValueError( + f"Single-item multiview samples must contain exactly one vision tensor, got {len(item)}." + ) + item = item[0] + if not isinstance(item, torch.Tensor): + raise TypeError(f"Multiview vision items must be tensors, got {type(item).__name__}.") + if item.dim() == 4: # Unbatched camera-major pixels: [C,V*T,H,W] + item = item.unsqueeze(0) # [1,C,V*T,H,W] + elif item.dim() != 5: # Batched camera-major pixels: [B,C,V*T,H,W] + raise ValueError( + f"Multiview vision items must have shape [C,V*T,H,W] or [B,C,V*T,H,W], got {tuple(item.shape)}." + ) + raw_state_vision.append(item) + + x0_tokens_vision = self._encode_vision_x0_tokens( + raw_state_vision, + num_vision_items_per_sample, + vision_condition_indexes, + num_views_per_vision_item, + frames_per_vision_item, + ) + + frame_size = data_batch.get("image_size", None) + if frame_size is not None: + x0_tokens_vision = self._remove_padding_from_latent(x0_tokens_vision, frame_size) + + temporal_positions_vision = self._get_temporal_positions_vision( + raw_state_vision=raw_state_vision, + x0_tokens_vision=x0_tokens_vision, + num_views_per_vision_item=num_views_per_vision_item, + frames_per_vision_item=frames_per_vision_item, + ) + + output_raw_state_vision = raw_state_vision + if retain_raw_state_vision and num_views_per_vision_item is not None: + output_raw_state_vision = [ + self._normalize_uint8_vision_item(state) for state in raw_state_vision + ] # list[[B,C,V*T,H,W]] + + # Action – extract dense action / domain_id without mutating data_batch, + # so downstream callbacks can still read the original per-sample domain_ids. + raw_state_action, action_domain_id = self._normalize_action_databatch(data_batch) + x0_tokens_action = raw_state_action + raw_action_dim = data_batch.get("raw_action_dim", None) + action_residual_gate = unwrap_and_densify( + data_batch.get("residual_gate", None), self.tensor_kwargs_fp32 + ) + # Serving wraps a single sample's tensors with a leading batch + # dimension (``[1,T,1]``), while the packed sequence expects one + # ``[T,1]`` gate per action payload. Training already supplies + # ``[T,1]``. Normalize both forms here before the gate is attached to + # ModalityData; otherwise the flattened batch dimension can be + # mistaken for action-token positions during inference. + if action_residual_gate is not None: + normalized_gates: list[torch.Tensor] = [] + for gate in action_residual_gate: + while gate.ndim > 2 and gate.shape[0] == 1: + gate = gate.squeeze(0) + if gate.ndim == 1: + gate = gate.unsqueeze(-1) + if gate.ndim != 2 or gate.shape[-1] != 1: + raise ValueError( + "residual_gate entries must have shape [T,1] (or a singleton-leading " + f"batch dimension), got {tuple(gate.shape)}" + ) + normalized_gates.append(gate) + action_residual_gate = normalized_gates + + # Sound/audio - normalize, encode if present and sound_gen is enabled + self._normalize_sound_databatch_inplace(data_batch) + raw_state_sound = data_batch.get("sound", None) + if raw_state_sound is not None and self.tokenizer_sound_gen is not None: + x0_tokens_sound = [self.encode_sound(s).contiguous().float() for s in raw_state_sound] + else: + x0_tokens_sound = None + + # FPS metadata is used by the sequence packer for mRoPE temporal IDs when + # FPS modulation is enabled in the training config. + fps_raw = data_batch.get("conditioning_fps", None) + if isinstance(fps_raw, list): + fps_raw = torch.stack(fps_raw).flatten() # list of scalar tensors -> (B,) + fps_vision = fps_raw.to(**self.tensor_kwargs) if fps_raw is not None else None + fps_action = fps_raw.to(**self.tensor_kwargs) if fps_raw is not None else None + if "conditioning_fps_action" in data_batch: + fps_action_raw = data_batch["conditioning_fps_action"] + if isinstance(fps_action_raw, list): + # serve_policy.py wraps every tensor in a list; align with the conditioning_fps + # branch above so inference paths don't hit AttributeError on .to(). + fps_action_raw = torch.stack(fps_action_raw).flatten() + fps_action = fps_action_raw.to(**self.tensor_kwargs) + + # Sound FPS for RoPE alignment (constant, from config) + if x0_tokens_sound is not None: + sound_batch_size = len(x0_tokens_sound) + fps_sound = torch.full( + (sound_batch_size,), + self._get_sound_fps_for_rope(), + dtype=torch.float32, + ).to(**self.tensor_kwargs) + else: + fps_sound = None + + if TRAINING and log_enc_time and timer is not None: + timer.end() + elapsed = timer.get_cuda_time() + h, w = raw_state_vision[0].shape[-2], raw_state_vision[0].shape[-1] + resolution_label = "unknown" + for res_name, aspect_ratios in VIDEO_RES_SIZE_INFO.items(): + if (h, w) in aspect_ratios.values(): + resolution_label = res_name + if res_name == "704": + # 720 shares some aspect ratios with 704 (e.g., 1:1 at 960x960); prefer 720. + if (h, w) in VIDEO_RES_SIZE_INFO.get("720", {}).values(): + resolution_label = "720" + break + wandb.log( + { + f"timer/encoding_{resolution_label}p": elapsed, + "timer/encoding": elapsed, + }, + step=iteration, + ) + control_weights: list[list[float]] | None = data_batch.get("control_weights", None) + proprio_condition = unwrap_and_densify(data_batch.get("proprio", None), self.tensor_kwargs_fp32) + return GenerationDataClean( + batch_size=batch_size, + is_image_batch=is_image_batch, + raw_state_vision=output_raw_state_vision, + raw_state_action=raw_state_action, + raw_state_sound=raw_state_sound, + x0_tokens_vision=x0_tokens_vision, + x0_tokens_action=x0_tokens_action, + x0_tokens_sound=x0_tokens_sound, + fps_vision=fps_vision, + temporal_positions_vision=temporal_positions_vision, + fps_action=fps_action, + fps_sound=fps_sound, + action_domain_id=action_domain_id, + num_vision_items_per_sample=num_vision_items_per_sample, + raw_action_dim=raw_action_dim, + action_residual_gate=action_residual_gate, + control_weights=control_weights, + proprio_condition=proprio_condition, + ) + + def _normalize_video_databatch_inplace( + self, data_batch: dict[str, torch.Tensor], input_key: str | None = None + ) -> None: + """ + Normalizes video data in-place on a CUDA device to reduce data loading overhead. + + This function modifies the video data tensor within the provided data_batch dictionary + in-place, scaling the uint8 data from the range [0, 255] to the normalized range [-1, 1]. + + Args: + data_batch (dict[str, Tensor]): A dictionary containing the video data under a specific key. + This tensor is expected to be on a CUDA device and have dtype of torch.uint8. + input_key (str | None): The key for the video tensor in the data_batch. Defaults to + `self.input_video_key` if not provided. + + Side Effects: + Modifies the tensor at `input_key` within `data_batch` in-place. + + Note: + This operation is performed directly on the CUDA device to avoid the overhead associated + with moving data to/from the GPU. Ensure that the tensor is already on the appropriate device + and has the correct dtype (torch.uint8) to avoid unexpected behaviors. + """ + IS_PREPROCESSED_KEY = "is_preprocessed" + input_key = self.input_video_key if input_key is None else input_key + # only handle video batch + if input_key in data_batch: + if IS_PREPROCESSED_KEY in data_batch and data_batch[IS_PREPROCESSED_KEY] is True: + for i in range(len(data_batch[input_key])): + assert torch.is_floating_point(data_batch[input_key][i]), "Video data is not in float format." + assert torch.all((data_batch[input_key][i] >= -1.0001) & (data_batch[input_key][i] <= 1.0001)), ( + f"Video data is not in the range [-1, 1]. get data range " + f"[{data_batch[input_key][i].min()}, {data_batch[input_key][i].max()}]" + ) + else: + # Worker-normalized batches take the preprocessed branch above. + for i in range(len(data_batch[input_key])): + item = data_batch[input_key][i] + if isinstance(item, torch.Tensor): + assert item.dtype == torch.uint8, "Video data is not in uint8 format." + # Flattened multiview items already include B; preserve the original stacking behavior otherwise. + if item.ndim != 5: + item = torch.stack([item]) # [1,C,T,H,W] + normalized_item = item.to(**self.tensor_kwargs_fp32) / 127.5 - 1.0 # [B,C,T,H,W] + else: + # Non-flattened batches may still provide one [C,T,H,W] tensor per sample. + assert item[0].dtype == torch.uint8, "Video data is not in uint8 format." + normalized_item = ( # [B,C,T,H,W] + torch.stack(item).to(**self.tensor_kwargs_fp32) / 127.5 - 1.0 + ) + data_batch[input_key][i] = normalized_item # [B,C,T,H,W] + data_batch[IS_PREPROCESSED_KEY] = True + + def _normalize_action_databatch( + self, data_batch: dict[str, torch.Tensor] + ) -> tuple[list[torch.Tensor] | None, list[torch.Tensor] | None]: + """Extract dense action and domain_id lists from the data batch. + + The joint dataloader produces action and domain_id data as + ``[[tensor], [None], [tensor], ...]`` (each sample wrapped in a + single-element list). This method unwraps inner lists and filters + out ``None`` entries to produce dense lists suitable for the model, + **without mutating** ``data_batch``. + + Returns: + (dense_action, dense_domain_id): Each is a list of device tensors + containing only non-None entries, or ``None`` if all entries are + ``None`` / the key is absent. + """ + dense_action = unwrap_and_densify(data_batch.get("action", None), self.tensor_kwargs) + dense_domain_id = unwrap_and_densify( + data_batch.get("domain_id", None), {"device": self.tensor_kwargs["device"]} + ) + return dense_action, dense_domain_id + + def _normalize_sound_databatch_inplace(self, data_batch: dict[str, torch.Tensor]) -> None: + """Flatten and densify nested sound lists in-place. + + The joint dataloader produces sound data as + ``[[tensor], [None], [tensor], ...]`` (each sample wrapped in a single-element + list). This method: + + 1. Unwraps inner lists: ``[[t], [None], [t]]`` -> ``[t, None, t]`` + 2. Clears ``sequence_plan.has_sound`` for samples whose sound is ``None`` + (kept aligned by ``custom_collate_fn`` preserving ``None`` placeholders). + 3. Filters out None entries: ``[t, None, t]`` -> ``[t, t]`` + 4. Moves tensors to the model device. + 5. Sets ``data_batch["sound"]`` to ``None`` if no valid sound data remains. + + Alignment invariant: ``custom_collate_fn`` keeps the ``"sound"`` key + as a list with ``None`` placeholders for samples that lack audio (e.g. + audio-extraction failures), so the unwrapped ``raw_state_sound`` is + 1:1 with ``sequence_plan``. ``SoundSequencePlanBuilder`` already sets + each plan's ``has_sound`` according to that sample's actual sound + presence, so clearing flags for ``None`` slots here is just defensive. + """ + raw_state_sound = data_batch.get("sound", None) + sequence_plans = data_batch.get("sequence_plan", None) + sound_enabled = self.tokenizer_sound_gen is not None + + def _disable_sound_on_plans() -> None: + if isinstance(sequence_plans, list): + for plan in sequence_plans: + if hasattr(plan, "has_sound"): + plan.has_sound = False + plan.condition_frame_indexes_sound = [] + + if not isinstance(raw_state_sound, list) or len(raw_state_sound) == 0: + # No sound entries at all (image-only batches, or every sample + # came from a non-audio stream). Defensively clear has_sound on + # any plan that somehow has it set so packing does not look up + # missing tensors. + _disable_sound_on_plans() + data_batch["sound"] = None + return + + # Unwrap single-element inner lists produced by IterativeJointDataLoader + if isinstance(raw_state_sound[0], list): + raw_state_sound = [item[0] if isinstance(item, list) else item for item in raw_state_sound] + + if not sound_enabled: + # Model is not configured for sound generation: drop tensors and + # clear any has_sound flags so packing skips the sound path. + _disable_sound_on_plans() + data_batch["sound"] = None + return + + if isinstance(sequence_plans, list): + if len(sequence_plans) == len(raw_state_sound): + # Expected path: 1:1 alignment between plans and per-sample + # sound slots. Clear has_sound where the per-sample tensor + # is None so sequence_packing's idx_sound counter stays in + # sync with the filtered dense list. + for plan, sound in zip(sequence_plans, raw_state_sound, strict=True): + if hasattr(plan, "has_sound") and sound is None: + plan.has_sound = False + plan.condition_frame_indexes_sound = [] + else: + # Length mismatch can only happen if some upstream code path + # (e.g. a stale collate that drops "sound" when any sample is + # None) leaves the dense list shorter than the plans. Without + # 1:1 alignment we cannot safely associate tensors with plans, + # so we conservatively disable sound for the whole batch. + # This trades a small amount of training signal for guaranteed + # correctness — better than silently feeding sound from one + # sample into another sample's plan. + log.warning( + f"Sound/plan length mismatch ({len(sequence_plans)} plans vs " + f"{len(raw_state_sound)} sound entries). Disabling sound for " + "this batch. Check that custom_collate_fn preserves the " + "'sound' key with None placeholders." + ) + _disable_sound_on_plans() + data_batch["sound"] = None + return + + # Filter out None entries (samples without audio) and move to device. + # After the alignment step above, the remaining dense list has the + # same cardinality as plans with has_sound=True. + raw_state_sound = [ + s.to(self.tensor_kwargs["device"]) for s in raw_state_sound if s is not None + ] # list of [C,T_audio] + + if len(raw_state_sound) == 0: + _disable_sound_on_plans() + data_batch["sound"] = None + else: + data_batch["sound"] = raw_state_sound + + def _augment_image_dim_inplace(self, data_batch: dict[str, torch.Tensor], input_key: str = None) -> None: + """ + Augments image tensors by adding a temporal dimension (B, C, H, W) -> (B, C, 1, H, W). + + Args: + data_batch (dict[str, Tensor]): A dictionary containing the image data. + input_key (str | None): The key for the image tensor. Defaults to `self.input_image_key`. + + Side Effects: + Modifies the tensor at `input_key` within `data_batch` in-place. + """ + IS_PREPROCESSED_KEY = "is_preprocessed" + + input_key = self.input_image_key if input_key is None else input_key + if input_key in data_batch: + # Check if the data has already been augmented and avoid re-augmenting + if IS_PREPROCESSED_KEY in data_batch and data_batch[IS_PREPROCESSED_KEY] is True: + for i in range(len(data_batch[input_key])): + assert data_batch[input_key][i].shape[2] == 1, ( + f"Image data is claimed be augmented while its shape is {data_batch[input_key][i].shape} for sample {i}" + ) + assert torch.is_floating_point(data_batch[input_key][i]), "Image data is not in float format." + assert torch.all((data_batch[input_key][i] >= -1.0001) & (data_batch[input_key][i] <= 1.0001)), ( + f"Image data is not in the range [-1, 1]. get data range [{data_batch[input_key][i].min()}, {data_batch[input_key][i].max()}]" + ) + return + else: + new_image_tensor_list = [] + for i in range(len(data_batch[input_key])): + for img_tensor in data_batch[input_key][i]: + img_tensor = rearrange(img_tensor, "c h w -> 1 c 1 h w").contiguous() + if img_tensor.dtype == torch.uint8: + img_tensor = img_tensor.to(**self.tensor_kwargs_fp32) / 127.5 - 1.0 + new_image_tensor_list.append(img_tensor) + data_batch[input_key] = new_image_tensor_list + data_batch[IS_PREPROCESSED_KEY] = True + + # ------------------ Checkpointing ------------------ + + def state_dict( + self, + destination: dict[str, Any] | None = None, + prefix: str = "", + keep_vars: bool = False, + ) -> dict[str, Any]: + """Return checkpointable model weights using OmniMoT's flat key layout. + + The regular network is saved under ``net.*`` keys. When EMA is + enabled, the EMA copy is saved under matching ``net_ema.*`` keys so + the DCP loader can materialize both trees from one flat state dict. + The optional ``prefix`` is prepended before those namespaces, matching + the ``torch.nn.Module.state_dict`` convention. + + The full ``torch.nn.Module.state_dict`` signature (``destination``, + ``prefix``, ``keep_vars``) is honored so this module behaves correctly + when a parent module's ``state_dict`` recurses into it: PyTorch ignores + the child return value and expects the entries to be written into the + provided ``destination`` mapping. + + If ``exclude_reasoner_weights_from_checkpoint`` is enabled, the + understanding/reasoner tower keys are omitted from both regular and + EMA state dicts; generation-pathway weights and VFM heads remain + checkpointed. + """ + reg_state_dict = self._net_state_dict( + self.net, + prefix=prefix + "net.", + keep_vars=keep_vars, + ) + + if self.config.ema.enabled: + ema_state_dict = self._net_state_dict( + self.net_ema, + prefix=prefix + "net_ema.", + keep_vars=keep_vars, + ) + else: + ema_state_dict = {} + + if destination is not None: + destination.update(reg_state_dict) + destination.update(ema_state_dict) + return destination + + return {**reg_state_dict, **ema_state_dict} + + def load_state_dict( + self, + state_dict: Mapping[str, Any], + strict: bool = True, + assign: bool = False, + ) -> _IncompatibleKeys: + """ + Loads a state dictionary into the model and optionally its EMA counterpart. + + Parameters: + state_dict (Mapping[str, Any]): A dictionary containing separate state + dictionaries for the model and potentially for an EMA version of the model + under the keys 'net' and 'net_ema', respectively. + strict (bool, optional): Must be False. Missing and unexpected keys are + returned to the caller in an `_IncompatibleKeys` object so the DCP + wrapper can report them after `set_model_state_dict` completes. + Passing True raises ValueError. + assign (bool, optional): Must be False. Assign-mode loading is not + supported by this checkpoint path; passing True raises ValueError. + Defaults to False. + + Returns: + _IncompatibleKeys: A tuple containing the missing and unexpected keys. + """ + # Note that strict must be set to False to avoid facing errors inside the + # `set_model_state_dict` function in the parent class. The caller must check + # the returned `_IncompatibleKeys` to get the missing and unexpected keys, + # and raise errors if needed. + if strict: + raise ValueError("Strict mode is not supported for OmniMoTModel load_state_dict") + if assign: + raise ValueError("Assign mode is not supported for OmniMoTModel load_state_dict") + + missing_keys: list[str] = [] + unexpected_keys: list[str] = [] + + _reg_state_dict = collections.OrderedDict() + _ema_state_dict = collections.OrderedDict() + for k, v in state_dict.items(): + if k.startswith("net."): + _reg_state_dict[k.removeprefix("net.")] = v + elif k.startswith("net_ema.") and self.config.ema.enabled: + _ema_state_dict[k.removeprefix("net_ema.")] = v + else: + # If the key is prefixed with "net_ema." but EMA is not enabled, it + # is unexpected. If the key is not prefixed with "net." or "net_ema.", + # it is unexpected. + unexpected_keys.append(k) + + reg_results = self._load_net_state_dict(self.net, _reg_state_dict) + missing_keys.extend(f"net.{k}" for k in reg_results.missing_keys) + unexpected_keys.extend(f"net.{k}" for k in reg_results.unexpected_keys) + + if self.config.ema.enabled: + ema_results = self._load_net_state_dict(self.net_ema, _ema_state_dict) + missing_keys.extend(f"net_ema.{k}" for k in ema_results.missing_keys) + unexpected_keys.extend(f"net_ema.{k}" for k in ema_results.unexpected_keys) + + return _IncompatibleKeys(missing_keys=missing_keys, unexpected_keys=unexpected_keys) + + def _net_state_dict( + self, + net: torch.nn.Module, + prefix: str = "", + keep_vars: bool = False, + ) -> dict[str, Any]: + if self.config.exclude_reasoner_weights_from_checkpoint: + return { + k: v + for k, v in net.state_dict(prefix=prefix, keep_vars=keep_vars).items() + if not _is_reasoner_state_dict_key(k.removeprefix(prefix)) + } + else: + return net.state_dict(prefix=prefix, keep_vars=keep_vars) + + def _load_net_state_dict( + self, + net: torch.nn.Module, + state_dict: Mapping[str, Any], + ) -> _IncompatibleKeys: + if self.config.exclude_reasoner_weights_from_checkpoint: + # Leave pretrained reasoner weights untouched even if an incoming + # checkpoint contains them, and tolerate their absence when they + # were intentionally not checkpointed. + state_dict = collections.OrderedDict( + (k, v) for k, v in state_dict.items() if not _is_reasoner_state_dict_key(k) + ) + + ret: _IncompatibleKeys = net.load_state_dict(state_dict, strict=False, assign=False) + + if self.config.exclude_reasoner_weights_from_checkpoint: + missing_keys = [k for k in ret.missing_keys if not _is_reasoner_state_dict_key(k)] + else: + missing_keys = ret.missing_keys + + return _IncompatibleKeys(missing_keys=missing_keys, unexpected_keys=ret.unexpected_keys) + + # ------------------ public methods ------------------ + + def ema_beta(self, iteration: int) -> float: + """ + Calculate the beta value for EMA update. + weights = weights * beta + (1 - beta) * new_weights + + Args: + iteration (int): Current iteration number. + + Returns: + float: The calculated beta value. + """ + iteration = iteration + self.config.ema.iteration_shift + if iteration < 1: + return 0.0 + return (1 - 1 / (iteration + 1)) ** (self.ema_exp_coefficient + 1) + + def model_param_stats(self) -> Dict[str, int]: + return {"total_learnable_param_num": self._param_count} + + def is_image_batch(self, data_batch: dict[str, torch.Tensor]) -> bool: + """Check if the data_batch contains images (vs. videos). + + We handle two types of data_batch: one from a joint_dataloader where "dataset_name" can + differentiate image_batch and video_batch, another from a single dataloader which we + assume as video_data by default. + """ + is_image = self.input_image_key in data_batch + is_video = self.input_video_key in data_batch + assert is_image != is_video, ( + "Only one of the input_image_key or input_video_key should be present in the data_batch." + ) + return is_image + + def _extract_upsample_video_specs( + self, data_batch: dict, task: str + ) -> tuple[str, int, int, int | None, int | None]: + """Derive the V4.2 template specs (``aspect_ratio``, ``resolution_w/h``, + ``fps``, ``duration_secs``) for :meth:`upsample_captions` from a + ``data_batch``. + + Used by :meth:`generate_samples_from_batch` to feed the per-batch + V4.2 template constraints (resolution / aspect ratio / fps / + duration) into the prompt upsampler so the rewritten caption is + consistent with the actual clip that will be generated. + + The spatial size is read directly off the first sample's vision + tensor (``shape[-1]`` for width, ``shape[-2]`` for height), and + the ``aspect_ratio`` string is reverse-looked-up against the + canonical ``{IMAGE,VIDEO}_RES_SIZE_INFO`` tables in + :mod:`cosmos_framework.data.generator.utils` — image table for + ``"t2i"``, video table otherwise. Note these tables are + ``{res: {ar: (W, H)}}`` (the first entry is *width*); the + existing logging-only lookup in + :meth:`_get_clean_generation_data` uses ``(h, w)`` which only + matches square aspect ratios — that's a known logging bug, not + a regression caused by this helper. + + For the video tasks (``"t2v"``, ``"i2v"``) we also pull ``fps`` + from ``data_batch["conditioning_fps"]`` (taking the first + sample's scalar — batches are assumed fps-uniform for prompt + upsampling) and derive ``duration_secs = num_frames // fps`` + where ``num_frames`` is the temporal dimension + (``shape[-3]``) of the same vision tensor. For ``"t2i"`` both + fields are returned as ``None`` so + :func:`cosmos_framework.model.generator.upsampler.prompts.build_user_text`'s + ``t2i``-must-have-no-video-args contract is satisfied. + + Args: + data_batch: The raw data batch handed to + :meth:`generate_samples_from_batch`. + task: Canonical upsampler task previously resolved by + the inference caller (``"t2v"``, ``"t2i"``, or + ``"i2v"``). Selects which key of ``data_batch`` holds + the spatial reference tensor and which + ``RES_SIZE_INFO`` table to use. + + Returns: + ``(aspect_ratio_str, resolution_w, resolution_h, fps, duration_secs)``, + where the last two are ``None`` iff ``task == "t2i"``. + + Raises: + ValueError: If the vision tensor for the resolved modality + key is missing, if its spatial shape doesn't match any + ``(W, H)`` entry in the canonical resolution table + (i.e. the batch is at a non-canonical resolution + /aspect-ratio combination), or if a video task is + missing ``conditioning_fps``. + """ + if task == "t2i": + vision_key = self.input_image_key + res_info = IMAGE_RES_SIZE_INFO + res_info_name = "IMAGE_RES_SIZE_INFO" + else: + vision_key = self.input_video_key + res_info = VIDEO_RES_SIZE_INFO + res_info_name = "VIDEO_RES_SIZE_INFO" + + vision_data = data_batch.get(vision_key) + if vision_data is None: + raise ValueError( + f"upsample task={task!r} requires data_batch[{vision_key!r}] " + "for resolution / aspect-ratio inference; found None." + ) + sample = vision_data[0] if isinstance(vision_data, list) else vision_data + h = int(sample.shape[-2]) + w = int(sample.shape[-1]) + + aspect_ratio: str | None = None + for ar_map in res_info.values(): + for ar_str, (target_w, target_h) in ar_map.items(): + if (target_w, target_h) == (w, h): + aspect_ratio = ar_str + break + if aspect_ratio is not None: + break + if aspect_ratio is None: + raise ValueError( + f"Cannot infer aspect_ratio for upsample task={task!r}: vision tensor has " + f"(W={w}, H={h}) which is not a canonical entry in {res_info_name}. " + "Use a supported (resolution, aspect_ratio) combination from " + "cosmos_framework.data.generator.utils, or pass explicit specs to " + "`upsample_captions(...)`." + ) + + if task == "t2i": + return aspect_ratio, w, h, None, None + + fps_raw = data_batch.get("conditioning_fps") + if fps_raw is None: + raise ValueError( + f"upsample task={task!r} requires data_batch['conditioning_fps'] for fps / duration inference." + ) + if isinstance(fps_raw, list): + fps_raw = torch.stack(fps_raw) + fps_int = int(fps_raw.flatten()[0].item()) + if fps_int <= 0: + raise ValueError(f"upsample task={task!r}: conditioning_fps must be positive; got {fps_int}.") + num_frames = int(sample.shape[-3]) + # Integer-floor seconds matches the canonical V4.2 ``M:SS`` rendering + # in :func:`cosmos_framework.model.generator.upsampler.prompts._format_duration`, + # which expects an int and rejects fractional seconds. + duration_secs = max(1, num_frames // fps_int) + return aspect_ratio, w, h, fps_int, duration_secs + + def _maybe_apply_prompt_upsampling( + self, + data_batch: dict, + *, + upsample_task: str | None, + upsample_max_new_tokens: int, + upsample_temperature: float | None, + upsample_top_k: int | None, + upsample_top_p: float | None, + upsample_repetition_penalty: float = 1.0, + upsample_presence_penalty: float = 0.0, + upsample_seed: int | None = None, + ) -> dict: + """Rewrite the conditional captions in ``data_batch`` via the + reasoner-tower prompt upsampler, returning a fresh dict. + + Orchestrates the full per-task upsampling pipeline that + :meth:`generate_samples_from_batch` runs *before* + :meth:`_prepare_inference_data` so that downstream tokenization, + sequence-plan construction, and the CFG ``velocity_fn`` all see + the upsampled prompts uniformly with no further changes. Steps: + + 1. **Task selection** — the caller resolves the V4.2 task + (``"t2v"`` / ``"t2i"`` / ``"i2v"``) and passes it via + ``upsample_task``. + 2. **Image conditioning (i2v only)** — for ``"i2v"``, one + VLM-ready conditioning image per caption is pulled via + :meth:`_extract_upsample_conditioning_images` so the V4.2 + i2v chat block actually carries the visual context. + 3. **Template specs** — + :meth:`_extract_upsample_video_specs` derives + ``aspect_ratio``, ``resolution_w/h``, and (for video tasks) + ``fps`` / ``duration_secs`` from the same ``data_batch`` so + the upsampler's V4.2 ``task_constraints`` block matches the + clip the diffusion tower will actually generate. + 4. **Upsampling** — :meth:`upsample_captions` runs the reasoner + AR loop with the V4.2 template, applies ``clean_response`` + post-processing, and falls back to the original caption on + empty-cleaned output. + 5. **Substitution** — the caller's dict is shallow-copied and + ``self.input_caption_key`` is overwritten with the upsampled + captions. The caller's dict is never mutated in place. + + The unconditional captions are NOT upsampled (negative prompts + and empty strings pass through as-is); CFG runs with the + original unconditional branch. When CP/CFGP is enabled, the + rank-uniformity of the final captions is handled inside + :meth:`upsample_captions` (greedy decode + FSDP-lockstep + per-prompt loop), so this orchestrator does not need to + broadcast separately. + + Args: + data_batch: Raw data batch handed to + :meth:`generate_samples_from_batch`. Must contain + ``self.input_caption_key`` and one of + ``{self.input_image_key, self.input_video_key}`` (so + the caller can resolve a canonical V4.2 task). + upsample_task: Canonical V4.2 task resolved by the inference + caller. ``None`` short-circuits this method to a no-op + that returns ``data_batch`` unchanged (same object identity). + upsample_max_new_tokens: Per-caption decode budget passed + through to :meth:`upsample_captions`. + upsample_temperature, upsample_top_k, upsample_top_p: + Sampling controls forwarded to + :meth:`upsample_captions`. Greedy decoding + (``do_sample=False``) is NOT used here — + ``generate_samples_from_batch`` historically runs the + upsampler with sampling on (``do_sample=True``) so + negative-prompt diversity isn't suppressed across the + batch; see :meth:`upsample_captions` for the + FSDP-lockstep contract. + upsample_repetition_penalty: CTRL/HF-style multiplicative + logit penalty on tokens already seen in each + caption's history; forwarded to + :meth:`upsample_captions`. ``1.0`` (default) is + identity and adds zero overhead to the reasoner AR + loop. + upsample_presence_penalty: OpenAI-style additive logit + penalty (binary presence, not frequency) on tokens + already seen; forwarded to :meth:`upsample_captions`. + ``0.0`` (default) is identity. + upsample_seed: Optional integer seed for the upsampler's + sampling RNG; forwarded to :meth:`upsample_captions` + and through to + :func:`unified_mot._impl_generate_reasoner_text`. + ``None`` (default) consumes the device's default RNG + and is bit-identical to the pre-seed behavior. Has + no effect under greedy decoding. Distinct from the + per-sample diffusion noise seed handled by + :meth:`generate_samples_from_batch`. + + Returns: + ``data_batch`` unchanged if ``upsample_task is None``. + Otherwise, a shallow copy with ``self.input_caption_key`` + replaced by the upsampled captions list. + """ + if upsample_task is None: + return data_batch + if upsample_task not in {"t2v", "t2i", "i2v"}: + raise ValueError(f"upsample_task must be one of {{'t2v', 't2i', 'i2v'}} or None; got {upsample_task!r}.") + + upsample_start_time = time.time() + captions = data_batch[self.input_caption_key] + log.info( + "Prompt upsampling options: " + f"task={upsample_task}, " + f"max_new_tokens={upsample_max_new_tokens}, " + f"temperature={upsample_temperature}, " + f"top_k={upsample_top_k}, " + f"top_p={upsample_top_p}, " + f"repetition_penalty={upsample_repetition_penalty}, " + f"presence_penalty={upsample_presence_penalty}, " + f"seed={upsample_seed}", + rank0_only=False, + ) + # For i2v, hand the upsampler one VLM-ready image per caption so + # the V4.2 i2v template's chat block actually carries visual context. + upsample_input_images: list[Any] | None = None + if upsample_task == "i2v": + upsample_input_images = self._extract_upsample_conditioning_images(data_batch) + + # V4.2 templates inject the actual clip's aspect ratio, resolution, + # fps, and duration into their ``task_constraints`` block, so the + # rewritten caption stays consistent with the clip the diffusion + # tower will generate. Derive these specs from ``data_batch`` + # rather than relying on stale defaults. + ( + upsample_aspect_ratio, + upsample_res_w, + upsample_res_h, + upsample_fps, + upsample_duration_secs, + ) = self._extract_upsample_video_specs(data_batch, upsample_task) + log.info( + f"Prompt upsampling specs: aspect_ratio={upsample_aspect_ratio!r}, " + f"resolution_w={upsample_res_w}, resolution_h={upsample_res_h}, " + f"fps={upsample_fps}, duration_secs={upsample_duration_secs}", + rank0_only=False, + ) + upsampled_captions = self.upsample_captions( + captions, + max_new_tokens=upsample_max_new_tokens, + task=upsample_task, + aspect_ratio=upsample_aspect_ratio, + resolution_w=upsample_res_w, + resolution_h=upsample_res_h, + fps=upsample_fps, + duration_secs=upsample_duration_secs, + images=upsample_input_images, + do_sample=True, + temperature=upsample_temperature, + top_k=upsample_top_k, + top_p=upsample_top_p, + repetition_penalty=upsample_repetition_penalty, + presence_penalty=upsample_presence_penalty, + seed=upsample_seed, + ) + data_batch = dict(data_batch) + data_batch[self.input_caption_key] = upsampled_captions + log.info(f"Prompt upsampling took {time.time() - upsample_start_time:.2f} seconds", rank0_only=False) + return data_batch + + def _extract_upsample_conditioning_images(self, data_batch: dict) -> list[Any]: + """Return VLM-ready conditioning images for the i2v prompt upsampler.""" + plans = data_batch.get("sequence_plan") + if plans is None or self.input_video_key not in data_batch: + raise ValueError( + f"I2V prompt upsampling requires both sequence_plan and {self.input_video_key!r} in the data batch." + ) + + prompt_upsampling_images = data_batch.get("_prompt_upsampling_images") + if prompt_upsampling_images is None: + raise ValueError( + "I2V prompt upsampling requires '_prompt_upsampling_images' with one VLM-ready image per caption." + ) + if len(prompt_upsampling_images) != len(plans): + raise ValueError( + "I2V prompt upsampling image count must match sequence_plan count: " + f"{len(prompt_upsampling_images)} != {len(plans)}." + ) + return list(prompt_upsampling_images) + + def denoise( + self, + net: torch.nn.Module | None = None, + data_batch_packed: PackedSequence | None = None, + memory: MemoryState | None = None, + video_temporal_causal: bool | None = None, + ) -> dict: + """ + Runs the MoT network on a packed multi-modal sequence to predict velocity (v) targets. + + Args: + data_batch_packed: PackedSequence from `pack_input_sequence(...)`. + memory: Optional pre-built MemoryState for autoregressive generation + or KV-cache training. + video_temporal_causal: Per-call attention-mode override forwarded to + ``Cosmos3VFMNetwork.forward``; ``None`` (default) keeps the + config-selected mode. + + Returns: + dict containing: + - "preds_vision": list[Tensor[C,T,H,W]], one per sample. + - "preds_action": Velocity prediction for action modality (if action_gen enabled). + - "preds_sound": Velocity prediction for sound modality (if sound_gen enabled). + - "lbl_metadata_und": Load balancing metadata for understanding pathway (if present). + - "lbl_metadata_gen": Load balancing metadata for generation pathway (if present). + """ + net = net or self.net + out_net = net( + packed_seq=data_batch_packed, + memory=memory, + video_temporal_causal=video_temporal_causal, + ) + output_dict = dict() + output_dict["preds_vision"] = out_net["preds_vision"] + if self.config.action_gen and "preds_action" in out_net: + output_dict["preds_action"] = out_net["preds_action"] + if self.config.sound_gen and "preds_sound" in out_net: + output_dict["preds_sound"] = out_net["preds_sound"] + # Zeva policy injection returns its Gaussian action prior alongside the modality + # predictions. Preserve these tensors (and their autograd graph) so + # _compute_losses can apply the auxiliary behavior_prior_nll. + for key in ("behavior_prior_mean", "behavior_prior_std"): + if key in out_net: + output_dict[key] = out_net[key] + for key, value in out_net.items(): + if "lbl_metadata_" in key: + output_dict[key] = value + + return output_dict + + def _tokenize_captions( + self, + captions: list[str], + *, + use_system_prompt: bool, + system_prompt: str | None, + is_video: bool, + ) -> list[list[int]]: + """Per-caption chat-template tokenization (ragged, no padding). + + Single source of truth for the per-caption loop shared by + :meth:`tokenize_text` (which adds padding + tensor-wrapping) and + :meth:`_get_inference_text_tokens` (which feeds the diffusion + sampling pipeline that natively consumes ``list[list[int]]``). + + Args: + captions: Raw text prompts. + use_system_prompt: Already-resolved boolean (callers handle any + ``None`` fallback against ``self.vlm_config``). + system_prompt: Explicit system prompt that overrides + ``use_system_prompt`` / ``is_video`` when supplied. + is_video: Selects the video vs image default system prompt + when ``use_system_prompt=True`` and no explicit + ``system_prompt`` is given. + """ + return [ + tokenize_caption( + c, + self.vlm_tokenizer, + is_video=is_video, + use_system_prompt=use_system_prompt, + system_prompt=system_prompt, + ) + for c in captions + ] + + @torch.no_grad() + def tokenize_text( + self, + text: str | list[str], + *, + use_system_prompt: bool | None = None, + system_prompt: str | None = None, + is_video: bool = False, + pad_token_id: int | None = None, + device: torch.device | str | None = None, + ) -> torch.Tensor: + """Tokenize one or more text prompts into a ``[B, T]`` long tensor. + + Wraps each prompt in the VLM's chat template via + :func:`tokenize_caption` (the same helper used by + :meth:`_get_inference_text_tokens` during conditional sampling), so + the resulting ids match what the model sees during training / + inference (e.g. ``<|im_start|>user\\n…<|im_end|>\\n<|im_start|>assistant\\n`` + for Qwen3-style chat models). + + When multiple prompts of different lengths are supplied, the result + is right-padded with ``pad_token_id``. Right-padding is the natural + choice for prefill into :meth:`generate_reasoner_text`, which reads + the last position's logits to predict the first new token; for that + to be meaningful, callers should normally pass either a single + prompt or a list of equal-length prompts. + + Args: + text: A single string or a list of strings, one per batch item. + use_system_prompt: Override for ``self.vlm_config.use_system_prompt``. + When ``None``, falls back to the VLM config flag. + system_prompt: When supplied, this exact string is used as the + system prompt and overrides ``use_system_prompt`` / + ``is_video``. + is_video: Selects the video vs image default system prompt + when ``use_system_prompt=True`` and no explicit + ``system_prompt`` is given. + pad_token_id: Pad id for right-padding. Defaults to + ``self.vlm_tokenizer.pad_token_id`` when set, else + ``self.llm_special_tokens["eos_token_id"]``, else ``0``. + device: Optional device for the returned tensor. + + Returns: + A ``torch.long`` tensor of shape ``[B, T_max]`` ready to be fed + into :meth:`generate_reasoner_text` or any other token-driven + entry point. + """ + prompts: list[str] = [text] if isinstance(text, str) else list(text) + if len(prompts) == 0: + raise ValueError("tokenize_text requires at least one prompt.") + resolved_use_system_prompt: bool = ( + bool(getattr(self.vlm_config, "use_system_prompt", False)) + if use_system_prompt is None + else use_system_prompt + ) + + token_lists = self._tokenize_captions( + prompts, + use_system_prompt=resolved_use_system_prompt, + system_prompt=system_prompt, + is_video=is_video, + ) + + if pad_token_id is None: + candidate = getattr(self.vlm_tokenizer, "pad_token_id", None) + if candidate is None: + candidate = self.llm_special_tokens.get("eos_token_id") + pad_id: int = int(candidate) if candidate is not None else 0 + else: + pad_id = int(pad_token_id) + + max_len = max(len(ids) for ids in token_lists) + padded = [ids + [pad_id] * (max_len - len(ids)) for ids in token_lists] + out = torch.tensor(padded, dtype=torch.long) + if device is not None: + out = out.to(device) + return out + + @torch.no_grad() + def detokenize_text( + self, + token_ids: torch.Tensor | list[int] | list[list[int]], + *, + skip_special_tokens: bool = True, + ) -> str | list[str]: + """Decode token ids produced by :meth:`generate_reasoner_text` back to text. + + Accepts the natural output shapes: + - 1D tensor / ``list[int]`` → returns a single ``str``. + - 2D tensor / ``list[list[int]]`` → returns ``list[str]`` (one + per row). + + Args: + token_ids: Ids to decode. + skip_special_tokens: Forwarded to + ``self.vlm_tokenizer.decode``; when ``True`` (default), + strips chat-template / vision boundary specials so the + returned string contains only model-generated content. + """ + # Normalize to nested Python lists. Tensors are converted via + # ``.tolist()`` (1D -> list[int]; 2D -> list[list[int]]); raw lists + # pass through. We use ``Any`` here to keep the body cleanly typed + # against ``list`` without the type-checker pessimistically widening + # to the input union after the isinstance narrow. + raw: Any = token_ids + if hasattr(raw, "tolist"): + if hasattr(raw, "dim") and raw.dim() not in (1, 2): + raise ValueError(f"token_ids tensor must be 1D or 2D, got shape {tuple(raw.shape)}") + ids_list: list = raw.tolist() + elif isinstance(raw, list): + ids_list = raw + else: + raise TypeError(f"Unsupported token_ids type: {type(token_ids)}") + + if len(ids_list) == 0: + return "" + + decode = self.vlm_tokenizer.decode + if isinstance(ids_list[0], list): + return [decode(row, skip_special_tokens=skip_special_tokens) for row in ids_list] + return decode(ids_list, skip_special_tokens=skip_special_tokens) + + def _broadcast_outputs_to_parallel_groups(self, outputs: list[str]) -> list[str]: + """Pin ``outputs`` to the lowest-numbered rank's value within each CP / CFGP group. + + Under context parallelism (CP) or CFG parallelism (CFGP), every + rank within a parallel group is processing the same logical + batch — CP splits the context dimension across ranks, CFGP splits + the cfg/uncfg pair. In a deterministic AR decode (e.g. greedy) + the per-rank token streams should agree exactly, but numerical + noise (kernel selection, FSDP all-gather ordering, RNG state in + the sampling controls, EMA scope) can let those ranks emit + token streams that differ at one or two greedy-tied positions. + The public contract for ``generate_reasoner_text`` is "list[str] + in, list[str] out" with a single canonical response per prompt + across the parallel group, so we resolve any divergence by + broadcasting rank 0's strings to every other rank within the + group via :func:`torch.distributed.broadcast_object_list`. + + Order matches the seed-broadcast pattern used elsewhere in this + class (CP first, then CFGP) so the final outputs are consistent + across both groups when both are enabled. No-op when neither CP + nor CFGP is enabled (the typical case for pure-FSDP runs) — and + also when ``parallel_dims`` is unset, e.g. CPU-only smoke tests. + """ + if self.parallel_dims is None: + return outputs + if self.parallel_dims.cp_enabled and self.parallel_dims.cp_mesh is not None: + cp_group = self.parallel_dims.cp_mesh.get_group() + cp_bucket: list[Any] = [outputs] + dist.broadcast_object_list(cp_bucket, group=cp_group, group_src=0) + outputs = cp_bucket[0] + if self.parallel_dims.cfgp_enabled and self.parallel_dims.cfgp_mesh is not None: + cfgp_group = self.parallel_dims.cfgp_mesh.get_group() + cfgp_bucket: list[Any] = [outputs] + dist.broadcast_object_list(cfgp_bucket, group=cfgp_group, group_src=0) + outputs = cfgp_bucket[0] + return outputs + + @torch.no_grad() + def generate_reasoner_text( + self, + inputs: list[str], + max_new_tokens: int, + *, + images: list[Any] | None = None, + videos: list[Any] | None = None, + prompt_builder: Callable[[str], list[dict[str, Any]]] | None = None, + do_sample: bool = False, + temperature: float | None = 1.0, + top_k: int | None = None, + top_p: float | None = None, + repetition_penalty: float = 1.0, + presence_penalty: float = 0.0, + seed: int | None = None, + ) -> list[str]: + """Autoregressively generate text using only the reasoner tower. + + High-level prompt-driven entry point: for each input prompt this + method (a) builds a chat-style messages list via ``prompt_builder`` + (or wraps the prompt as a single user message when no callback is + given), (b) tokenizes it — text-only via :meth:`tokenize_text`, or + multimodal via ``self.vlm_processor.apply_chat_template`` when + ``images`` or ``videos`` is supplied (the image path lowers the chat + into ``input_ids``, ``attention_mask``, ``pixel_values``, and + ``image_grid_thw``; the video path yields ``pixel_values_videos`` and + ``video_grid_thw`` instead), (c) + runs the reasoner-only AR decode loop through + ``self.net.generate_reasoner_text`` (the lower-level token-driven + pass-through that delegates to ``unified_mot._impl_generate_reasoner_text``), + and (d) decodes via :meth:`detokenize_text`. Returns the list of + generated strings (same length as ``inputs``). Empty / + whitespace-only prompts pass through unchanged; an empty + generation falls back to the original prompt so downstream + tokenization stays well-defined. + + Per-prompt iteration is deliberate: the reasoner AR loop's + ``attention_mask`` is only consumed by the multimodal prefill + (for ``get_rope_index``) and not by the dense attention on the + decode side, so right-padding different-length prompts in a + single batched call would let the shorter prompt's prefill + predict from a pad token at position ``T-1``, producing garbage + continuations. Callers needing batched, same-length token-level + decoding can drive ``self.net.generate_reasoner_text(input_ids=...)`` + directly. + + Only the und-pathway weights — those WITHOUT the ``_moe_gen`` + suffix — plus ``embed_tokens`` / ``norm`` / ``lm_head`` (and the + Qwen3-VL ``visual`` tower for the image-conditioned path) + participate; the generation pathway and all VFM-level multimodal + embedders / heads are bypassed. + + ``eos_token_id`` and ``pad_token_id`` are resolved internally and + not exposed as parameters. EOS comes from + ``self.llm_special_tokens["eos_token_id"]`` (so generation + terminates on the assistant-turn boundary natural to the live + VLM). Pad mirrors the resolution used by :meth:`tokenize_text`: + the VLM tokenizer's ``pad_token_id`` if set, else falling back + to the EOS id (which is harmless here because the prompt-driven + loop runs each prompt at ``B=1``, so there is never a shorter + sequence to pad after EOS). + + For EMA inference, wrap the call in ``self.ema_scope()`` as with + the other generation entry points:: + + with model.ema_scope(): + out = model.generate_reasoner_text(prompts, ...) + + Args: + inputs: List of raw prompt strings. + max_new_tokens: Decode budget per prompt. + images: Optional per-prompt conditioning images. Must have + the same length as ``inputs`` when provided. When + non-``None``, each prompt is routed through the Qwen3-VL + multimodal chat template — ``pixel_values`` / + ``image_grid_thw`` / ``attention_mask`` are computed + internally from this list and the VLM processor. Each + entry is forwarded verbatim into + ``processor.apply_chat_template``, so any input it + accepts works (file path ``str``, ``PIL.Image.Image``, + ``np.ndarray``, or a CHW / HWC tensor). + videos: Optional per-prompt conditioning videos (mutually + exclusive with ``images``). Each entry must be a + ``{"frames": [...PIL...], "fps": float}`` payload + (pre-decoded by the caller, e.g. via + ``_decode_reasoner_video``). The frames list and fps are + forwarded into the ``{"type": "video", "video": frames, + "fps": fps}`` chat block so the processor produces + ``pixel_values_videos`` / ``video_grid_thw``. + prompt_builder: Optional callback that maps a raw prompt + string to a chat-style messages list (e.g. + :func:`cosmos_framework.model.generator.upsampler.prompts.build_messages` + for V4.2 caption upsampling). When ``None``, prompts are + wrapped as ``[{"role": "user", "content": prompt}]`` with + no system message. + do_sample, temperature, top_k, top_p: Sampling controls. + Greedy (the default) is recommended for deterministic + upsampling across CP/CFGP ranks; see "Distributed + semantics" below for how non-greedy or numerically-noisy + drift between ranks within a parallel group is reconciled. + repetition_penalty: Multiplicative penalty applied to logits + at vocab positions already seen in this sample's history + (prompt + everything generated so far). ``>1.0`` + discourages repetition, ``<1.0`` encourages it, ``1.0`` + (default) is identity. Forwarded to + :func:`unified_mot._impl_generate_reasoner_text`. + presence_penalty: Additive penalty subtracted from logits at + vocab positions already seen in this sample's history. + ``>0`` discourages reuse, ``<0`` encourages it, ``0`` + (default) is identity. Forwarded to + :func:`unified_mot._impl_generate_reasoner_text`. + seed: Optional integer seed for the sampling RNG; forwarded + verbatim to + :func:`unified_mot._impl_generate_reasoner_text`, which + allocates a device-local ``torch.Generator``, seeds it + once with ``manual_seed(seed)``, and threads it into + every ``torch.multinomial`` draw. ``None`` (default) + consumes the device's default RNG and is bit-identical + to the pre-seed behavior. Greedy decoding doesn't read + the generator, so the value has no effect when + ``do_sample=False``. Under CP/CFGP, the same ``seed`` + must be passed on every rank within a parallel group + for the per-prompt loop to produce identical token + streams pre-broadcast; the post-decode + :meth:`_broadcast_outputs_to_parallel_groups` pin masks + divergences either way, but matching seeds keep the + ranks doing the same work. + + Returns: + ``list[str]`` of generated text (same length as ``inputs``). + + Distributed semantics: + When CP or CFGP is enabled, every rank within a parallel + group is processing the same logical batch, and is + *expected* to produce identical strings. Before returning, + this method pins ``outputs`` to the lowest-numbered rank's + value within each group via + :func:`torch.distributed.broadcast_object_list` (CP first, + then CFGP — matching the seed-broadcast ordering used + elsewhere in this class). This guarantees a single + canonical ``list[str]`` per call even when numerical noise + (kernel selection, RNG, FSDP all-gather ordering, EMA scope) + makes the per-rank token streams disagree at greedy-tied + positions. No-op when neither CP nor CFGP is enabled. See + :meth:`_broadcast_outputs_to_parallel_groups` for the + implementation. + + Raises: + ValueError: If ``images`` length does not match ``inputs`` + length, or if ``videos`` length does not match ``inputs`` + length. Also raised if both ``images`` and ``videos`` are + supplied simultaneously (only one medium is allowed per + call). + RuntimeError: If ``images`` or ``videos`` is supplied but the + live VLM processor does not implement + ``apply_chat_template`` (i.e., the VLM is configured as + text-only). + """ + # Decide whether the multimodal flow is in play, and validate the + # image-list contract here so the failure happens before any + # decoding work — far easier to debug than a downstream + # ``apply_chat_template`` error. + if images is not None and videos is not None: + raise ValueError( + "generate_reasoner_text conditions on one medium at a time: pass `images` OR `videos`, not both." + ) + use_image = images is not None + use_video = videos is not None + use_multimodal = use_image or use_video + media = images if use_image else videos + if use_multimodal: + assert media is not None # narrowed by `use_multimodal` + if len(media) != len(inputs): + raise ValueError( + f"generate_reasoner_text: media length ({len(media)}) " + f"must equal `inputs` length ({len(inputs)}) for the " + "vision-conditioned flow." + ) + if not callable(getattr(self.vlm_processor, "apply_chat_template", None)): + raise RuntimeError( + "generate_reasoner_text(images=... / videos=...) requires a multimodal " + "VLM processor (e.g. Qwen3VLProcessor) but the live processor " + f"{type(self.vlm_processor).__name__!r} does not implement " + "apply_chat_template — the live VLM is configured as text-only." + ) + # Resolve EOS / pad ids internally so callers don't have to know + # about VLM-specific id wiring. EOS comes from the cached VLM + # special-tokens dict (set in ``set_up_tokenizers``); pad mirrors + # the resolution used by ``tokenize_text`` (vlm_tokenizer.pad_token_id, + # falling back to EOS when the tokenizer has no dedicated pad). + eos_raw = self.llm_special_tokens.get("eos_token_id") + eos_id: int | None = int(eos_raw) if eos_raw is not None else None + pad_raw = getattr(self.vlm_tokenizer, "pad_token_id", None) + if pad_raw is None: + pad_raw = eos_raw + pad_id: int | None = int(pad_raw) if pad_raw is not None else None + device = self.tensor_kwargs.get("device", "cuda") + + outputs: list[str] = [] + for idx, prompt in enumerate(inputs): + # Empty / whitespace-only prompts pass through unchanged so + # callers that drop them downstream don't have to special-case + # the response shape. + if not prompt or not prompt.strip(): + outputs.append(prompt) + continue + + # The prompt_builder callback turns the raw prompt into a chat- + # style messages list (e.g. ``build_messages`` for the V4.2 + # caption upsampler templates). Default: a single user-role + # message with no system prompt. Annotate explicitly to + # ``list[dict[str, Any]]`` so the multimodal branch's + # mixed-type content (str + list[dict]) does not get narrowed + # to ``dict[str, str]`` by the no-callback default. + messages: list[dict[str, Any]] + if prompt_builder is not None: + messages = prompt_builder(prompt) + else: + messages = [{"role": "user", "content": prompt}] + + if use_multimodal: + assert media is not None # narrowed by `use_multimodal` + last_user = messages[-1] + last_text = last_user["content"] if isinstance(last_user.get("content"), str) else "" + if use_video: + media_item: dict[str, Any] = { + "type": "video", + "video": media[idx]["frames"], + "fps": media[idx]["fps"], + } + else: + media_item = {"type": "image", "image": media[idx]} + multimodal_messages = list(messages[:-1]) + multimodal_messages.append( + { + "role": "user", + "content": [media_item, {"type": "text", "text": last_text}], + } + ) + processor_inputs = self.vlm_processor.apply_chat_template( + multimodal_messages, + tokenize=True, + add_generation_prompt=True, + return_tensors="pt", + ) + inner_input_ids = processor_inputs["input_ids"].to(device).unsqueeze(0) + inner_attention_mask = processor_inputs["attention_mask"].to(device).unsqueeze(0) + if use_video: + inner_pixel_values_videos = processor_inputs["pixel_values_videos"].to(device) + inner_video_grid_thw = processor_inputs["video_grid_thw"].to(device) + out_ids = self.net.generate_reasoner_text( + input_ids=inner_input_ids, + max_new_tokens=max_new_tokens, + pixel_values_videos=inner_pixel_values_videos, + video_grid_thw=inner_video_grid_thw, + attention_mask=inner_attention_mask, + eos_token_id=eos_id, + pad_token_id=pad_id, + do_sample=do_sample, + temperature=temperature if temperature is not None else 1.0, + top_k=top_k, + top_p=top_p, + repetition_penalty=repetition_penalty, + presence_penalty=presence_penalty, + seed=seed, + return_only_new_tokens=True, + ) + else: + inner_pixel_values = processor_inputs["pixel_values"].to(device) # [N_patches,C,H,W] + inner_image_grid_thw = processor_inputs["image_grid_thw"].to(device) # [num_images,3] + out_ids = self.net.generate_reasoner_text( + input_ids=inner_input_ids, + max_new_tokens=max_new_tokens, + pixel_values=inner_pixel_values, + image_grid_thw=inner_image_grid_thw, + attention_mask=inner_attention_mask, + eos_token_id=eos_id, + pad_token_id=pad_id, + do_sample=do_sample, + temperature=temperature if temperature is not None else 1.0, + top_k=top_k, + top_p=top_p, + repetition_penalty=repetition_penalty, + presence_penalty=presence_penalty, + seed=seed, + return_only_new_tokens=True, + ) + else: + # Text-only path. Pull the system prompt (if any) and + # the last user message text out of the messages list, + # then route through ``tokenize_text`` to get the chat- + # templated prompt ids. Falls back to the raw prompt if + # the callback returned a non-string user content. + system_prompt: str | None = None + user_text: str = prompt + if messages: + first = messages[0] + if first.get("role") == "system" and isinstance(first.get("content"), str): + system_prompt = first["content"] + last_user = messages[-1] + if last_user.get("role") == "user" and isinstance(last_user.get("content"), str): + user_text = last_user["content"] + prompt_ids = self.tokenize_text( + user_text, + system_prompt=system_prompt, + device=device, + ) + out_ids = self.net.generate_reasoner_text( + input_ids=prompt_ids, + max_new_tokens=max_new_tokens, + eos_token_id=eos_id, + pad_token_id=pad_id, + do_sample=do_sample, + temperature=temperature if temperature is not None else 1.0, + top_k=top_k, + top_p=top_p, + repetition_penalty=repetition_penalty, + presence_penalty=presence_penalty, + seed=seed, + return_only_new_tokens=True, + ) + decoded = self.detokenize_text(out_ids, skip_special_tokens=True) + assert isinstance(decoded, list) and len(decoded) == 1, ( + f"detokenize_text returned unexpected shape: {type(decoded)}" + ) + result = decoded[0].strip() + # If the reasoner returns an empty string (rare), keep the + # original prompt so downstream tokenization stays well-defined. + outputs.append(result if result else prompt) + + # Reconcile any per-rank divergence within CP/CFGP groups so + # callers see a single canonical ``list[str]`` per call. No-op + # when neither CP nor CFGP is enabled. See + # :meth:`_broadcast_outputs_to_parallel_groups` for the contract. + return self._broadcast_outputs_to_parallel_groups(outputs) + + @torch.no_grad() + def upsample_captions( + self, + captions: list[str], + max_new_tokens: int, + *, + task: str = "t2v", + aspect_ratio: str, + resolution_w: int, + resolution_h: int, + fps: int | None = None, + duration_secs: int | None = None, + images: list[Any] | None = None, + do_sample: bool = False, + temperature: float | None = 1.0, + top_k: int | None = None, + top_p: float | None = None, + repetition_penalty: float = 1.0, + presence_penalty: float = 0.0, + seed: int | None = None, + ) -> list[str]: + """Expand each caption via the reasoner tower's autoregressive loop. + + Thin task-aware wrapper over :meth:`generate_reasoner_text`'s + prompt-driven branch. The only thing this method adds on top of + the generic per-prompt loop is the V4.2 chat-template injection: + each caption is wrapped via + :func:`cosmos_framework.model.generator.upsampler.prompts.build_messages` + (which returns ``[system, user]`` with the user content embedding + the caption inside the canonical V4.2 template — instructions, + task constraints, and output JSON schema for the requested task). + + Two flows share this entry point: + + - **Text-only** (``task in {"t2v", "t2i"}``, or ``task="i2v"`` with + ``images=None``): the user content is fed via :meth:`tokenize_text` + (chat template ``<|im_start|>system\\n…<|im_end|>\\n<|im_start|>user\\n…<|im_end|>\\n<|im_start|>assistant\\n``) + and the reasoner-only AR loop runs on text tokens alone. + - **Image-conditioned** (``task="i2v"`` with one image per caption): + the user content becomes a Qwen3-VL multimodal block — + ``[{"type": "image", "image": images[i]}, {"type": "text", "text": user_text}]`` + — which ``self.vlm_processor.apply_chat_template`` lowers into + ``input_ids`` (with image-placeholder tokens at the right + positions), ``attention_mask``, ``pixel_values``, and + ``image_grid_thw``. All four route through + ``unified_mot._impl_generate_reasoner_text``'s multimodal prefill + (visual encoder → ``masked_scatter`` of image embeddings → mrope + position ids) before kicking off the AR decode loop. + + Each raw reasoner output is post-processed by + :func:`cosmos_framework.model.generator.upsampler.prompts.clean_response` + before being returned. The cleaner strips + ```` / ```` / ```` / etc. reasoning + blocks and any prose preamble that appears before the + ``` ```json ``` `` fence. For canonical V4.2 SFT outputs + (cosmos3 upsampler 8B / 32B), which already emit clean fenced + JSON with no reasoning markers, this is a documented + byte-for-byte no-op; for reasoning-style backbones + (Qwen3-reasoning, DeepSeek-R1, etc.) it removes the chatter so + the downstream JSON fence is the first content in the returned + string. ``clean_response`` is idempotent and NEVER raises. + + Defensive fallback: if the cleaner leaves an empty / + whitespace-only string behind — e.g. the raw output was + entirely a stripped-out thinking block with no JSON body — the + original caption is returned in its place so downstream + tokenization stays well-defined. This extends the same + safety net :meth:`generate_reasoner_text` already provides + for empty model output (line ~3550) across the + post-processing stage; without it, ``clean_response`` could + collapse a non-empty reasoner output to ``""`` and that empty + string would propagate into + ``data_batch[self.input_caption_key]`` at the call site in + :meth:`generate_samples_from_batch`. + + Telemetry: a single rank-local summary log line is emitted + per call ONLY when at least one sample required stripping or + triggered the empty-cleaned fallback; on the canonical + all-clean path the method is silent. See + :meth:`generate_reasoner_text` for the underlying per-prompt + loop contract (image-list validation, EMA scope, etc.). + + Args: + captions: Raw input captions (typically + ``data_batch[self.input_caption_key]``). + task: Canonical upsampler task — ``"t2v"`` (text-to-video, + default), ``"t2i"`` (text-to-image), or ``"i2v"`` + (image-to-video). Selects which V4.2 template + ``build_messages`` returns. + aspect_ratio: Output clip aspect ratio in comma form, + e.g. ``"1,1"``, ``"16,9"``, ``"9,16"``, ``"4,3"``, + ``"3,4"``. Injected into the ``aspect_ratio`` + constraint of every V4.2 template (all three tasks). + Required. + resolution_w: Output frame width in pixels. Injected into + the ``resolution`` constraint of every V4.2 template + (all three tasks). Required. + resolution_h: Output frame height in pixels. Counterpart + to ``resolution_w``. Required for all tasks. + fps: Target frames-per-second for the generated clip. + Required for the video tasks (``"t2v"``, ``"i2v"``) + and must be ``None`` for ``"t2i"`` — the underlying + :func:`cosmos_framework.model.generator.upsampler.prompts.build_user_text` + raises ``ValueError`` if a video task is missing + ``fps`` or ``duration_secs``. + duration_secs: Clip duration in whole seconds (rendered as + ``M:SS`` inside the template). Same required/forbidden + contract as ``fps``. + images: Optional per-caption conditioning images for the + image-conditioned (``task="i2v"``) flow. Must have the + same length as ``captions`` when provided. Each entry is + forwarded verbatim into the Qwen3-VL multimodal chat + template, so any input the underlying + ``processor.apply_chat_template`` accepts works (file + path ``str``, ``PIL.Image.Image``, ``np.ndarray``, or + a CHW / HWC tensor). Required for ``task="i2v"`` and + ignored (with a warning) for the text-only tasks. + max_new_tokens: Per-caption decode budget. Sized to comfortably + fit a one-paragraph expanded prompt. + do_sample, temperature, top_k, top_p: Sampling controls, + forwarded to :meth:`generate_reasoner_text`. Greedy + decoding (the default) is recommended so upsampling is + deterministic across CP/CFGP ranks. + repetition_penalty: Multiplicative penalty applied to logits + at vocab positions already seen in this caption's + history (prompt + everything generated so far). + ``>1.0`` discourages verbatim repetition, ``<1.0`` + encourages it, ``1.0`` (default) is identity and adds + zero overhead to the AR loop. Forwarded verbatim to + :meth:`generate_reasoner_text` and through to + :func:`unified_mot._impl_generate_reasoner_text`. + presence_penalty: Additive penalty subtracted from logits + at vocab positions already seen in this caption's + history (binary presence, not frequency). ``>0`` + discourages reuse, ``<0`` encourages it, ``0`` + (default) is identity. Same forwarding chain as + ``repetition_penalty``. + seed: Optional integer seed for the sampling RNG. + Forwarded verbatim to :meth:`generate_reasoner_text` + and through to + :func:`unified_mot._impl_generate_reasoner_text`, + which seeds a fresh device-local ``torch.Generator`` + once and threads it into every ``torch.multinomial`` + draw. ``None`` (default) consumes the device's + default RNG and is bit-identical to the pre-seed + behavior. Greedy decoding doesn't read the + generator, so the value has no effect when + ``do_sample=False``. + + Returns: + A list of post-processed upsampled captions, same length as + ``captions``. + + Raises: + ValueError: If ``images`` length does not match ``captions`` + length (raised inside :meth:`generate_reasoner_text`). + RuntimeError: If the multimodal flow is requested but the + live VLM is LLM-only (raised inside + :meth:`generate_reasoner_text`). + """ + # Text-only tasks ignore conditioning images; warn loudly so the + # caller doesn't mistakenly assume the image affected upsampling. + if task != "i2v" and images is not None: + log.warning(f"upsample_captions(task={task!r}) received `images` but only task='i2v' uses them; ignoring.") + images = None + + def _builder(description: str) -> list[dict[str, Any]]: + return build_messages( + task=task, + description=description, + aspect_ratio=aspect_ratio, + resolution_w=resolution_w, + resolution_h=resolution_h, + fps=fps, + duration_secs=duration_secs, + ) + + raw_outputs = self.generate_reasoner_text( + captions, + max_new_tokens=max_new_tokens, + prompt_builder=_builder, + images=images, + do_sample=do_sample, + temperature=temperature, + top_k=top_k, + top_p=top_p, + repetition_penalty=repetition_penalty, + presence_penalty=presence_penalty, + seed=seed, + ) + + # Defensive post-processing: strip thinking-style markers from + # the raw reasoner output via ``clean_response``. This is a + # documented byte-for-byte no-op on canonical V4.2 SFT outputs + # (which emit clean fenced JSON with no reasoning markers) and + # only fires for reasoning-style backbones. If the cleaner + # collapses a non-empty reasoner output to an empty / + # whitespace-only string (e.g., the raw was entirely a + # ``...`` block with no JSON body), fall back + # to the original caption so downstream tokenization stays + # well-defined — without this, an empty string would propagate + # into ``data_batch[self.input_caption_key]`` at the call site. + cleaned_outputs: list[str] = [] + n_stripped = 0 + for raw, original in zip(raw_outputs, captions): + cleaned_text, clean_info = clean_response(raw) + if not clean_info["was_clean"]: + n_stripped += 1 + if not cleaned_text.strip(): + cleaned_text = original + + # Stamp the actual generation ``duration`` onto the upsampled + # JSON object using the duration_secs argument. Only done for + # T2V and I2V tasks. + if duration_secs is not None: + cleaned_text = cleaned_text.removeprefix("```json").removesuffix("```").strip() + obj = json.loads(cleaned_text) + assert isinstance(obj, dict), f"JSON parsing failed with error: {type(obj)}" + obj["duration"] = f"{duration_secs}s" + cleaned_text = json.dumps(obj) + + cleaned_outputs.append(cleaned_text) + + # Stay silent on the canonical all-clean path; only emit + # telemetry when something actually happened. Logged per-rank + # to match the surrounding upsampling logs in + # :meth:`generate_samples_from_batch` (line ~2218). + if n_stripped: + log.info( + f"upsample_captions(task={task!r}, n={len(raw_outputs)}): thinking-stripped={n_stripped}", + rank0_only=False, + ) + + return cleaned_outputs + + @torch.no_grad() + def encode(self, state: torch.Tensor) -> torch.Tensor: + return self.tokenizer_vision_gen.encode(state) + + @torch.no_grad() + def decode(self, latent: torch.Tensor) -> torch.Tensor: + return self.tokenizer_vision_gen.decode(latent) + + @torch.no_grad() + def encode_sound(self, waveform: torch.Tensor) -> torch.Tensor: + """Encode audio waveform into latent tokens. + + Args: + waveform: Audio tensor of shape (C, N). A batch dim is added/removed + internally since AVAE expects (B, C, N). + Mono audio is duplicated to stereo if the tokenizer expects 2 channels. + """ + assert self.tokenizer_sound_gen is not None, "Sound tokenizer not initialized" + # Ensure correct number of channels (AVAE typically expects stereo) + expected_channels = self.tokenizer_sound_gen.audio_channels + if waveform.shape[0] == 1 and expected_channels == 2: + waveform = waveform.repeat(2, 1) # mono → stereo + elif waveform.shape[0] > expected_channels: + waveform = waveform[:expected_channels] + # AVAE expects (B, C, N) + latent = self.tokenizer_sound_gen.encode(waveform.unsqueeze(0)) # [1,sound_channels,T_sound] + return latent.squeeze(0) # [sound_channels,T_sound] + + @torch.no_grad() + def decode_sound(self, latent: torch.Tensor) -> torch.Tensor: + """Decode sound latent tokens back to waveform. + + Args: + latent: Sound latent tensor of shape (C, T). A batch dim is added/removed + internally since AVAE expects (B, C, T). + """ + assert self.tokenizer_sound_gen is not None, "Sound tokenizer not initialized" + # AVAE expects (B, C, T) + waveform = self.tokenizer_sound_gen.decode(latent.unsqueeze(0)) # [1,audio_channels,N_samples] + return waveform.squeeze(0) # [audio_channels,N_samples] + + def _get_sound_fps_for_rope(self) -> float: + """Compute the sound FPS to pass to RoPE for temporal alignment with video. + + Returns the sound tokenizer's latent rate (e.g., 25 Hz for 48kHz/1920 hop). + This is passed as input_fps to the sound RoPE's generate_embeddings(), where + the FPS modulation formula aligns sound indices with video indices. + """ + return float(self.config.sound_latent_fps) + + def get_video_height_width(self) -> Tuple[int, int]: + return VIDEO_RES_SIZE_INFO[self.config.resolution]["9,16"] + + def get_video_latent_height_width(self) -> Tuple[int, int]: + height, width = VIDEO_RES_SIZE_INFO[self.config.resolution]["9,16"] + return ( + height // self.tokenizer_vision_gen.spatial_compression_factor, + width // self.tokenizer_vision_gen.spatial_compression_factor, + ) + + def get_num_video_latent_frames(self) -> int: + return self.config.state_t + + @contextmanager + def ema_scope(self, context=None, is_cpu=False): + if self.config.ema.enabled: + # https://github.com/pytorch/pytorch/issues/144289 + for module in self.net.modules(): + if isinstance(module, FSDPModule): + module.reshard() + self.net_ema_worker.cache(self.net.parameters(), is_cpu=is_cpu) + self.net_ema_worker.copy_to(src_model=self.net_ema, tgt_model=self.net) + if context is not None: + log.info(f"{context}: Switched to EMA weights") + try: + yield None + finally: + if self.config.ema.enabled: + for module in self.net.modules(): + if isinstance(module, FSDPModule): + module.reshard() + self.net_ema_worker.restore(self.net.parameters()) + if context is not None: + log.info(f"{context}: Restored training weights") + + def add_lora( + self, + network: torch.nn.Module, + lora_rank: int, + lora_alpha: int, + lora_target_modules: str, + ) -> torch.nn.Module: + """Pre-FSDP LoRA injection — see :func:`inject_lora_pre_fsdp` for details.""" + from cosmos_framework.utils.generator.lora import inject_lora_pre_fsdp + + self.lora_alpha = lora_alpha + return inject_lora_pre_fsdp( + network, + lora_rank=lora_rank, + lora_alpha=lora_alpha, + lora_target_modules=lora_target_modules, + ) + + def _init_lora_weights_post_materialization(self, network: torch.nn.Module) -> None: + """Post-materialization LoRA init — see :func:`init_lora_weights_post_materialization`.""" + from cosmos_framework.utils.generator.lora import init_lora_weights_post_materialization + + init_lora_weights_post_materialization(network) + + +def _broadcast_seed(seed: list[int], group: dist.ProcessGroup, rank: int) -> list[int]: + if rank == 0: + seed_tensor = torch.tensor(seed, dtype=torch.int64, device=DEVICE) # [len(seed)] + else: + seed_tensor = torch.zeros(len(seed), dtype=torch.int64, device=DEVICE) # [len(seed)] + + dist.broadcast(seed_tensor, group=group, group_src=0) + return seed_tensor.tolist() + + +def _is_reasoner_state_dict_key(key: str) -> bool: + """Return True for und/reasoner-tower weights nested under ``language_model``. + + Reasoner weights are the understanding-pathway parameters in the MoT + language tower: ``embed_tokens``, ``norm``, ``lm_head``, ``visual``, and + every layer weight *without* the ``_moe_gen`` suffix. Generation-pathway + duplicates (``*_moe_gen``) and all non-``language_model`` VFM heads are + excluded from this predicate. + """ + key = key.replace("_orig_mod.", "").replace("_checkpoint_wrapped_module.", "") + if not key.startswith("language_model."): + return False + return "_moe_gen" not in key diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/generator/utils/data_and_condition.py b/releases/bridge-native-v3/code/cosmos_framework/model/generator/utils/data_and_condition.py new file mode 100644 index 0000000000000000000000000000000000000000..49c960251fcb4c715f7de9f98fe1ec9e4be281c1 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/generator/utils/data_and_condition.py @@ -0,0 +1,182 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +""" +Unified data and condition interface where we save the tokenized states and/or +noised latent states for diffusion/flow-matching training. +Used for the VFM generation model. +""" + +from dataclasses import dataclass + +import torch + + +@dataclass(slots=True) +class GenerationDataClean: + """ + Container for tokenized states and conditioning info (clean states) + for the multi-modal (vision, sound, action) MoT training. + Used for the VFM generation model. + """ + + batch_size: int + # Vision (list of per-sample tensors) + is_image_batch: bool + raw_state_vision: list[torch.Tensor] | None = None # raw state in pixel space + x0_tokens_vision: list[torch.Tensor] | None = None # tokenized latent state + fps_vision: torch.Tensor | None = None + temporal_positions_vision: list[torch.Tensor] | None = None # one [T] tensor per vision latent item + + # Image editing: number of vision items per sample. + # When set, x0_tokens_vision is a flat list of individually-encoded image latents + # (e.g. [src1, tgt1, src2, tgt2, ...]) and this field records how many items belong + # to each sample (e.g. [2, 2, ...]). None for standard T2I/T2V (one item per sample). + num_vision_items_per_sample: list[int] | None = None + + # Audio (Sound) + raw_state_sound: torch.Tensor | None = None + x0_tokens_sound: torch.Tensor | None = None + fps_sound: torch.Tensor | None = None + + # Action (dense list of per-sample tensors, only action-having samples) + raw_state_action: list[torch.Tensor] | None = None + x0_tokens_action: list[torch.Tensor] | None = None + fps_action: torch.Tensor | None = None + action_domain_id: list[torch.Tensor] | None = None # per-sample domain IDs, None when no action samples + raw_action_dim: list[torch.Tensor] | None = None # raw action dimension, used adding masks to loss calculation + # Dense per-action-sample gate for the residual expert. Values are in + # [0,1] and aligned with x0_tokens_action; absent means exact base bypass. + action_residual_gate: list[torch.Tensor] | None = None + + # Optional per-sample low-dimensional state used as causal prefix tokens. + proprio_condition: list[torch.Tensor] | None = None + + # Multi-control transfer: per-sample list of per-control weights. + # Shape: [num_samples], each element is a list of floats (one per control stream). + # None for non-transfer or single-control samples. + control_weights: list[list[float]] | None = None + + +@dataclass(slots=True) +class GenerationDataNoised: + """Container for states after noise addition, along with other + helper attributes for the flow-matching (gt velocity and noise) + for the multi-modal (vision, sound, action) MoT training. + Used for the VFM generation model. + """ + + batch_size: int + # Vision + epsilon_vision: torch.Tensor # unit gaussian noise tensor + xt_tokens_vision: torch.Tensor # tokens added with noise level t per flow-matching formulation + vt_target_vision: torch.Tensor # gt rectified flow field + sigmas_vision: torch.Tensor | None = None # SNR to add to the vision tokens + + # Audio (Sound) + epsilon_sound: torch.Tensor | None = None + xt_tokens_sound: torch.Tensor | None = None + vt_target_sound: torch.Tensor | None = None + sigmas_sound: torch.Tensor | None = None + + # Action + epsilon_action: torch.Tensor | None = None + xt_tokens_action: torch.Tensor | None = None + vt_target_action: torch.Tensor | None = None + sigmas_action: torch.Tensor | None = None + raw_action_dim: list[torch.Tensor] | None = None # raw action dimension, used adding masks to loss calculation + + +def unwrap_and_densify(raw: list | torch.Tensor | None, to_kwargs: dict) -> list[torch.Tensor] | None: + """Unwrap nested single-element lists and filter ``None`` entries. + + The joint dataloader can produce data as nested single-element lists + (e.g. ``[[t1], [None], [t2]]``). This helper flattens the nesting, + drops ``None`` entries, and moves the remaining tensors to the target + device/dtype. + + Args: + raw: The raw value from ``data_batch``. May be ``None``, a bare + tensor, or a (possibly nested) list of tensors / ``None`` s. + Each tensor in the list has shape ``(...)``. + to_kwargs: Keyword arguments forwarded to ``torch.Tensor.to`` + (e.g. ``{"device": "cuda"}`` or ``{"device": "cuda", "dtype": torch.bfloat16}``). + + Returns: + A dense list of device tensors each with shape ``(...)``, or ``None`` + if the input is ``None`` or every entry is ``None``. + + Examples: + >>> unwrap_and_densify([[t1], [None], [t2]], {"device": "cuda"}) + [t1.cuda(), t2.cuda()] + >>> unwrap_and_densify(None, {"device": "cuda"}) + None + """ + if raw is None: + return None + if not isinstance(raw, list): + return [raw.to(**to_kwargs)] # list of 1 tensor: [(...)] + # Unwrap single-element inner lists: [[t], [None]] -> [t, None] + if len(raw) > 0 and isinstance(raw[0], list): + raw = [item[0] if isinstance(item, list) else item for item in raw] + # Filter None entries and move to device + dense = [x.to(**to_kwargs) for x in raw if x is not None] # list of B tensors: [(...), ...] + return dense if dense else None + + +def _expand_per_sample_to_per_vision_item( + tensor: torch.Tensor, # [B,...] + num_vision_items_per_sample: list[int] | None, +) -> torch.Tensor: # [N_vision_items,...] + """Expand a per-sample tensor to a per-vision-item tensor. + + For image editing, each sample may contribute multiple vision items + (e.g. source + target). This helper repeats each sample's value for + all of its vision items so that downstream indexing by vision-item + position works correctly. + + Args: + tensor: Per-sample tensor of shape ``(N, ...)``. + num_vision_items_per_sample: Number of vision items per sample, + e.g. ``[2, 2, ...]``. If ``None``, the tensor is returned as-is + (standard single-item-per-sample case). + + Returns: + Tensor of shape ``(sum(num_vision_items_per_sample), ...)``, or the + original tensor when ``num_vision_items_per_sample`` is ``None``. + """ + if num_vision_items_per_sample is None: + return tensor # [B,...] + expanded = [] + for sample_idx, num_items in enumerate(num_vision_items_per_sample): + for _ in range( + num_items + ): # torch.stack(tensor[idx].repeat(num_vision_items_per_sample[idx]) for idx in range(len(num_vision_items_per_sample))) + expanded.append(tensor[sample_idx]) # [...] + return torch.stack(expanded) # [N_vision_items,...] + + +def build_dense_sound_schedule( + sequence_plans: list, + x0_tokens_sound: list[torch.Tensor] | None, + timesteps: torch.Tensor, # [B,...] + sigmas: torch.Tensor, # [B,...] +) -> tuple[torch.Tensor | None, torch.Tensor | None]: + """Reindex per-sample schedules to match the dense sound tensor list. + + Sound tensors are dense over samples with ``has_sound=True``, while input + timesteps/sigmas are indexed by original batch position. This helper maps + dense sound entry ``i`` back to its source sample's schedule row. + """ + sound_sample_indices = [i for i, plan in enumerate(sequence_plans) if getattr(plan, "has_sound", False)] + num_sound_tensors = 0 if x0_tokens_sound is None else len(x0_tokens_sound) + assert len(sound_sample_indices) == num_sound_tensors, ( + "Sound tensor count must match sequence plans with has_sound=True. " + f"Got {num_sound_tensors} sound tensor(s) for {len(sound_sample_indices)} sound plan(s)." + ) + + if not sound_sample_indices: + return None, None + + idx_sound = torch.tensor(sound_sample_indices, dtype=torch.long, device=timesteps.device) # [n_sound] + return timesteps[idx_sound], sigmas[idx_sound] # [n_sound,...], [n_sound,...] diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..48fcf2f6e11eb875791958ed83642f6b5e1a4229 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/__init__.py @@ -0,0 +1,52 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Zeva causal-interaction modules required by the released inference path.""" + +from .brief_interaction_trace import BriefInteractionTrace +from .causal_prompt import CausalPromptConfig, CausalPromptEncoder, inject_causal_prompt +from .causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig +from .checkpoint_io import normalize_cte_state_dict +from .cte_losses import CTELossConfig, causal_transition_encoder_loss +from .persistent_interaction_memory import ( + PIMMemoryEntry, + PersistentInteractionMemory, + PersistentInteractionMemoryConfig, +) +from .phase_conditioned_retrieval import PhaseConditionedPIMRetrieval +from .policy_injection import ( + CausalPromptPolicyAdapter, + PolicyInjectionConfig, + PolicyInjectionPrior, + gaussian_prior_nll, +) +from .static_task_context_retrieval import ( + StaticTaskContextRetrievalConfig, + StaticTaskContextRetrievalHead, + bidirectional_supervised_contrastive_loss, + retrieve_static_task_context, +) + +__all__ = [ + "CausalTransitionEncoder", + "CausalTransitionEncoderConfig", + "CTELossConfig", + "causal_transition_encoder_loss", + "BriefInteractionTrace", + "PolicyInjectionConfig", + "PolicyInjectionPrior", + "CausalPromptPolicyAdapter", + "gaussian_prior_nll", + "StaticTaskContextRetrievalConfig", + "StaticTaskContextRetrievalHead", + "bidirectional_supervised_contrastive_loss", + "retrieve_static_task_context", + "PIMMemoryEntry", + "PersistentInteractionMemory", + "PersistentInteractionMemoryConfig", + "PhaseConditionedPIMRetrieval", + "CausalPromptConfig", + "CausalPromptEncoder", + "inject_causal_prompt", + "normalize_cte_state_dict", +] diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_artifacts.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_artifacts.py new file mode 100644 index 0000000000000000000000000000000000000000..fea1d8e56d924d310c3e3d4f34728d61e618a02c --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_artifacts.py @@ -0,0 +1,77 @@ +"""Validation and manifests for fixed-seed PIM attempt artifacts.""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path +from typing import Any, Iterable + + +ATTEMPT_RECORD_VERSION = "zeva_pim_attempt_v1" +CHUNK_RECORD_VERSION = "zeva_pim_chunk_v1" + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def validate_attempt_record(record: dict[str, Any]) -> None: + required = { + "schema_version", + "session_id", + "task", + "attempt_id", + "environment_seed", + "success", + "total_steps", + "chunk_records", + "artifact_npz", + "artifact_sha256", + } + missing = required.difference(record) + if missing: + raise ValueError(f"attempt record is missing fields: {sorted(missing)}") + if record["schema_version"] != ATTEMPT_RECORD_VERSION: + raise ValueError(f"unsupported attempt schema: {record['schema_version']!r}") + if not isinstance(record["session_id"], str) or not record["session_id"]: + raise ValueError("session_id must be a non-empty string") + if not isinstance(record["task"], str) or not record["task"]: + raise ValueError("task must be a non-empty string") + if int(record["attempt_id"]) < 0 or int(record["environment_seed"]) < 0: + raise ValueError("attempt_id and environment_seed must be non-negative") + if not isinstance(record["success"], bool): + raise ValueError("success must be boolean") + if int(record["total_steps"]) < 0: + raise ValueError("total_steps must be non-negative") + chunks = record["chunk_records"] + if not isinstance(chunks, list): + raise ValueError("chunk_records must be a list") + for index, chunk in enumerate(chunks): + if chunk.get("schema_version") != CHUNK_RECORD_VERSION: + raise ValueError(f"unsupported chunk schema at index {index}") + if int(chunk.get("replan_index", -1)) != index: + raise ValueError("chunk replan indices must be contiguous from zero") + start, end = int(chunk.get("start_step", -1)), int(chunk.get("end_step", -1)) + if start < 0 or end < start or int(chunk.get("executed_count", -1)) != end - start: + raise ValueError(f"invalid chunk interval at index {index}") + artifact = str(record["artifact_npz"]) + checksum = str(record["artifact_sha256"]) + if not artifact.endswith(".npz") or len(checksum) != 64: + raise ValueError("invalid attempt artifact reference") + + +def write_manifest(path: Path, records: Iterable[dict[str, Any]]) -> None: + rows = list(records) + for row in rows: + validate_attempt_record(row) + payload = { + "schema_version": ATTEMPT_RECORD_VERSION, + "attempts": len(rows), + "records": rows, + } + path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n") diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_artifacts_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_artifacts_test.py new file mode 100644 index 0000000000000000000000000000000000000000..f195933fa552ce6cfa3da78aef68c751fa8490a1 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_artifacts_test.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from cosmos_framework.model.zeva.attempt_artifacts import ( + ATTEMPT_RECORD_VERSION, + CHUNK_RECORD_VERSION, + validate_attempt_record, +) + + +def test_attempt_artifact_schema() -> None: + record = { + "schema_version": ATTEMPT_RECORD_VERSION, + "session_id": "kettle:197", + "task": "TurnOnElectricKettle", + "attempt_id": 0, + "environment_seed": 197, + "success": False, + "total_steps": 16, + "chunk_records": [ + { + "schema_version": CHUNK_RECORD_VERSION, + "replan_index": 0, + "start_step": 0, + "end_step": 16, + "executed_count": 16, + } + ], + "artifact_npz": "attempt_000_seed_197.npz", + "artifact_sha256": "0" * 64, + } + validate_attempt_record(record) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_protocol.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_protocol.py new file mode 100644 index 0000000000000000000000000000000000000000..edf6dbd6bf90662af26473c87e0886736269610d --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_protocol.py @@ -0,0 +1,78 @@ +"""Frozen repeated-attempt protocol for RoboCasa Atomic-5 evaluation. + +This module intentionally has no simulator or model dependencies so clients, +servers, tests, and result auditors can share one exact protocol definition. +""" + +from __future__ import annotations + +from dataclasses import dataclass + + +PROTOCOL_VERSION = "zeva_robocasa_atomic5_v1" +PREDICTED_ACTION_HORIZON = 32 +EXECUTED_ACTION_HORIZON = 16 +EFFECT_ACTION_HORIZON = 16 +CTE_TRANSITION_ACTION_HORIZON = 4 +EFFECT_CTE_TRANSITIONS = 4 +MAX_CONTROLS_PER_ATTEMPT = 300 +REQUIRED_WARMUP_REQUESTS = 1 + + +def inference_seed(base_seed: int, attempt_id: int, replan_index: int) -> int: + """Return a reproducible per-request seed shared by paired conditions.""" + if base_seed < 0 or attempt_id < 0 or replan_index < 0: + raise ValueError("base_seed, attempt_id, and replan_index must be non-negative") + # A RoboCasa attempt has at most ceil(300/16)=19 replans. Reserving 1,000 + # values per attempt makes the mapping readable and collision-free. + if replan_index >= 1_000: + raise ValueError("replan_index must be < 1000") + value = int(base_seed) + 1_000 * int(attempt_id) + int(replan_index) + if value >= 2**32: + raise ValueError("derived inference seed exceeds uint32") + return value + + +@dataclass(frozen=True) +class AttemptSessionKey: + """Identity of memory that may survive an environment reset.""" + + session_id: str + task_cluster: str + environment_seed: int + + def __post_init__(self) -> None: + if not self.session_id: + raise ValueError("session_id must be non-empty") + if not self.task_cluster: + raise ValueError("task_cluster must be non-empty") + if self.environment_seed < 0: + raise ValueError("environment_seed must be non-negative") + + def assert_compatible(self, other: "AttemptSessionKey") -> None: + if self != other: + raise ValueError( + "attempt-session mismatch: memory may persist only for the exact " + f"(session_id, task, seed); existing={self}, requested={other}" + ) + + +def default_session_id(task_cluster: str, environment_seed: int) -> str: + if not task_cluster: + raise ValueError("task_cluster must be non-empty") + if environment_seed < 0: + raise ValueError("environment_seed must be non-negative") + return f"{PROTOCOL_VERSION}:{task_cluster}:seed={int(environment_seed)}" + + +def contract_manifest() -> dict[str, int | str]: + return { + "version": PROTOCOL_VERSION, + "predicted_action_horizon": PREDICTED_ACTION_HORIZON, + "executed_action_horizon": EXECUTED_ACTION_HORIZON, + "effect_action_horizon": EFFECT_ACTION_HORIZON, + "cte_transition_action_horizon": CTE_TRANSITION_ACTION_HORIZON, + "effect_cte_transitions": EFFECT_CTE_TRANSITIONS, + "max_controls_per_attempt": MAX_CONTROLS_PER_ATTEMPT, + "discarded_warmup_requests": REQUIRED_WARMUP_REQUESTS, + } diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_protocol_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_protocol_test.py new file mode 100644 index 0000000000000000000000000000000000000000..c5a09b53fc08fb7ec90004c27f1bbb810e0c18b6 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/attempt_protocol_test.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +import pytest + +from cosmos_framework.model.zeva.attempt_protocol import ( + EFFECT_ACTION_HORIZON, + EFFECT_CTE_TRANSITIONS, + EXECUTED_ACTION_HORIZON, + PREDICTED_ACTION_HORIZON, + REQUIRED_WARMUP_REQUESTS, + CTE_TRANSITION_ACTION_HORIZON, + AttemptSessionKey, + default_session_id, + inference_seed, +) + + +def test_zeva_temporal_contract_is_exact() -> None: + assert PREDICTED_ACTION_HORIZON == 32 + assert EXECUTED_ACTION_HORIZON == 16 + assert EFFECT_ACTION_HORIZON == 16 + assert CTE_TRANSITION_ACTION_HORIZON == 4 + assert EFFECT_CTE_TRANSITIONS == 4 + assert CTE_TRANSITION_ACTION_HORIZON * EFFECT_CTE_TRANSITIONS == EFFECT_ACTION_HORIZON + assert REQUIRED_WARMUP_REQUESTS == 1 + + +def test_attempt_memory_survives_only_exact_task_seed_session() -> None: + session = AttemptSessionKey(default_session_id("OpenStandMixerHead", 195), "OpenStandMixerHead", 195) + session.assert_compatible( + AttemptSessionKey(default_session_id("OpenStandMixerHead", 195), "OpenStandMixerHead", 195) + ) + with pytest.raises(ValueError, match="attempt-session mismatch"): + session.assert_compatible( + AttemptSessionKey(default_session_id("OpenStandMixerHead", 195), "OpenStandMixerHead", 196) + ) + with pytest.raises(ValueError, match="attempt-session mismatch"): + session.assert_compatible(AttemptSessionKey(session.session_id, "TurnOnMicrowave", 195)) + + +def test_paired_inference_seed_schedule_is_deterministic() -> None: + seeds_a = [inference_seed(20260824, attempt, replan) for attempt in range(3) for replan in range(19)] + seeds_b = [inference_seed(20260824, attempt, replan) for attempt in range(3) for replan in range(19)] + assert seeds_a == seeds_b + assert len(seeds_a) == len(set(seeds_a)) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/brief_interaction_trace.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/brief_interaction_trace.py new file mode 100644 index 0000000000000000000000000000000000000000..7dedcc3859d3e70435d8a75f4c7c14c0693cee42 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/brief_interaction_trace.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Brief Interaction Trace (BIT) for the current attempt.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from torch import Tensor + + +@dataclass(frozen=True) +class BriefInteractionTrace: + """Ordered causal effects completed during the current attempt.""" + + effects: Tensor + valid: Tensor + + def __post_init__(self) -> None: + if self.effects.ndim != 3: + raise ValueError("BIT effects must be [B,L,D]") + if self.valid.shape != self.effects.shape[:2]: + raise ValueError("BIT valid mask must be [B,L]") diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_prompt.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_prompt.py new file mode 100644 index 0000000000000000000000000000000000000000..6a59f85742c174239a0f44064b81b8f79dcafc51 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_prompt.py @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Causal Prompt construction and policy injection (paper Eq. 8).""" + +from .persistent_interaction_memory import ( + CausalPromptConfig, + CausalPromptEncoder, + inject_causal_prompt, +) + +__all__ = ["CausalPromptConfig", "CausalPromptEncoder", "inject_causal_prompt"] diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_transition_encoder.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_transition_encoder.py new file mode 100644 index 0000000000000000000000000000000000000000..3c5a8aee07d2ccdecc0919a4229a2bc81a26cf32 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_transition_encoder.py @@ -0,0 +1,374 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Causal Transition Encoder (CTE) for robot trajectories. + +This is intentionally independent from the Cosmos action denoiser. It learns a +per-time-step causal interaction state from the same multi-view observation and +8-D joint-position command format consumed by Cosmos Action. +""" + +from __future__ import annotations + +from copy import deepcopy +from dataclasses import asdict, dataclass + +import torch +from torch import Tensor, nn +from torch.nn import functional as F +from torch.utils.checkpoint import checkpoint + + +@dataclass +class CausalTransitionEncoderConfig: + action_dim: int = 8 + hidden_dim: int = 256 + retrieval_dim: int = 128 + phase_dim: int = 128 + effect_dim: int = 128 + transition_steps: int = 4 + # Phase stays at the VAE's 4x cadence. Effect uses four such transitions + # (16 raw controls) so it is supervised by an observable visual outcome. + effect_window_transitions: int = 4 + effect_target_grid: tuple[int, int] = (4, 6) + num_layers: int = 4 + num_heads: int = 8 + image_channels: int = 3 + ema_decay: float = 0.996 + # GRU is the stable/default RoboCasa lineage. Mamba remains opt-in so that + # installing mamba_ssm cannot silently change the checkpoint architecture. + use_mamba: bool = False + vision_chunk_size: int = 256 + vision_gradient_checkpointing: bool = True + vision_checkpoint_threshold: int = 1024 + + def to_dict(self) -> dict[str, object]: + return asdict(self) + + +class _VisionStem(nn.Module): + """Small trainable visual stem; inputs are DROID's composite multi-view frames.""" + + def __init__( + self, + channels: int, + hidden_dim: int, + chunk_size: int, + gradient_checkpointing: bool, + checkpoint_threshold: int, + ) -> None: + super().__init__() + width = max(hidden_dim // 4, 32) + self.net = nn.Sequential( + nn.Conv2d(channels, width, kernel_size=7, stride=4, padding=3), + nn.GELU(), + nn.Conv2d(width, width * 2, kernel_size=3, stride=2, padding=1), + nn.GELU(), + nn.Conv2d(width * 2, hidden_dim, kernel_size=3, stride=2, padding=1), + nn.GELU(), + nn.AdaptiveAvgPool2d(1), + ) + self.proj = nn.Linear(hidden_dim, hidden_dim) + self.chunk_size = chunk_size + self.gradient_checkpointing = gradient_checkpointing + self.checkpoint_threshold = checkpoint_threshold + + def _encode_flat(self, flat: Tensor) -> Tensor: + return self.proj(self.net(flat).flatten(1)) + + def forward(self, frames: Tensor) -> Tensor: + # [B,T,C,H,W] -> [B,T,D] + batch, steps = frames.shape[:2] + flat = frames.flatten(0, 1) + # A complete DROID segment can exceed 2,000 frames. Checkpoint each + # visual micro-batch so the CTE remains full-trajectory causal while + # its convolutional activations do not scale with segment length. + use_checkpoint = ( + self.training + and self.gradient_checkpointing + and torch.is_grad_enabled() + and flat.shape[0] > self.checkpoint_threshold + ) + if not use_checkpoint: + return self._encode_flat(flat).unflatten(0, (batch, steps)) + chunks = [] + for frame_chunk in flat.split(self.chunk_size, dim=0): + if use_checkpoint: + chunks.append(checkpoint(self._encode_flat, frame_chunk, use_reentrant=False)) + else: + chunks.append(self._encode_flat(frame_chunk)) + return torch.cat(chunks, dim=0).unflatten(0, (batch, steps)) + + +class _FrozenVAEDeltaTarget(nn.Module): + """Fixed spatial projection of cached Cosmos-VAE latents. + + Unlike the EMA vision stem, this target cannot drift to make an auxiliary + loss easy. Retaining a 4x6 pooled grid makes camera/object displacement + visible instead of reducing every frame to one spatial mean. + """ + + def __init__(self, channels: int, hidden_dim: int, grid: tuple[int, int]) -> None: + super().__init__() + self.grid = grid + input_dim = channels * grid[0] * grid[1] + generator = torch.Generator().manual_seed(20260815) + projection = torch.randn(hidden_dim, input_dim, generator=generator) / input_dim**0.5 + self.register_buffer("projection", projection, persistent=True) + + @torch.no_grad() + def forward(self, frames: Tensor) -> Tensor: + batch, steps = frames.shape[:2] + flat = frames.flatten(0, 1).float() + pooled = F.adaptive_avg_pool2d(flat, self.grid).flatten(1) + pooled = F.layer_norm(pooled, (pooled.shape[-1],)) + return F.linear(pooled, self.projection).unflatten(0, (batch, steps)) + + +class _CausalMixer(nn.Module): + """Causal temporal mixer with a portable GRU fallback when mamba_ssm is absent.""" + + def __init__(self, hidden_dim: int, use_mamba: bool) -> None: + super().__init__() + self.norm = nn.LayerNorm(hidden_dim) + self.kind = "gru" + if use_mamba: + try: + from mamba_ssm import Mamba # type: ignore[import-not-found] + + self.mixer: nn.Module = Mamba(d_model=hidden_dim, d_state=16, d_conv=4, expand=2) + self.kind = "mamba" + except ImportError: + self.mixer = nn.GRU(hidden_dim, hidden_dim, batch_first=True) + else: + self.mixer = nn.GRU(hidden_dim, hidden_dim, batch_first=True) + + def forward(self, x: Tensor) -> Tensor: + y = self.norm(x) + if self.kind == "mamba": + y = self.mixer(y) + else: + y, _ = self.mixer(y) + return x + y + + +class _CausalInteractionBlock(nn.Module): + """Causal visual/action/interaction streams with same-step cross attention.""" + + def __init__(self, cfg: CausalTransitionEncoderConfig) -> None: + super().__init__() + self.visual = _CausalMixer(cfg.hidden_dim, cfg.use_mamba) + self.action = _CausalMixer(cfg.hidden_dim, cfg.use_mamba) + self.interaction_state = _CausalMixer(cfg.hidden_dim, cfg.use_mamba) + self.cross = nn.MultiheadAttention(cfg.hidden_dim, cfg.num_heads, batch_first=True) + self.cross_norm = nn.LayerNorm(cfg.hidden_dim) + self.ffn = nn.Sequential( + nn.LayerNorm(cfg.hidden_dim), + nn.Linear(cfg.hidden_dim, 4 * cfg.hidden_dim), + nn.GELU(), + nn.Linear(4 * cfg.hidden_dim, cfg.hidden_dim), + ) + + def forward(self, visual: Tensor, action: Tensor, interaction_state: Tensor, valid: Tensor) -> tuple[Tensor, Tensor, Tensor]: + visual, action, interaction_state = ( + self.visual(visual), + self.action(action), + self.interaction_state(interaction_state), + ) + # The three tokens for each timestep attend only within that timestep. + tokens = torch.stack((visual, action, interaction_state), dim=2) + batch, steps, streams, dim = tokens.shape + tokens = tokens.reshape(batch * steps, streams, dim) + attended, _ = self.cross(tokens, tokens, tokens, need_weights=False) + tokens = tokens + attended + tokens = tokens + self.ffn(tokens) + tokens = tokens.reshape(batch, steps, streams, dim) + visual, action, interaction_state = tokens.unbind(dim=2) + mask = valid.unsqueeze(-1).to(visual.dtype) + return visual * mask, action * mask, interaction_state * mask + + +class CausalTransitionEncoder(nn.Module): + """Causal transition encoder with phase and causal-effect projections.""" + + def __init__(self, cfg: CausalTransitionEncoderConfig | None = None) -> None: + super().__init__() + self.cfg = cfg or CausalTransitionEncoderConfig() + self.visual_encoder = _VisionStem( + self.cfg.image_channels, + self.cfg.hidden_dim, + self.cfg.vision_chunk_size, + self.cfg.vision_gradient_checkpointing, + self.cfg.vision_checkpoint_threshold, + ) + self.target_visual_encoder = deepcopy(self.visual_encoder).requires_grad_(False) + # The interaction/action stream is intentionally right shifted. At state + # v_b it sees only the completed transition u_(b-1), never u_b. The + # latter is supplied exclusively to the auxiliary effect heads. + transition_dim = self.cfg.transition_steps * self.cfg.action_dim + self.action_encoder = nn.Sequential(nn.LayerNorm(transition_dim), nn.Linear(transition_dim, self.cfg.hidden_dim)) + self.bos_action = nn.Parameter(torch.zeros(1, 1, self.cfg.hidden_dim)) + nn.init.normal_(self.bos_action, std=0.02) + self.interaction_state_token = nn.Parameter(torch.zeros(1, 1, self.cfg.hidden_dim)) + nn.init.normal_(self.interaction_state_token, std=0.02) + self.blocks = nn.ModuleList([_CausalInteractionBlock(self.cfg) for _ in range(self.cfg.num_layers)]) + self.final_norm = nn.LayerNorm(self.cfg.hidden_dim) + self.retrieval_head = nn.Linear(self.cfg.hidden_dim, self.cfg.retrieval_dim) + self.phase_head = nn.Linear(self.cfg.hidden_dim, self.cfg.phase_dim) + self.action_head = nn.Sequential(nn.LayerNorm(self.cfg.hidden_dim), nn.Linear(self.cfg.hidden_dim, transition_dim)) + self.visual_head = nn.Sequential(nn.LayerNorm(self.cfg.hidden_dim), nn.Linear(self.cfg.hidden_dim, self.cfg.hidden_dim)) + effect_window_dim = self.cfg.effect_window_transitions * transition_dim + self.effect_action_encoder = nn.Sequential( + nn.LayerNorm(effect_window_dim), nn.Linear(effect_window_dim, self.cfg.hidden_dim) + ) + self.frozen_effect_target = _FrozenVAEDeltaTarget( + self.cfg.image_channels, self.cfg.hidden_dim, self.cfg.effect_target_grid + ) + self.effect_pre_head = nn.Sequential( + nn.LayerNorm(2 * self.cfg.hidden_dim), nn.Linear(2 * self.cfg.hidden_dim, self.cfg.effect_dim) + ) + # Observed effect is visual only. Passing executed actions here lets + # post simply echo the action-conditioned pre code and caused v2's + # rank-one collapse. + self.effect_post_head = nn.Sequential( + nn.LayerNorm(2 * self.cfg.hidden_dim), nn.Linear(2 * self.cfg.hidden_dim, self.cfg.effect_dim) + ) + self.effect_action_head = nn.Sequential( + nn.LayerNorm(self.cfg.effect_dim), nn.Linear(self.cfg.effect_dim, 4 * self.cfg.action_dim) + ) + self.effect_outcome_head = nn.Sequential( + nn.LayerNorm(self.cfg.effect_dim), nn.Linear(self.cfg.effect_dim, self.cfg.hidden_dim) + ) + + @torch.no_grad() + def update_ema_target(self) -> None: + """Call once after every optimizer step, before building the next target.""" + for target, online in zip(self.target_visual_encoder.parameters(), self.visual_encoder.parameters(), strict=True): + target.lerp_(online, 1.0 - self.cfg.ema_decay) + + @torch.no_grad() + def encode_target_vision(self, frames: Tensor) -> Tensor: + return self.target_visual_encoder(frames) + + def forward( + self, + frames: Tensor, + transition_actions: Tensor, + valid_mask: Tensor | None = None, + transition_valid: Tensor | None = None, + ) -> dict[str, Tensor]: + """Encode padded full trajectories. + + Args: + frames: DROID composite observations ``[B,T,3,H,W]`` in [0, 1]. + transition_actions: completed/raw four-action transitions + ``[B,T-1,4,A]``. At state ``b`` the main action stream only + receives transition ``b-1``; transition ``b`` is used solely + to supervise the effect heads. + valid_mask: ``[B,T]`` true for real timesteps, false for padding. + """ + if frames.ndim != 5 or transition_actions.ndim != 4: + raise ValueError("Expected frames [B,T,C,H,W] and transition_actions [B,T-1,4,A].") + if ( + transition_actions.shape[0] != frames.shape[0] + or transition_actions.shape[1] != frames.shape[1] - 1 + or transition_actions.shape[2:] != (self.cfg.transition_steps, self.cfg.action_dim) + ): + raise ValueError("Frame/transition time axes or action shape do not match CTE config.") + if valid_mask is None: + valid_mask = torch.ones(frames.shape[:2], dtype=torch.bool, device=frames.device) + if transition_valid is None: + transition_valid = torch.ones(transition_actions.shape[:-1], dtype=torch.bool, device=frames.device) + if transition_valid.shape != transition_actions.shape[:-1]: + raise ValueError("transition_valid must have shape [B,T-1,4].") + visual = self.visual_encoder(frames) + transition_flat = transition_actions.flatten(-2) + transition_embed = self.action_encoder(transition_flat) + action = self.bos_action.expand(frames.shape[0], frames.shape[1], -1).clone() + action[:, 1:] = transition_embed + action[:, 1:] *= transition_valid.all(dim=-1, keepdim=True).to(action.dtype) + interaction_state = self.interaction_state_token.expand_as(visual) + for block in self.blocks: + visual, action, interaction_state = block(visual, action, interaction_state, valid_mask) + z = self.final_norm(interaction_state) * valid_mask.unsqueeze(-1) + with torch.no_grad(): + target_visual = self.target_visual_encoder(frames) + transition_complete = valid_mask[:, :-1] & valid_mask[:, 1:] & transition_valid.all(dim=-1) + effect_windows = (frames.shape[1] - 1) // self.cfg.effect_window_transitions + effect_steps = self.cfg.effect_window_transitions + if effect_windows: + effect_start = torch.arange(effect_windows, device=frames.device) * effect_steps + effect_end = effect_start + effect_steps + effect_actions = transition_actions[:, : effect_windows * effect_steps].reshape( + frames.shape[0], effect_windows, effect_steps, self.cfg.transition_steps, self.cfg.action_dim + ) + effect_action_valid = transition_valid[:, : effect_windows * effect_steps].reshape( + frames.shape[0], effect_windows, effect_steps, self.cfg.transition_steps + ) + effect_complete = ( + valid_mask[:, effect_start] + & valid_mask[:, effect_end] + & effect_action_valid.all(dim=(-1, -2)) + ) + effect_embed = self.effect_action_encoder(effect_actions.flatten(-3)) + frozen_visual = self.frozen_effect_target(frames) + effect_delta = frozen_visual[:, effect_end] - frozen_visual[:, effect_start] + effect_pre_raw = self.effect_pre_head(torch.cat((z[:, effect_start], effect_embed), dim=-1)) + effect_post_raw = self.effect_post_head(torch.cat((frozen_visual[:, effect_start], effect_delta), dim=-1)) + else: + effect_actions = transition_actions.new_zeros((frames.shape[0], 0, effect_steps, self.cfg.transition_steps, self.cfg.action_dim)) + effect_complete = torch.zeros((frames.shape[0], 0), dtype=torch.bool, device=frames.device) + effect_delta = z[:, :0] + effect_pre_raw = z[:, :0] + effect_post_raw = z[:, :0] + # At reset there is a single observed frame and no completed + # transition/effect window. LayerNorm cannot be applied to the empty + # ``[..., 0, hidden_dim]`` fallback above because the effect heads + # expect ``effect_dim``. Preserve the causal no-effect state with + # correctly shaped empty outputs; callers then provide only BOS/pad + # effect tokens to the policy. + if effect_pre_raw.shape[1] == 0: + effect_pre = effect_pre_raw.new_zeros( + (frames.shape[0], 0, self.cfg.effect_dim) + ) + effect_post = effect_pre_raw.new_zeros( + (frames.shape[0], 0, self.cfg.effect_dim) + ) + effect_outcome_pre = effect_pre_raw.new_zeros( + (frames.shape[0], 0, self.cfg.hidden_dim) + ) + effect_outcome_post = effect_pre_raw.new_zeros( + (frames.shape[0], 0, self.cfg.hidden_dim) + ) + effect_action = effect_pre_raw.new_zeros( + (frames.shape[0], 0, 4 * self.cfg.action_dim) + ) + else: + effect_pre = F.normalize(effect_pre_raw, dim=-1) + effect_post = F.normalize(effect_post_raw, dim=-1) + effect_outcome_pre = self.effect_outcome_head(effect_pre_raw) + effect_outcome_post = self.effect_outcome_head(effect_post_raw) + effect_action = self.effect_action_head(effect_pre_raw) + return { + "causal_interaction_state": z, + "retrieval": F.normalize(self.retrieval_head(z), dim=-1), + "phase": F.normalize(self.phase_head(z), dim=-1), + "next_action": self.action_head(z[:, :-1]).view( + frames.shape[0], frames.shape[1] - 1, self.cfg.transition_steps, self.cfg.action_dim + ), + "next_vision": self.visual_head(z), + # Frozen target-visual representation used as the PIM retrieval key. + "visual_key": F.normalize(target_visual[..., : self.cfg.phase_dim], dim=-1), + "effect_pre": effect_pre, + "effect_post": effect_post, + "effect_pre_raw": effect_pre_raw, + "effect_post_raw": effect_post_raw, + "effect_outcome_pre": effect_outcome_pre, + "effect_outcome_post": effect_outcome_post, + "effect_action": effect_action, + "effect_actions": effect_actions, + "effect_delta_target": effect_delta, + "effect_complete": effect_complete, + "target_visual": target_visual, + "transition_complete": transition_complete, + } diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_transition_encoder_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_transition_encoder_test.py new file mode 100644 index 0000000000000000000000000000000000000000..21674fa11fb370e58945fe8ffdecd1e571641c9f --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/causal_transition_encoder_test.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +import torch + +from cosmos_framework.model.zeva import ( + CausalTransitionEncoder, + CausalTransitionEncoderConfig, + causal_transition_encoder_loss, +) + + +def test_cte_forward_loss_and_ema() -> None: + model = CausalTransitionEncoder(CausalTransitionEncoderConfig(hidden_dim=32, retrieval_dim=16, phase_dim=16, num_layers=1, num_heads=4, use_mamba=False)) + frames = torch.rand(3, 5, 3, 48, 48) + actions = torch.rand(3, 4, 4, 8) + valid = torch.tensor([[1, 1, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 1, 0, 0]], dtype=torch.bool) + output = model(frames, actions, valid) + assert output["causal_interaction_state"].shape == (3, 5, 32) + assert output["retrieval"].shape == (3, 5, 16) + losses = causal_transition_encoder_loss(output, actions, valid, torch.tensor([0, 0, 1])) + assert torch.isfinite(losses["total"]) + losses["total"].backward() + before = next(model.target_visual_encoder.parameters()).clone() + with torch.no_grad(): + next(model.visual_encoder.parameters()).add_(0.01) + model.update_ema_target() + assert not torch.equal(before, next(model.target_visual_encoder.parameters())) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/checkpoint_io.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/checkpoint_io.py new file mode 100644 index 0000000000000000000000000000000000000000..79a50b3c8ecb77f6b2b02e86dd7d20e79ad16e11 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/checkpoint_io.py @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Checkpoint loading utilities for Zeva modules.""" + +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any + + +def normalize_cte_state_dict(state_dict: Mapping[str, Any]) -> dict[str, Any]: + """Normalize serialized CTE parameter names without changing tensors.""" + + normalized: dict[str, Any] = {} + for key, value in state_dict.items(): + new_key = key.replace("behavior_token", "interaction_state_token") + new_key = new_key.replace(".behavior.", ".interaction_state.") + if new_key in normalized: + raise ValueError(f"Duplicate CTE checkpoint key after normalization: {new_key}") + normalized[new_key] = value + return normalized diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/checkpoint_io_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/checkpoint_io_test.py new file mode 100644 index 0000000000000000000000000000000000000000..637c749ad613e84f96c4f539256490eb647f5f86 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/checkpoint_io_test.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import torch + +from cosmos_framework.model.zeva import ( + CausalTransitionEncoder, + CausalTransitionEncoderConfig, + normalize_cte_state_dict, +) + + +def test_cte_key_normalization_preserves_every_tensor() -> None: + config = CausalTransitionEncoderConfig( + hidden_dim=16, + retrieval_dim=8, + phase_dim=8, + effect_dim=8, + num_layers=1, + num_heads=4, + use_mamba=False, + ) + source = CausalTransitionEncoder(config) + serialized = {} + for key, value in source.state_dict().items(): + serialized_key = key.replace("interaction_state_token", "behavior_token") + serialized_key = serialized_key.replace(".interaction_state.", ".behavior.") + serialized[serialized_key] = value.clone() + + restored = CausalTransitionEncoder(config) + restored.load_state_dict(normalize_cte_state_dict(serialized), strict=True) + for key, value in source.state_dict().items(): + assert torch.equal(value, restored.state_dict()[key]), key diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/cte_losses.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/cte_losses.py new file mode 100644 index 0000000000000000000000000000000000000000..61fe3e7cf46ab012c5ef463a56955aed3f67706b --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/cte_losses.py @@ -0,0 +1,177 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Learning objectives for the Causal Transition Encoder (CTE).""" + +from __future__ import annotations + +from dataclasses import dataclass + +import torch +from torch import Tensor +from torch.nn import functional as F + + +@dataclass +class CTELossConfig: + action_weight: float = 1.0 + vision_weight: float = 1.0 + task_weight: float = 0.2 + phase_weight: float = 0.1 + # Effect-v3: observed outcomes are contrastive and explicitly protected + # against rank collapse. Action reconstruction remains a weak auxiliary. + effect_weight: float = 0.25 + effect_contrastive_weight: float = 1.0 + effect_action_weight: float = 0.05 + effect_align_weight: float = 0.1 + effect_variance_weight: float = 1.0 + effect_covariance_weight: float = 0.04 + effect_temperature: float = 0.07 + temperature: float = 0.1 + + +def _masked_mean(x: Tensor, mask: Tensor) -> Tensor: + weight = mask.unsqueeze(-1).to(x.dtype) + return (x * weight).sum(dim=1) / weight.sum(dim=1).clamp_min(1.0) + + +def _task_identity_clustering_loss( + retrieval: Tensor, valid: Tensor, semantic_ids: Tensor, temperature: float +) -> Tensor: + """Multi-positive supervised contrastive loss; samples without a positive are ignored.""" + z = F.normalize(_masked_mean(retrieval, valid), dim=-1) + logits = z @ z.T / temperature + logits.fill_diagonal_(-torch.inf) + positives = semantic_ids[:, None].eq(semantic_ids[None, :]) + positives.fill_diagonal_(False) + usable = positives.any(dim=1) + if not bool(usable.any()): + return z.new_zeros(()) + log_prob = logits - torch.logsumexp(logits, dim=1, keepdim=True) + return -(log_prob.masked_fill(~positives, 0.0).sum(dim=1) / positives.sum(dim=1).clamp_min(1))[usable].mean() + + +def _phase_progression_loss(phase: Tensor, valid: Tensor, margin: float = 0.01) -> Tensor: + """Encourage consecutive phase tokens to advance along one trajectory direction.""" + losses: list[Tensor] = [] + for sequence, mask in zip(phase, valid, strict=True): + z = sequence[mask] + if z.shape[0] < 3: + continue + direction = F.normalize(z[-1] - z[0], dim=-1) + increments = (z[1:] - z[:-1]) @ direction + losses.append(F.relu(margin - increments).mean()) + return torch.stack(losses).mean() if losses else phase.new_zeros(()) + + +def summarize_effect_window(actions: Tensor) -> Tensor: + """Summarize an executed low-rate effect window ``[B,W,K,4,A]``. + + Keeping first, net displacement, mean and standard deviation makes this a + light action regularizer, not a loss that can be solved by copying the + current four-control input into the effect code. + """ + if actions.ndim != 5: + raise ValueError("Effect actions must have shape [B,W,K,4,A].") + sequence = actions.flatten(-3, -2) + return torch.cat( + ( + sequence[..., 0, :], + sequence[..., -1, :] - sequence[..., 0, :], + sequence.mean(dim=-2), + sequence.std(dim=-2, correction=0), + ), + dim=-1, + ) + + +def _effect_nce(query: Tensor, target: Tensor, mask: Tensor, temperature: float) -> Tensor: + query, target = query[mask], target[mask] + if query.shape[0] < 2: + return query.new_zeros(()) + logits = F.normalize(query, dim=-1) @ F.normalize(target, dim=-1).T / temperature + return F.cross_entropy(logits, torch.arange(logits.shape[0], device=logits.device)) + + +def _vicreg(code: Tensor, mask: Tensor) -> tuple[Tensor, Tensor]: + code = code[mask] + if code.shape[0] < 2: + zero = code.new_zeros(()) + return zero, zero + centered = code - code.mean(dim=0, keepdim=True) + std = (centered.var(dim=0, correction=0) + 1e-4).sqrt() + variance = F.relu(1.0 - std).mean() + covariance = centered.T @ centered / max(code.shape[0] - 1, 1) + covariance.fill_diagonal_(0) + covariance_loss = covariance.square().sum() / code.shape[-1] + return variance, covariance_loss + + +def causal_transition_encoder_loss( + outputs: dict[str, Tensor], + transition_actions: Tensor, + valid_mask: Tensor, + semantic_ids: Tensor, + cfg: CTELossConfig | None = None, +) -> dict[str, Tensor]: + """CTE objective: causal effect, task identity, and phase progression.""" + cfg = cfg or CTELossConfig() + transition_complete = outputs["transition_complete"] + if transition_complete.shape != transition_actions.shape[:2]: + raise ValueError("Effect outputs and transition-action cache are not temporally aligned.") + action_error = F.smooth_l1_loss( + outputs["next_action"], transition_actions, reduction="none" + ).mean(dim=(-1, -2)) + action_loss = (action_error * transition_complete).sum() / transition_complete.sum().clamp_min(1) + target_vision = outputs["target_visual"] + vision_error = F.mse_loss( + outputs["next_vision"][:, :-1], target_vision[:, 1:], reduction="none" + ).mean(dim=-1) + vision_loss = (vision_error * transition_complete).sum() / transition_complete.sum().clamp_min(1) + task_loss = _task_identity_clustering_loss(outputs["retrieval"], valid_mask, semantic_ids, cfg.temperature) + phase_loss = _phase_progression_loss(outputs["phase"], valid_mask) + effect_mask = outputs["effect_complete"] + effect_target = outputs["effect_delta_target"] + effect_nce_pre = _effect_nce(outputs["effect_outcome_pre"], effect_target, effect_mask, cfg.effect_temperature) + effect_nce_post = _effect_nce(outputs["effect_outcome_post"], effect_target, effect_mask, cfg.effect_temperature) + effect_contrastive_loss = 0.5 * (effect_nce_pre + effect_nce_post) + # Diagnostic only: absolute deltas have a strong zero baseline, so this + # MSE is intentionally not optimized directly. + effect_visual_error = F.mse_loss(outputs["effect_outcome_pre"], effect_target, reduction="none").mean(dim=-1) + effect_visual_loss = (effect_visual_error * effect_mask).sum() / effect_mask.sum().clamp_min(1) + action_target = summarize_effect_window(outputs["effect_actions"]) + effect_action_error = F.smooth_l1_loss( + outputs["effect_action"], action_target, reduction="none" + ).mean(dim=-1) + effect_action_loss = (effect_action_error * effect_mask).sum() / effect_mask.sum().clamp_min(1) + effect_align_error = 1.0 - (outputs["effect_pre"] * outputs["effect_post"]).sum(dim=-1) + effect_align_loss = (effect_align_error * effect_mask).sum() / effect_mask.sum().clamp_min(1) + effect_variance_loss, effect_covariance_loss = _vicreg(outputs["effect_post_raw"], effect_mask) + effect_loss = ( + cfg.effect_contrastive_weight * effect_contrastive_loss + + cfg.effect_action_weight * effect_action_loss + + cfg.effect_align_weight * effect_align_loss + + cfg.effect_variance_weight * effect_variance_loss + + cfg.effect_covariance_weight * effect_covariance_loss + ) + total = ( + cfg.action_weight * action_loss + + cfg.vision_weight * vision_loss + + cfg.task_weight * task_loss + + cfg.phase_weight * phase_loss + + cfg.effect_weight * effect_loss + ) + return { + "total": total, + "action": action_loss, + "vision": vision_loss, + "loss_task": task_loss, + "loss_phase": phase_loss, + "loss_effect": effect_loss, + "effect_contrastive": effect_contrastive_loss, + "effect_visual": effect_visual_loss, + "effect_action": effect_action_loss, + "effect_align": effect_align_loss, + "effect_variance": effect_variance_loss, + "effect_covariance": effect_covariance_loss, + } diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/__init__.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..66b6b610e03d87c67e8e5a5742a06d520791cad0 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/__init__.py @@ -0,0 +1 @@ +"""Experimental Zeva components that are not part of the paper architecture.""" diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/robocasa_transition_memory.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/robocasa_transition_memory.py new file mode 100644 index 0000000000000000000000000000000000000000..7c6a34d6ac342a62ee3912af325952fd5bd5f725 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/robocasa_transition_memory.py @@ -0,0 +1,49 @@ +"""RoboCasa Atomic-5 experimental transition-memory contract. + +This module keeps the RoboCasa contract separate from the ARX defaults in +the generic transition-memory defaults. In particular, RoboCasa uses the +frozen Atomic-5 CTE, +7-dimensional arm actions and the left-agent/wrist 20-Hz temporal contract. +""" + +from __future__ import annotations + +from .transition_memory import TransitionMemorySchema + + +ROBOCASA_ATOMIC5_TASKS = ( + "OpenStandMixerHead", + "TurnOnElectricKettle", + "CloseToasterOvenDoor", + "TurnOnMicrowave", + "CoffeeSetupMug", +) + + +def make_robocasa_atomic5_schema( + *, + cte_hash: str = "", + vae_temporal_hash: str = "", + capacity: int = 64, + top_k: int = 4, +) -> TransitionMemorySchema: + """Return the Atomic-5 transition-memory schema. + + ``cte_hash`` and ``vae_temporal_hash`` are part of the schema hash. A + runtime/cache produced with a different CTE or temporal contract is + therefore rejected instead of silently mixing representations. + """ + + return TransitionMemorySchema( + version="robocasa_atomic5_transition_memory_v1", + task_contract="robocasa365_atomic5_5task_left_wrist_arm7_20hz_cosmos32_exec16", + phase_dim=128, + visual_key_dim=128, + effect_dim=128, + action_dim=7, + action_horizon=16, + capacity=int(capacity), + top_k=int(top_k), + cte_hash=str(cte_hash), + vae_temporal_hash=str(vae_temporal_hash), + ) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory.py new file mode 100644 index 0000000000000000000000000000000000000000..d00a3d95978d9f46d7c0cb159d2fef3c4161f661 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory.py @@ -0,0 +1,246 @@ +"""Experimental transition memory retained for non-paper ablations. + +The memory stores only completed 16-control transitions. It is deliberately +independent of the Cosmos model so that real-robot code can run it in shadow +mode before enabling the extra conditioning prefix. +""" + +from __future__ import annotations + +from collections import deque +from dataclasses import dataclass, field +import hashlib +import json +from typing import Iterable + +import torch +from torch import nn +import torch.nn.functional as F + + +@dataclass(frozen=True) +class TransitionMemorySchema: + """Dimensions and temporal contract used by one memory session.""" + + version: str = "arx_transition_memory_v1" + task_contract: str = "arx_task7_model_a_5task" + phase_dim: int = 128 + visual_key_dim: int = 128 + effect_dim: int = 128 + action_dim: int = 14 + action_horizon: int = 16 + capacity: int = 64 + top_k: int = 4 + cte_hash: str = "" + vae_temporal_hash: str = "" + + @property + def hash(self) -> str: + payload = json.dumps(self.__dict__, sort_keys=True, separators=(",", ":")) + return hashlib.sha256(payload.encode("utf-8")).hexdigest() + + +@dataclass +class TransitionRecord: + """One causally completed replan transition.""" + + task_cluster: str + phase: torch.Tensor + visual_key: torch.Tensor + effect_post: torch.Tensor + executed_action: torch.Tensor + next_visual_key: torch.Tensor + next_phase: torch.Tensor + latent_index: int + schema_hash: str + valid: bool = True + metadata: dict[str, object] = field(default_factory=dict) + + def cpu(self) -> "TransitionRecord": + """Detach tensors so the session never retains a training graph.""" + return TransitionRecord( + task_cluster=self.task_cluster, + phase=self.phase.detach().float().cpu().contiguous(), + visual_key=self.visual_key.detach().float().cpu().contiguous(), + effect_post=self.effect_post.detach().float().cpu().contiguous(), + executed_action=self.executed_action.detach().float().cpu().contiguous(), + next_visual_key=self.next_visual_key.detach().float().cpu().contiguous(), + next_phase=self.next_phase.detach().float().cpu().contiguous(), + latent_index=int(self.latent_index), + schema_hash=self.schema_hash, + valid=bool(self.valid), + metadata=dict(self.metadata), + ) + + +class TransitionMemory: + """Bounded FIFO memory scoped to one task session.""" + + def __init__(self, schema: TransitionMemorySchema | None = None) -> None: + self.schema = schema or TransitionMemorySchema() + self._task_cluster: str | None = None + self._entries: deque[TransitionRecord] = deque(maxlen=self.schema.capacity) + + @property + def task_cluster(self) -> str | None: + return self._task_cluster + + def __len__(self) -> int: + return len(self._entries) + + @property + def entries(self) -> tuple[TransitionRecord, ...]: + """Return a stable, read-only snapshot for audit/finalization.""" + return tuple(self._entries) + + def reset(self, task_cluster: str | None = None) -> None: + self._entries.clear() + self._task_cluster = task_cluster + + def _validate(self, transition: TransitionRecord) -> None: + if transition.schema_hash != self.schema.hash: + raise ValueError( + "transition memory schema mismatch: " + f"got {transition.schema_hash}, expected {self.schema.hash}" + ) + if transition.phase.shape != (self.schema.phase_dim,): + raise ValueError(f"phase must be [{self.schema.phase_dim}], got {tuple(transition.phase.shape)}") + if transition.visual_key.shape != (self.schema.visual_key_dim,): + raise ValueError("visual_key has an invalid shape") + if transition.effect_post.shape != (self.schema.effect_dim,): + raise ValueError("effect_post has an invalid shape") + if transition.executed_action.shape != (self.schema.action_horizon, self.schema.action_dim): + raise ValueError("executed_action must contain exactly one completed 16-step window") + if transition.next_visual_key.shape != (self.schema.visual_key_dim,): + raise ValueError("next_visual_key has an invalid shape") + if transition.next_phase.shape != (self.schema.phase_dim,): + raise ValueError("next_phase has an invalid shape") + if not transition.valid: + raise ValueError("invalid or incomplete transitions must not enter transition memory") + + def append(self, transition: TransitionRecord) -> None: + """Append one completed transition, resetting on a task change.""" + self._validate(transition) + if self._task_cluster is None: + self._task_cluster = transition.task_cluster + if transition.task_cluster != self._task_cluster: + raise ValueError( + f"task mismatch: session={self._task_cluster!r}, transition={transition.task_cluster!r}; reset first" + ) + self._entries.append(transition.cpu()) + + def annotate_attempt_outcome( + self, + attempt_id: int, + *, + outcome: str, + termination_reason: str, + total_steps: int, + final_progress: float, + ) -> int: + """Attach a terminal label to every transition from one attempt.""" + if outcome not in {"success", "failure"}: + raise ValueError(f"unsupported attempt outcome: {outcome!r}") + if termination_reason not in {"success", "env_done", "max_steps", "client_error", "safety"}: + raise ValueError(f"unsupported termination reason: {termination_reason!r}") + if attempt_id < 0 or total_steps < 0: + raise ValueError("attempt_id and total_steps must be non-negative") + if not 0.0 <= float(final_progress) <= 1.0: + raise ValueError("final_progress must be in [0,1]") + updated = 0 + for entry in self._entries: + if int(entry.metadata.get("attempt_id", -1)) != attempt_id: + continue + entry.metadata.update( + { + "terminal_outcome": outcome, + "termination_reason": termination_reason, + "total_steps": int(total_steps), + "final_progress": float(final_progress), + "progress_source": "success_only", + } + ) + updated += 1 + return updated + + def query( + self, + phase: torch.Tensor, + visual_key: torch.Tensor, + *, + top_k: int | None = None, + ) -> tuple[list[TransitionRecord], torch.Tensor]: + """Return cosine-ranked history entries and scores.""" + if phase.shape != (self.schema.phase_dim,) or visual_key.shape != (self.schema.visual_key_dim,): + raise ValueError("query phase/visual_key shape mismatch") + if not self._entries: + return [], torch.empty(0, dtype=torch.float32) + k = min(int(top_k or self.schema.top_k), len(self._entries)) + q = F.normalize(torch.cat((phase.float(), visual_key.float())), dim=0) + keys = torch.stack([ + F.normalize(torch.cat((entry.phase, entry.visual_key)), dim=0) + for entry in self._entries + ]) + scores = keys @ q + values, indices = torch.topk(scores, k=k, largest=True, sorted=True) + entries = [list(self._entries)[int(index)] for index in indices] + return entries, values + + +class TransitionMemoryEncoder(nn.Module): + """Encode top-k transitions into one 256-D causal context token.""" + + def __init__(self, schema: TransitionMemorySchema | None = None, hidden_dim: int = 256) -> None: + super().__init__() + self.schema = schema or TransitionMemorySchema() + self.hidden_dim = hidden_dim + value_dim = ( + self.schema.phase_dim + + self.schema.visual_key_dim + + self.schema.effect_dim + + self.schema.action_horizon * self.schema.action_dim + + self.schema.visual_key_dim + + self.schema.phase_dim + ) + query_dim = self.schema.phase_dim + self.schema.visual_key_dim + self.query_proj = nn.Sequential(nn.Linear(query_dim, hidden_dim), nn.SiLU(), nn.Linear(hidden_dim, hidden_dim)) + self.key_proj = nn.Sequential(nn.Linear(query_dim, hidden_dim), nn.SiLU(), nn.Linear(hidden_dim, hidden_dim)) + self.value_proj = nn.Sequential(nn.Linear(value_dim, hidden_dim), nn.SiLU(), nn.Linear(hidden_dim, hidden_dim)) + self.output = nn.Sequential(nn.LayerNorm(hidden_dim), nn.Linear(hidden_dim, hidden_dim), nn.SiLU()) + self.bos_online = nn.Parameter(torch.zeros(hidden_dim)) + nn.init.normal_(self.bos_online, std=0.02) + + def forward( + self, + phase: torch.Tensor, + visual_key: torch.Tensor, + entries: Iterable[TransitionRecord] | None = None, + ) -> torch.Tensor: + """Return ``[B, hidden_dim]`` or ``[hidden_dim]`` for one query.""" + if phase.ndim == 1: + phase = phase.unsqueeze(0) + if visual_key.ndim == 1: + visual_key = visual_key.unsqueeze(0) + if phase.shape[0] != 1 or visual_key.shape[0] != 1: + raise ValueError("TransitionMemoryEncoder currently accepts one query at a time") + device = phase.device + query = torch.cat((phase.float(), visual_key.float()), dim=-1) + q = self.query_proj(query) + items = list(entries or [])[: self.schema.top_k] + if not items: + return self.output(q + self.bos_online.to(q)).to(phase.dtype) + keys = torch.stack([torch.cat((item.phase, item.visual_key)) for item in items]).to(device=device) + values = torch.stack([ + torch.cat(( + item.phase, + item.visual_key, + item.effect_post, + item.executed_action.reshape(-1), + item.next_visual_key, + item.next_phase, + )) + for item in items + ]).to(device=device) + attention = torch.softmax(F.normalize(self.key_proj(keys), dim=-1) @ F.normalize(q, dim=-1).squeeze(0), dim=0) + context = (attention.unsqueeze(-1) * self.value_proj(values)).sum(dim=0, keepdim=True) + return self.output(q + context).to(phase.dtype) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_policy_adapter.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_policy_adapter.py new file mode 100644 index 0000000000000000000000000000000000000000..5bfe053ffdbd1ae4db5cda39085dc9cc1774d6cb --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_policy_adapter.py @@ -0,0 +1,116 @@ +"""Learned action residual projector for the Cosmos transition-memory prefix. + +This module is intentionally tiny and dependency-light so the same class can +be copied into the remote Cosmos framework checkout. It is not a selector: +it receives only the server-produced action chunk, the current phase/visual +features and the learned transition-memory context, and emits a bounded residual. +""" + +from __future__ import annotations + +import torch +from torch import Tensor, nn + + +ACTION_PROJECTOR_FORMAT = "robocasa_atomic5_transition_memory_action_projector_v1" + + +class TransitionMemoryPolicyAdapter(nn.Module): + """Predict a bounded 32x7 residual from the learned memory context.""" + + def __init__( + self, + *, + context_dim: int = 256, + phase_dim: int = 128, + visual_dim: int = 128, + action_horizon: int = 32, + action_dim: int = 7, + hidden_dim: int = 256, + residual_scale: float = 0.5, + effective_horizon: int = 16, + residual_scale_max: float | None = None, + ) -> None: + super().__init__() + if action_horizon != 32 or action_dim != 7: + raise ValueError("Atomic-5 action projector requires horizon=32 and action_dim=7") + if effective_horizon < 1 or effective_horizon > action_horizon: + raise ValueError("effective_horizon must be in [1, action_horizon]") + if residual_scale_max is None: + residual_scale_max = float(residual_scale) + if not torch.isfinite(torch.tensor(float(residual_scale_max))): + raise ValueError("residual_scale_max must be finite") + if float(residual_scale_max) <= 0.0: + raise ValueError("residual_scale_max must be positive") + if not torch.isfinite(torch.tensor(float(residual_scale))): + raise ValueError("residual_scale must be finite") + if float(residual_scale) < 0.0 or float(residual_scale) > float(residual_scale_max): + raise ValueError("residual_scale must lie in [0, residual_scale_max]") + self.context_dim = int(context_dim) + self.phase_dim = int(phase_dim) + self.visual_dim = int(visual_dim) + self.action_horizon = int(action_horizon) + self.action_dim = int(action_dim) + self.hidden_dim = int(hidden_dim) + self.residual_scale = float(residual_scale) + self.residual_scale_max = float(residual_scale_max) + self.effective_horizon = int(effective_horizon) + input_dim = context_dim + phase_dim + visual_dim + action_horizon * action_dim + self.body = nn.Sequential( + nn.Linear(input_dim, hidden_dim), + nn.SiLU(), + nn.Linear(hidden_dim, hidden_dim), + nn.SiLU(), + ) + self.residual_head = nn.Linear(hidden_dim, action_horizon * action_dim) + + def forward( + self, + context: Tensor, + phase: Tensor, + visual_key: Tensor, + baseline_actions: Tensor, + ) -> tuple[Tensor, Tensor]: + if context.ndim == 1: + context = context.unsqueeze(0) + if phase.ndim == 1: + phase = phase.unsqueeze(0) + if visual_key.ndim == 1: + visual_key = visual_key.unsqueeze(0) + if baseline_actions.ndim != 3: + raise ValueError("baseline_actions must be [B,32,7]") + expected = (self.action_horizon, self.action_dim) + if tuple(baseline_actions.shape[1:]) != expected: + raise ValueError(f"baseline_actions must be [B,{expected[0]},{expected[1]}]") + if context.shape[0] != baseline_actions.shape[0] or phase.shape[0] != baseline_actions.shape[0] or visual_key.shape[0] != baseline_actions.shape[0]: + raise ValueError("projector batch dimensions do not match") + # The evaluator executes only the first ``effective_horizon`` controls + # of a 32-action prediction. Do not let the unexecuted suffix affect + # the learned correction: it is often stochastic padding/noise. + baseline_for_features = baseline_actions.float() + if self.effective_horizon < self.action_horizon: + mask = torch.zeros_like(baseline_for_features) + mask[:, : self.effective_horizon] = 1.0 + baseline_for_features = baseline_for_features * mask + features = torch.cat( + (context.float(), phase.float(), visual_key.float(), baseline_for_features.reshape(baseline_actions.shape[0], -1)), + dim=-1, + ) + residual = torch.tanh(self.residual_head(self.body(features))).reshape(-1, *expected) + if self.effective_horizon < self.action_horizon: + mask = torch.zeros_like(residual) + mask[:, : self.effective_horizon] = 1.0 + residual = residual * mask + residual = residual * self.residual_scale + return baseline_actions + residual, residual + + def set_residual_scale(self, value: float) -> None: + """Set a calibrated bounded residual scale without changing weights.""" + value = float(value) + if not torch.isfinite(torch.tensor(value)): + raise ValueError("residual scale must be finite") + if value < 0.0 or value > self.residual_scale_max: + raise ValueError( + f"residual scale {value} is outside [0, {self.residual_scale_max}]" + ) + self.residual_scale = value diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_runtime.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..63902a83a4e1719e08c4736744da16ba642a10e8 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_runtime.py @@ -0,0 +1,100 @@ +"""Runtime glue for the experimental task-session transition memory.""" + +from __future__ import annotations + +from dataclasses import dataclass + +import torch + +from .transition_memory import TransitionMemory, TransitionMemoryEncoder, TransitionMemorySchema, TransitionRecord + + +@dataclass +class TransitionMemoryReadout: + context: torch.Tensor + scores: torch.Tensor + num_entries: int + + +class TransitionMemoryController: + """Owns task reset, causal writes, and context reads for one policy server.""" + + def __init__( + self, + schema: TransitionMemorySchema | None = None, + *, + encoder: TransitionMemoryEncoder | None = None, + enabled: bool = False, + ) -> None: + self.schema = schema or TransitionMemorySchema() + self.memory = TransitionMemory(self.schema) + self.encoder = encoder or TransitionMemoryEncoder(self.schema) + self.enabled = bool(enabled) + self._replan_open = False + + def reset(self, task_cluster: str) -> None: + self.memory.reset(task_cluster) + self._replan_open = False + + def begin_replan(self) -> None: + if self.memory.task_cluster is None: + raise RuntimeError("reset(task_cluster) is required before begin_replan") + if self._replan_open: + raise RuntimeError("previous replan is still open") + self._replan_open = True + + def discard_open_replan(self) -> bool: + """Discard a terminal partial window without writing it to memory.""" + was_open = self._replan_open + self._replan_open = False + return was_open + + @torch.inference_mode() + def read(self, phase: torch.Tensor, visual_key: torch.Tensor) -> TransitionMemoryReadout: + """Read only transitions written before this replan.""" + if not self._replan_open: + raise RuntimeError("begin_replan() must precede an transition-memory read") + entries, scores = self.memory.query(phase.detach().cpu(), visual_key.detach().cpu()) + if self.enabled: + context = self.encoder(phase, visual_key, entries) + else: + context = phase.new_zeros((1, self.encoder.hidden_dim)) + return TransitionMemoryReadout(context=context, scores=scores, num_entries=len(entries)) + + def complete_replan( + self, + *, + phase: torch.Tensor, + visual_key: torch.Tensor, + effect_post: torch.Tensor, + executed_action: torch.Tensor, + next_visual_key: torch.Tensor, + next_phase: torch.Tensor, + latent_index: int, + completed: bool, + metadata: dict[str, object] | None = None, + ) -> bool: + """Commit exactly one completed 16-step transition, or discard it.""" + if not self._replan_open: + raise RuntimeError("begin_replan() must precede complete_replan()") + self._replan_open = False + if not completed: + return False + if executed_action.shape != (self.schema.action_horizon, self.schema.action_dim): + raise ValueError("only a completed 16-step action window may enter transition memory") + assert self.memory.task_cluster is not None + self.memory.append( + TransitionRecord( + task_cluster=self.memory.task_cluster, + phase=phase, + visual_key=visual_key, + effect_post=effect_post, + executed_action=executed_action, + next_visual_key=next_visual_key, + next_phase=next_phase, + latent_index=int(latent_index), + schema_hash=self.schema.hash, + metadata=dict(metadata or {}), + ) + ) + return True diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_test.py new file mode 100644 index 0000000000000000000000000000000000000000..f8b601a27fbac73ebcac4adaef2e615bf8adf552 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/experimental/transition_memory_test.py @@ -0,0 +1,161 @@ +from __future__ import annotations + +import pytest +import torch + +from cosmos_framework.model.zeva.experimental.transition_memory import ( + TransitionMemory, + TransitionMemoryEncoder, + TransitionMemorySchema, + TransitionRecord, +) +from cosmos_framework.model.zeva.experimental.transition_memory_runtime import TransitionMemoryController +from cosmos_framework.model.zeva.experimental.robocasa_transition_memory import make_robocasa_atomic5_schema + + +def make_transition(schema: TransitionMemorySchema, task: str, i: int, *, valid: bool = True) -> TransitionRecord: + return TransitionRecord( + task_cluster=task, + phase=torch.full((schema.phase_dim,), float(i)), + visual_key=torch.full((schema.visual_key_dim,), float(i + 1)), + effect_post=torch.full((schema.effect_dim,), float(i + 2)), + executed_action=torch.full((schema.action_horizon, schema.action_dim), float(i + 3)), + next_visual_key=torch.full((schema.visual_key_dim,), float(i + 4)), + next_phase=torch.full((schema.phase_dim,), float(i + 5)), + latent_index=4 * i, + schema_hash=schema.hash, + valid=valid, + ) + + +def test_fifo_reset_and_task_isolation() -> None: + schema = TransitionMemorySchema(capacity=2) + memory = TransitionMemory(schema) + memory.append(make_transition(schema, "pick", 0)) + memory.append(make_transition(schema, "pick", 1)) + memory.append(make_transition(schema, "pick", 2)) + assert len(memory) == 2 + with pytest.raises(ValueError, match="task mismatch"): + memory.append(make_transition(schema, "pour", 3)) + memory.reset("pour") + memory.append(make_transition(schema, "pour", 3)) + assert len(memory) == 1 + assert memory.task_cluster == "pour" + + +def test_schema_and_incomplete_transition_fail_fast() -> None: + schema = TransitionMemorySchema() + memory = TransitionMemory(schema) + bad_hash = make_transition(schema, "pick", 0) + bad_hash.schema_hash = "wrong" + with pytest.raises(ValueError, match="schema mismatch"): + memory.append(bad_hash) + with pytest.raises(ValueError, match="invalid or incomplete"): + memory.append(make_transition(schema, "pick", 0, valid=False)) + + +def test_query_is_bounded_and_encoder_handles_empty_memory() -> None: + schema = TransitionMemorySchema(capacity=64, top_k=4) + memory = TransitionMemory(schema) + for i in range(10): + memory.append(make_transition(schema, "pick", i)) + entries, scores = memory.query(torch.zeros(schema.phase_dim), torch.zeros(schema.visual_key_dim)) + assert len(entries) == 4 + assert scores.shape == (4,) + encoder = TransitionMemoryEncoder(schema) + context = encoder(torch.zeros(schema.phase_dim), torch.zeros(schema.visual_key_dim), entries) + empty_context = encoder(torch.zeros(schema.phase_dim), torch.zeros(schema.visual_key_dim), []) + assert context.shape == (1, 256) + assert empty_context.shape == (1, 256) + assert torch.isfinite(context).all() + + +def test_controller_does_not_commit_incomplete_replan() -> None: + schema = TransitionMemorySchema() + controller = TransitionMemoryController(schema, enabled=True) + controller.reset("pick") + controller.begin_replan() + readout = controller.read(torch.zeros(schema.phase_dim), torch.zeros(schema.visual_key_dim)) + assert readout.num_entries == 0 + assert not controller.complete_replan( + phase=torch.zeros(schema.phase_dim), + visual_key=torch.zeros(schema.visual_key_dim), + effect_post=torch.zeros(schema.effect_dim), + executed_action=torch.zeros(schema.action_horizon, schema.action_dim), + next_visual_key=torch.zeros(schema.visual_key_dim), + next_phase=torch.zeros(schema.phase_dim), + latent_index=0, + completed=False, + ) + assert len(controller.memory) == 0 + + +def test_robocasa_atomic5_contract_is_arm7_and_temporally_bounded() -> None: + schema = make_robocasa_atomic5_schema(cte_hash="cte", vae_temporal_hash="vae") + assert schema.action_dim == 7 + assert schema.action_horizon == 16 + assert schema.capacity == 64 + assert schema.top_k == 4 + # The provenance fields participate in the hash; a cache from another + # A different CTE/VAE contract cannot be accepted by the runtime. + assert schema.hash != make_robocasa_atomic5_schema(cte_hash="other", vae_temporal_hash="vae").hash + + +def test_robocasa_controller_writes_only_after_completed_window() -> None: + schema = make_robocasa_atomic5_schema() + controller = TransitionMemoryController(schema, enabled=True) + controller.reset("OpenStandMixerHead") + def zeros(shape: tuple[int, ...]) -> torch.Tensor: + return torch.zeros(shape) + controller.begin_replan() + controller.read(zeros((128,)), zeros((128,))) + assert not controller.complete_replan( + phase=zeros((128,)), visual_key=zeros((128,)), effect_post=zeros((128,)), + executed_action=zeros((16, 7)), next_visual_key=zeros((128,)), + next_phase=zeros((128,)), latent_index=0, completed=False, + ) + assert len(controller.memory) == 0 + controller.begin_replan() + controller.read(zeros((128,)), zeros((128,))) + assert controller.complete_replan( + phase=zeros((128,)), visual_key=zeros((128,)), effect_post=zeros((128,)), + executed_action=zeros((16, 7)), next_visual_key=zeros((128,)), + next_phase=zeros((128,)), latent_index=0, completed=True, + ) + assert len(controller.memory) == 1 + + +def test_attempt_outcome_annotation_is_scoped_and_auditable() -> None: + schema = make_robocasa_atomic5_schema() + memory = TransitionMemory(schema) + first = make_transition(schema, "OpenStandMixerHead", 0) + first.metadata = {"attempt_id": 0, "session_id": "mixer:195", "environment_seed": 195} + second = make_transition(schema, "OpenStandMixerHead", 1) + second.metadata = {"attempt_id": 1, "session_id": "mixer:195", "environment_seed": 195} + memory.append(first) + memory.append(second) + updated = memory.annotate_attempt_outcome( + 0, + outcome="failure", + termination_reason="max_steps", + total_steps=300, + final_progress=0.0, + ) + assert updated == 1 + assert memory.entries[0].metadata["terminal_outcome"] == "failure" + assert "terminal_outcome" not in memory.entries[1].metadata + + +def test_discard_open_replan_never_commits_partial_window() -> None: + schema = make_robocasa_atomic5_schema() + controller = TransitionMemoryController(schema, enabled=False) + controller.reset("OpenStandMixerHead") + controller.begin_replan() + assert controller.discard_open_replan() + assert len(controller.memory) == 0 + assert not controller.discard_open_replan() + + + expected = {(95, frame) for frame in range(85)} + assert (95, 83) in expected + assert (93, 83) not in expected diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/persistent_interaction_memory.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/persistent_interaction_memory.py new file mode 100644 index 0000000000000000000000000000000000000000..5d701eb594ce73657aedae16459f9da5cad2836d --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/persistent_interaction_memory.py @@ -0,0 +1,396 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Persistent Interaction Memory (PIM) for causal repeated-attempt adaptation. + +The runtime store is deliberately non-parametric: it accepts only completed +interaction effects, merges similar phase/effect prototypes, and retrieves by +the *current* phase. ``CausalPromptEncoder`` (the paper's ``F_mem``) is the +small trainable module that turns task, phase, BIT, and retrieved PIM tensors +into a single residual context for the frozen policy prefix. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +import torch +from torch import Tensor, nn +from torch.nn import functional as F + + +@dataclass(frozen=True) +class PersistentInteractionMemoryConfig: + phase_dim: int = 128 + effect_dim: int = 128 + capacity: int = 64 + top_k: int = 4 + merge_threshold: float = 0.85 + phase_merge_weight: float = 0.5 + effect_merge_weight: float = 0.5 + + def __post_init__(self) -> None: + if min(self.phase_dim, self.effect_dim, self.capacity, self.top_k) < 1: + raise ValueError("PIM dimensions, capacity, and top_k must be positive") + if self.top_k > self.capacity: + raise ValueError("PIM top_k cannot exceed capacity") + if not -1.0 <= self.merge_threshold <= 1.0: + raise ValueError("PIM merge_threshold must lie in [-1, 1]") + if self.phase_merge_weight < 0.0 or self.effect_merge_weight < 0.0: + raise ValueError("PIM merge weights must be non-negative") + if self.phase_merge_weight + self.effect_merge_weight <= 0.0: + raise ValueError("At least one PIM merge weight must be positive") + + +@dataclass +class PIMMemoryEntry: + """One merged phase/effect prototype in an episode-scoped PIM.""" + + task_cluster: str + phase: Tensor + effect: Tensor + merge_count: int = 1 + first_attempt_id: int = 0 + last_attempt_id: int = 0 + metadata: dict[str, object] = field(default_factory=dict) + + def cpu(self) -> "PIMMemoryEntry": + return PIMMemoryEntry( + task_cluster=self.task_cluster, + phase=self.phase.detach().float().cpu().contiguous(), + effect=self.effect.detach().float().cpu().contiguous(), + merge_count=int(self.merge_count), + first_attempt_id=int(self.first_attempt_id), + last_attempt_id=int(self.last_attempt_id), + metadata=dict(self.metadata), + ) + + +class PersistentInteractionMemory: + """Episode-scoped PIM retained across attempts and cleared across episodes.""" + + def __init__(self, config: PersistentInteractionMemoryConfig | None = None) -> None: + self.config = config or PersistentInteractionMemoryConfig() + self._task_cluster: str | None = None + self._attempt_id: int | None = None + self._entries: list[PIMMemoryEntry] = [] + + @property + def task_cluster(self) -> str | None: + return self._task_cluster + + @property + def attempt_id(self) -> int | None: + return self._attempt_id + + @property + def entries(self) -> tuple[PIMMemoryEntry, ...]: + return tuple(self._entries) + + def __len__(self) -> int: + return len(self._entries) + + def reset_episode(self, task_cluster: str, *, attempt_id: int = 0) -> None: + if not task_cluster: + raise ValueError("PIM task_cluster cannot be empty") + if attempt_id != 0: + raise ValueError("A new PIM episode must begin at attempt_id=0") + self._task_cluster = str(task_cluster) + self._attempt_id = 0 + self._entries.clear() + + def begin_attempt(self, attempt_id: int) -> None: + """Advance the attempt boundary without clearing persistent entries.""" + if self._task_cluster is None or self._attempt_id is None: + raise RuntimeError("reset_episode() is required before begin_attempt()") + attempt_id = int(attempt_id) + if attempt_id not in {self._attempt_id, self._attempt_id + 1}: + raise ValueError( + f"PIM attempt_id must stay constant or increment by one: " + f"active={self._attempt_id}, requested={attempt_id}" + ) + self._attempt_id = attempt_id + + def _validate(self, phase: Tensor, effect: Tensor, task_cluster: str) -> tuple[Tensor, Tensor]: + if self._task_cluster is None or self._attempt_id is None: + raise RuntimeError("reset_episode() is required before PIM writes") + if str(task_cluster) != self._task_cluster: + raise ValueError( + f"PIM task mismatch: active={self._task_cluster!r}, write={task_cluster!r}" + ) + if phase.shape != (self.config.phase_dim,) or effect.shape != (self.config.effect_dim,): + raise ValueError("PIM phase/effect shape mismatch") + if not torch.isfinite(phase).all() or not torch.isfinite(effect).all(): + raise ValueError("PIM refuses non-finite phase/effect values") + return ( + F.normalize(phase.detach().float().cpu(), dim=0), + F.normalize(effect.detach().float().cpu(), dim=0), + ) + + def _merge_scores(self, phase: Tensor, effect: Tensor) -> Tensor: + if not self._entries: + return torch.empty(0, dtype=torch.float32) + phases = torch.stack([entry.phase for entry in self._entries]) + effects = torch.stack([entry.effect for entry in self._entries]) + phase_scores = F.normalize(phases, dim=-1) @ phase + effect_scores = F.normalize(effects, dim=-1) @ effect + total = self.config.phase_merge_weight + self.config.effect_merge_weight + return ( + self.config.phase_merge_weight * phase_scores + + self.config.effect_merge_weight * effect_scores + ) / total + + def append_completed( + self, + *, + task_cluster: str, + phase: Tensor, + effect: Tensor, + attempt_id: int, + metadata: dict[str, object] | None = None, + ) -> tuple[int, bool]: + """Write one completed interaction, returning ``(index, merged)``.""" + phase, effect = self._validate(phase, effect, task_cluster) + self.begin_attempt(int(attempt_id)) + scores = self._merge_scores(phase, effect) + if scores.numel(): + best_score, best_index = scores.max(dim=0) + if float(best_score) >= self.config.merge_threshold: + index = int(best_index) + entry = self._entries[index] + old_count = int(entry.merge_count) + new_count = old_count + 1 + entry.phase = F.normalize((entry.phase * old_count + phase) / new_count, dim=0) + entry.effect = F.normalize((entry.effect * old_count + effect) / new_count, dim=0) + entry.merge_count = new_count + entry.last_attempt_id = int(attempt_id) + entry.metadata.update(dict(metadata or {})) + entry.metadata["last_merge_score"] = float(best_score) + return index, True + + if len(self._entries) >= self.config.capacity: + # Deterministic bounded storage: evict the least consolidated, then + # oldest prototype. This preserves frequently reused interaction + # schemas without making the result dependent on object identity. + evict = min( + range(len(self._entries)), + key=lambda i: (self._entries[i].merge_count, self._entries[i].last_attempt_id, i), + ) + self._entries.pop(evict) + self._entries.append( + PIMMemoryEntry( + task_cluster=str(task_cluster), + phase=phase, + effect=effect, + merge_count=1, + first_attempt_id=int(attempt_id), + last_attempt_id=int(attempt_id), + metadata=dict(metadata or {}), + ) + ) + return len(self._entries) - 1, False + + def query_phase( + self, phase: Tensor, *, top_k: int | None = None + ) -> tuple[list[PIMMemoryEntry], Tensor]: + """Retrieve PIM evidence using only the current phase, as in the paper.""" + if phase.shape != (self.config.phase_dim,): + raise ValueError("PIM query phase shape mismatch") + if not torch.isfinite(phase).all(): + raise ValueError("PIM refuses a non-finite query phase") + requested_k = self.config.top_k if top_k is None else int(top_k) + if requested_k < 1 or requested_k > self.config.capacity: + raise ValueError("PIM query top_k is outside the configured capacity") + if not self._entries: + return [], torch.empty(0, dtype=torch.float32) + query = F.normalize(phase.detach().float().cpu(), dim=0) + keys = torch.stack([F.normalize(entry.phase, dim=0) for entry in self._entries]) + k = min(requested_k, len(self._entries)) + scores, indices = torch.topk(keys @ query, k=k, largest=True, sorted=True) + return [self._entries[int(index)] for index in indices], scores + + def query_tensors( + self, phase: Tensor, *, top_k: int | None = None + ) -> tuple[Tensor, Tensor, Tensor, Tensor]: + """Return padded ``phase/effect/valid/scores`` tensors for model input.""" + k = self.config.top_k if top_k is None else int(top_k) + if k < 1 or k > self.config.capacity: + raise ValueError("PIM query top_k is outside the configured capacity") + entries, scores = self.query_phase(phase, top_k=k) + phases = torch.zeros((k, self.config.phase_dim), dtype=torch.float32) + effects = torch.zeros((k, self.config.effect_dim), dtype=torch.float32) + valid = torch.zeros(k, dtype=torch.bool) + padded_scores = torch.full((k,), -torch.inf, dtype=torch.float32) + for index, entry in enumerate(entries): + phases[index] = entry.phase + effects[index] = entry.effect + valid[index] = True + padded_scores[index] = scores[index] + return phases, effects, valid, padded_scores + + +class PhaseConditionedPIMRetrieval: + """Paper-aligned phase-only retrieval interface over one episode PIM.""" + + def __init__(self, memory: PersistentInteractionMemory) -> None: + self.memory = memory + + def __call__( + self, phase: Tensor, *, top_k: int | None = None + ) -> tuple[Tensor, Tensor, Tensor, Tensor]: + return self.memory.query_tensors(phase, top_k=top_k) + + +@dataclass(frozen=True) +class CausalPromptConfig: + global_dim: int = 256 + phase_dim: int = 128 + effect_dim: int = 128 + brief_length: int = 4 + persistent_length: int = 4 + hidden_dim: int = 256 + num_heads: int = 4 + + def __post_init__(self) -> None: + dimensions = ( + self.global_dim, + self.phase_dim, + self.effect_dim, + self.brief_length, + self.persistent_length, + self.hidden_dim, + self.num_heads, + ) + if min(dimensions) < 1: + raise ValueError("PIM prompt dimensions and lengths must be positive") + if self.hidden_dim % self.num_heads: + raise ValueError("PIM prompt hidden_dim must be divisible by num_heads") + + +class CausalPromptEncoder(nn.Module): + """Fuse task/global, current phase, BIT, and retrieved PIM evidence.""" + + def __init__(self, config: CausalPromptConfig | None = None) -> None: + super().__init__() + self.config = config or CausalPromptConfig() + cfg = self.config + self.global_project = nn.Sequential(nn.LayerNorm(cfg.global_dim), nn.Linear(cfg.global_dim, cfg.hidden_dim)) + self.phase_project = nn.Sequential(nn.LayerNorm(cfg.phase_dim), nn.Linear(cfg.phase_dim, cfg.hidden_dim)) + self.effect_project = nn.Sequential(nn.LayerNorm(cfg.effect_dim), nn.Linear(cfg.effect_dim, cfg.hidden_dim)) + self.brief_position = nn.Parameter(torch.empty(1, cfg.brief_length, cfg.hidden_dim)) + self.persistent_position = nn.Parameter(torch.empty(1, cfg.persistent_length, cfg.hidden_dim)) + self.bos_brief = nn.Parameter(torch.empty(1, 1, cfg.hidden_dim)) + self.bos_persistent = nn.Parameter(torch.empty(1, 1, cfg.hidden_dim)) + self.brief_attention = nn.MultiheadAttention(cfg.hidden_dim, cfg.num_heads, batch_first=True) + self.persistent_attention = nn.MultiheadAttention(cfg.hidden_dim, cfg.num_heads, batch_first=True) + self.fusion = nn.Sequential( + nn.LayerNorm(3 * cfg.hidden_dim), + nn.Linear(3 * cfg.hidden_dim, cfg.hidden_dim), + nn.SiLU(), + nn.Linear(cfg.hidden_dim, cfg.hidden_dim), + ) + self.reset_parameters() + + def reset_parameters(self) -> None: + for module in self.modules(): + if isinstance(module, nn.Linear): + nn.init.xavier_uniform_(module.weight) + if module.bias is not None: + nn.init.zeros_(module.bias) + elif isinstance(module, nn.LayerNorm) and module.elementwise_affine: + nn.init.ones_(module.weight) + nn.init.zeros_(module.bias) + self.brief_attention._reset_parameters() + self.persistent_attention._reset_parameters() + nn.init.normal_(self.brief_position, std=0.02) + nn.init.normal_(self.persistent_position, std=0.02) + nn.init.normal_(self.bos_brief, std=0.02) + nn.init.normal_(self.bos_persistent, std=0.02) + + def forward( + self, + z_global: Tensor, + z_phase: Tensor, + brief_effect: Tensor, + brief_valid: Tensor, + persistent_phase: Tensor, + persistent_effect: Tensor, + persistent_valid: Tensor, + ) -> Tensor: + cfg = self.config + batch = z_global.shape[0] + expected = { + "z_global": (batch, cfg.global_dim), + "z_phase": (batch, cfg.phase_dim), + "brief_effect": (batch, cfg.brief_length, cfg.effect_dim), + "brief_valid": (batch, cfg.brief_length), + "persistent_phase": (batch, cfg.persistent_length, cfg.phase_dim), + "persistent_effect": (batch, cfg.persistent_length, cfg.effect_dim), + "persistent_valid": (batch, cfg.persistent_length), + } + values = { + "z_global": z_global, + "z_phase": z_phase, + "brief_effect": brief_effect, + "brief_valid": brief_valid, + "persistent_phase": persistent_phase, + "persistent_effect": persistent_effect, + "persistent_valid": persistent_valid, + } + for name, shape in expected.items(): + if tuple(values[name].shape) != shape: + raise ValueError(f"Expected {name} {shape}, got {tuple(values[name].shape)}") + + query = self.global_project(z_global) + self.phase_project(z_phase) + brief_valid = brief_valid.to(torch.bool) + persistent_valid = persistent_valid.to(torch.bool) + brief = self.effect_project(brief_effect) + self.brief_position + brief = torch.where( + brief_valid.unsqueeze(-1), brief, self.bos_brief.expand(batch, cfg.brief_length, -1) + ) + brief_padding = ~brief_valid + brief_empty = ~brief_valid.any(dim=-1) + brief_padding = brief_padding.clone() + brief_padding[brief_empty, 0] = False + brief_context, _ = self.brief_attention( + query.unsqueeze(1), brief, brief, key_padding_mask=brief_padding, need_weights=False + ) + persistent = ( + self.phase_project(persistent_phase) + + self.effect_project(persistent_effect) + + self.persistent_position + ) + persistent = torch.where( + persistent_valid.unsqueeze(-1), + persistent, + self.bos_persistent.expand(batch, cfg.persistent_length, -1), + ) + persistent_padding = ~persistent_valid + persistent_empty = ~persistent_valid.any(dim=-1) + persistent_padding = persistent_padding.clone() + persistent_padding[persistent_empty, 0] = False + persistent_context, _ = self.persistent_attention( + query.unsqueeze(1), + persistent, + persistent, + key_padding_mask=persistent_padding, + need_weights=False, + ) + return self.fusion( + torch.cat((query, brief_context.squeeze(1), persistent_context.squeeze(1)), dim=-1) + ) + + +def inject_causal_prompt( + base_prefix: Tensor, + causal_prompt: Tensor, + gate: Tensor, + persistent_valid: Tensor, +) -> Tensor: + """Inject the paper's causal prompt with an exact ``gate == 0`` bypass.""" + if base_prefix.shape != causal_prompt.shape: + raise ValueError("Causal prompt must match the existing task-context prefix shape") + if persistent_valid.ndim != 2 or persistent_valid.shape[0] != base_prefix.shape[0]: + raise ValueError("persistent_valid must be [B,K]") + has_pim = persistent_valid.any(dim=-1, keepdim=True).to(causal_prompt.dtype) + return base_prefix + torch.tanh(gate).to(causal_prompt.dtype) * causal_prompt * has_pim diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/persistent_interaction_memory_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/persistent_interaction_memory_test.py new file mode 100644 index 0000000000000000000000000000000000000000..a030d7c9cbfe3374b7d35859e0c2a688053fb595 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/persistent_interaction_memory_test.py @@ -0,0 +1,133 @@ +from __future__ import annotations + +import torch + +from cosmos_framework.model.zeva.causal_prompt import ( + CausalPromptConfig, + CausalPromptEncoder, + inject_causal_prompt, +) +from cosmos_framework.model.zeva.persistent_interaction_memory import ( + PersistentInteractionMemory, + PersistentInteractionMemoryConfig, + PIMMemoryEntry, +) +from cosmos_framework.model.zeva.phase_conditioned_retrieval import PhaseConditionedPIMRetrieval + + +def _unit(index: int, dim: int = 4) -> torch.Tensor: + value = torch.zeros(dim) + value[index] = 1.0 + return value + + +def test_pim_is_retained_across_attempts_and_cleared_across_episodes() -> None: + cfg = PersistentInteractionMemoryConfig( + phase_dim=4, effect_dim=4, capacity=8, top_k=2, merge_threshold=0.9 + ) + memory = PersistentInteractionMemory(cfg) + memory.reset_episode("pick") + memory.append_completed( + task_cluster="pick", phase=_unit(0), effect=_unit(1), attempt_id=0 + ) + memory.begin_attempt(1) + assert len(memory) == 1 + assert memory.entries[0].first_attempt_id == 0 + memory.reset_episode("pour") + assert len(memory) == 0 + assert memory.attempt_id == 0 + + +def test_pim_merges_by_weighted_phase_and_effect_similarity() -> None: + cfg = PersistentInteractionMemoryConfig( + phase_dim=4, effect_dim=4, capacity=8, top_k=2, merge_threshold=0.8 + ) + memory = PersistentInteractionMemory(cfg) + memory.reset_episode("pick") + _, merged = memory.append_completed( + task_cluster="pick", phase=_unit(0), effect=_unit(1), attempt_id=0 + ) + assert not merged + memory.begin_attempt(1) + _, merged = memory.append_completed( + task_cluster="pick", phase=_unit(0), effect=_unit(1), attempt_id=1 + ) + assert merged + assert len(memory) == 1 + assert memory.entries[0].merge_count == 2 + _, merged = memory.append_completed( + task_cluster="pick", phase=_unit(2), effect=_unit(3), attempt_id=1 + ) + assert not merged + assert len(memory) == 2 + + +def test_phase_conditioned_pim_retrieval_uses_current_phase() -> None: + cfg = PersistentInteractionMemoryConfig( + phase_dim=4, effect_dim=4, capacity=8, top_k=1, merge_threshold=0.99 + ) + memory = PersistentInteractionMemory(cfg) + memory.reset_episode("pick") + memory.append_completed( + task_cluster="pick", phase=_unit(0), effect=_unit(3), attempt_id=0 + ) + memory.append_completed( + task_cluster="pick", phase=_unit(1), effect=_unit(3), attempt_id=0 + ) + entries, scores = memory.query_phase(_unit(1)) + assert len(entries) == 1 + assert torch.equal(entries[0].phase, _unit(1)) + assert torch.allclose(scores, torch.ones(1)) + + phases, effects, valid, wrapped_scores = PhaseConditionedPIMRetrieval(memory)(_unit(1)) + assert torch.equal(phases[0], _unit(1)) + assert torch.equal(effects[0], _unit(3)) + assert valid.tolist() == [True] + assert torch.equal(wrapped_scores, scores) + + +def test_zero_gate_is_exact_released_prefix_bypass() -> None: + base = torch.randn(3, 16) + residual = torch.randn_like(base) + valid = torch.tensor([[1, 0], [0, 0], [1, 1]], dtype=torch.bool) + output = inject_causal_prompt(base, residual, torch.zeros(1), valid) + assert torch.equal(output, base) + opened = inject_causal_prompt(base, residual, torch.ones(1), valid) + assert not torch.equal(opened[0], base[0]) + assert torch.equal(opened[1], base[1]) + assert torch.equal(inject_causal_prompt(base, residual, torch.zeros(1), valid), base) + + +def test_prompt_encoder_fuses_task_bit_and_pim_tensors() -> None: + cfg = CausalPromptConfig( + global_dim=8, + phase_dim=4, + effect_dim=4, + brief_length=2, + persistent_length=2, + hidden_dim=8, + num_heads=2, + ) + encoder = CausalPromptEncoder(cfg) + output = encoder( + torch.randn(3, 8), + torch.randn(3, 4), + torch.randn(3, 2, 4), + torch.tensor([[1, 1], [1, 0], [0, 0]], dtype=torch.bool), + torch.randn(3, 2, 4), + torch.randn(3, 2, 4), + torch.tensor([[1, 0], [1, 1], [0, 0]], dtype=torch.bool), + ) + assert output.shape == (3, 8) + assert torch.isfinite(output).all() + + +def test_pim_entries_use_paper_type() -> None: + memory = PersistentInteractionMemory( + PersistentInteractionMemoryConfig(phase_dim=4, effect_dim=4) + ) + memory.reset_episode("pick") + memory.append_completed( + task_cluster="pick", phase=_unit(0), effect=_unit(1), attempt_id=0 + ) + assert isinstance(memory.entries[0], PIMMemoryEntry) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/phase_conditioned_retrieval.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/phase_conditioned_retrieval.py new file mode 100644 index 0000000000000000000000000000000000000000..02af9b091f075f0076cf712879703ae768855385 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/phase_conditioned_retrieval.py @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Phase-conditioned retrieval from Persistent Interaction Memory.""" + +from .persistent_interaction_memory import PhaseConditionedPIMRetrieval + +__all__ = ["PhaseConditionedPIMRetrieval"] diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/policy_injection.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/policy_injection.py new file mode 100644 index 0000000000000000000000000000000000000000..8f675aafa2dde3df8369ce85a657683bee7ba7c3 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/policy_injection.py @@ -0,0 +1,162 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Zeva policy-injection modules for the frozen diffusion policy.""" + +from __future__ import annotations + +from dataclasses import dataclass + +import torch +from torch import Tensor, nn +from torch.nn import functional as F + +from .brief_interaction_trace import BriefInteractionTrace + + +@dataclass +class PolicyInjectionConfig: + global_dim: int = 256 + phase_dim: int = 128 + effect_dim: int = 128 + effect_history_length: int = 4 + action_dim: int = 8 + horizon: int = 32 + num_anchors: int = 8 + hidden_dim: int = 256 + num_heads: int = 4 + min_std: float = 1e-3 + + +class PolicyInjectionPrior(nn.Module): + """Fuse task context, phase, and BIT into an action prior.""" + + def __init__(self, cfg: PolicyInjectionConfig | None = None) -> None: + super().__init__() + self.cfg = cfg or PolicyInjectionConfig() + self.global_to_anchors = nn.Linear(self.cfg.global_dim, self.cfg.num_anchors * self.cfg.hidden_dim) + self.anchor_position = nn.Parameter(torch.empty(1, self.cfg.num_anchors, self.cfg.hidden_dim)) + self.phase_query = nn.Sequential(nn.LayerNorm(self.cfg.phase_dim), nn.Linear(self.cfg.phase_dim, self.cfg.hidden_dim)) + self.effect_project = nn.Sequential(nn.LayerNorm(self.cfg.effect_dim), nn.Linear(self.cfg.effect_dim, self.cfg.hidden_dim)) + self.effect_position = nn.Parameter(torch.empty(1, self.cfg.effect_history_length, self.cfg.hidden_dim)) + self.bos_effect = nn.Parameter(torch.empty(1, 1, self.cfg.effect_dim)) + self.effect_attention = nn.MultiheadAttention(self.cfg.hidden_dim, self.cfg.num_heads, batch_first=True) + self.effect_norm = nn.LayerNorm(self.cfg.hidden_dim) + self.effect_gate = nn.Sequential( + nn.LayerNorm(2 * self.cfg.hidden_dim), nn.Linear(2 * self.cfg.hidden_dim, self.cfg.hidden_dim), nn.Sigmoid() + ) + self.progress_attention = nn.MultiheadAttention(self.cfg.hidden_dim, self.cfg.num_heads, batch_first=True) + self.context_norm = nn.LayerNorm(self.cfg.hidden_dim) + self.distribution_head = nn.Sequential( + nn.Linear(self.cfg.hidden_dim, self.cfg.hidden_dim), + nn.GELU(), + nn.Linear(self.cfg.hidden_dim, 2 * self.cfg.horizon * self.cfg.action_dim), + ) + nn.init.normal_(self.anchor_position, std=0.02) + nn.init.normal_(self.effect_position, std=0.02) + nn.init.normal_(self.bos_effect, std=0.02) + + def init_weights(self) -> None: + """Initialize parameters after the Cosmos meta-device construction path.""" + for module in self.modules(): + if isinstance(module, nn.Linear): + nn.init.xavier_uniform_(module.weight) + if module.bias is not None: + nn.init.zeros_(module.bias) + elif isinstance(module, nn.LayerNorm) and module.elementwise_affine: + nn.init.ones_(module.weight) + nn.init.zeros_(module.bias) + self.progress_attention._reset_parameters() + self.effect_attention._reset_parameters() + nn.init.normal_(self.anchor_position, std=0.02) + nn.init.normal_(self.effect_position, std=0.02) + nn.init.normal_(self.bos_effect, std=0.02) + + def forward( + self, + z_global: Tensor, + z_phase: Tensor, + z_effect: Tensor | BriefInteractionTrace, + effect_valid: Tensor | None = None, + ) -> tuple[Tensor, Tensor]: + """Return Gaussian mean and std, both ``[B,horizon,action_dim]``.""" + if isinstance(z_effect, BriefInteractionTrace): + if effect_valid is not None: + raise ValueError("Pass either BriefInteractionTrace or effect_valid, not both") + effect_valid = z_effect.valid + z_effect = z_effect.effects + if z_global.ndim != 2 or z_global.shape[-1] != self.cfg.global_dim: + raise ValueError(f"Expected z_global [B,{self.cfg.global_dim}], got {tuple(z_global.shape)}") + if z_phase.ndim != 2 or z_phase.shape != (z_global.shape[0], self.cfg.phase_dim): + raise ValueError(f"Expected z_phase [B,{self.cfg.phase_dim}], got {tuple(z_phase.shape)}") + expected_effect_shape = (z_global.shape[0], self.cfg.effect_history_length, self.cfg.effect_dim) + if z_effect.ndim != 3 or z_effect.shape != expected_effect_shape: + raise ValueError( + f"Expected z_effect [B,{self.cfg.effect_history_length},{self.cfg.effect_dim}], " + f"got {tuple(z_effect.shape)}" + ) + if effect_valid is None: + effect_valid = torch.ones(z_effect.shape[:2], dtype=torch.bool, device=z_effect.device) + if effect_valid.shape != z_effect.shape[:2]: + raise ValueError("effect_valid must be [B,effect_history_length]") + anchors = self.global_to_anchors(z_global).view( + -1, self.cfg.num_anchors, self.cfg.hidden_dim + ) + self.anchor_position + phase_query = self.phase_query(z_phase) + bos = self.bos_effect.expand(z_effect.shape[0], self.cfg.effect_history_length, -1) + effect_input = torch.where(effect_valid.unsqueeze(-1), z_effect, bos) + effect_tokens = self.effect_project(effect_input) + self.effect_position + effect_context, _ = self.effect_attention( + phase_query.unsqueeze(1), effect_tokens, effect_tokens, need_weights=False + ) + effect_context = self.effect_norm(effect_context.squeeze(1)) + gate = self.effect_gate(torch.cat((phase_query, effect_context), dim=-1)) + local_query = gate * phase_query + (1.0 - gate) * effect_context + context, _ = self.progress_attention(local_query.unsqueeze(1), anchors, anchors, need_weights=False) + params = self.distribution_head(self.context_norm(context.squeeze(1))) + mean, raw_scale = params.chunk(2, dim=-1) + mean = mean.view(-1, self.cfg.horizon, self.cfg.action_dim) + std = (F.softplus(raw_scale) + self.cfg.min_std).view(-1, self.cfg.horizon, self.cfg.action_dim) + return mean, std + + +def gaussian_prior_nll(target: Tensor, mean: Tensor, std: Tensor, valid: Tensor | None = None) -> Tensor: + """Mean diagonal-Gaussian NLL in raw action coordinates.""" + if target.shape != mean.shape or mean.shape != std.shape: + raise ValueError("target, mean, and std must have the same [B,H,D] shape") + nll = 0.5 * (((target - mean) / std).square() + 2 * std.log()).mean(dim=-1) + if valid is None: + return nll.mean() + if valid.shape != nll.shape: + raise ValueError("valid must have shape [B,H]") + return (nll * valid.to(nll.dtype)).sum() / valid.sum().clamp_min(1) + + +class CausalPromptPolicyAdapter(nn.Module): + """Project the Zeva action prior into frozen-policy action-token space.""" + + def __init__(self, *, action_dim: int = 8, hidden_dim: int = 2048) -> None: + super().__init__() + self.prior_to_action_embedding = nn.Linear(action_dim, hidden_dim, bias=True) + + def init_weights(self) -> None: + nn.init.zeros_(self.prior_to_action_embedding.weight) + nn.init.zeros_(self.prior_to_action_embedding.bias) + + def forward(self, prior_mean: Tensor, *, action_length: int, leading_condition_steps: int = 1) -> Tensor: + if prior_mean.ndim != 3: + raise ValueError("prior_mean must be [B,H,D]") + if action_length < leading_condition_steps: + raise ValueError("action_length must include leading conditioning steps") + if action_length - leading_condition_steps != prior_mean.shape[1]: + raise ValueError("Policy-injection horizon must equal the noisy action-step count") + embedded = self.prior_to_action_embedding(prior_mean) + if leading_condition_steps: + embedded = torch.cat( + ( + embedded.new_zeros((embedded.shape[0], leading_condition_steps, embedded.shape[-1])), + embedded, + ), + dim=1, + ) + return embedded diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/policy_injection_test.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/policy_injection_test.py new file mode 100644 index 0000000000000000000000000000000000000000..4886ff8ffa77c4f2ddf1819d9833f34a453baf1d --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/policy_injection_test.py @@ -0,0 +1,52 @@ +import torch + +from cosmos_framework.model.zeva.policy_injection import ( + CausalPromptPolicyAdapter, + PolicyInjectionConfig, + PolicyInjectionPrior, + gaussian_prior_nll, +) +from cosmos_framework.model.zeva.brief_interaction_trace import BriefInteractionTrace + + +def test_policy_injection_shapes_nll_and_zero_projection() -> None: + prior = PolicyInjectionPrior(PolicyInjectionConfig(horizon=32, action_dim=8)) + effect = torch.randn(3, 4, 128) + valid = torch.tensor([[False, False, False, False], [False, True, True, True], [True, True, True, True]]) + mean, std = prior(torch.randn(3, 256), torch.randn(3, 128), effect, valid) + assert mean.shape == std.shape == (3, 32, 8) + assert torch.isfinite(gaussian_prior_nll(torch.randn_like(mean), mean, std)) + adapter = CausalPromptPolicyAdapter(action_dim=8, hidden_dim=16) + adapter.init_weights() + assert not hasattr(adapter, "residual_gate") + assert torch.equal(adapter(mean, action_length=33), torch.zeros(3, 33, 16)) + + +def test_zero_projection_has_direct_action_gradient() -> None: + """The faithful zero projection must grow without a scalar-gate warmup.""" + adapter = CausalPromptPolicyAdapter(action_dim=8, hidden_dim=16) + adapter.init_weights() + prior = torch.randn(2, 32, 8, requires_grad=True) + target = torch.randn(2, 33, 16) + loss = (adapter(prior, action_length=33) - target).square().mean() + loss.backward() + weight_grad = adapter.prior_to_action_embedding.weight.grad + assert weight_grad is not None + assert torch.count_nonzero(weight_grad) > 0 + + +def test_brief_interaction_trace_tensor_path_is_exact() -> None: + torch.manual_seed(7) + prior = PolicyInjectionPrior(PolicyInjectionConfig(horizon=4, action_dim=2)) + task_context = torch.randn(2, 256) + phase = torch.randn(2, 128) + effects = torch.randn(2, 4, 128) + valid = torch.tensor([[True, True, False, False], [True, True, True, True]]) + tensor_path = prior(task_context, phase, effects, valid) + paper_named = prior( + task_context, + phase, + BriefInteractionTrace(effects=effects, valid=valid), + ) + assert torch.equal(tensor_path[0], paper_named[0]) + assert torch.equal(tensor_path[1], paper_named[1]) diff --git a/releases/bridge-native-v3/code/cosmos_framework/model/zeva/static_task_context_retrieval.py b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/static_task_context_retrieval.py new file mode 100644 index 0000000000000000000000000000000000000000..f7729174c277e0e4019efab0ee6d0926859a909e --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/model/zeva/static_task_context_retrieval.py @@ -0,0 +1,100 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Z-Trans CORPORATION. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Static task-context retrieval, distinct from phase-conditioned PIM retrieval.""" + +from __future__ import annotations + +from dataclasses import asdict, dataclass + +import torch +from torch import Tensor, nn +from torch.nn import functional as F + + +@dataclass(frozen=True) +class StaticTaskContextRetrievalConfig: + input_dim: int = 4096 + hidden_dim: int = 1024 + output_dim: int = 128 + dropout: float = 0.1 + + def as_dict(self) -> dict[str, int | float]: + return asdict(self) + + +class StaticTaskContextRetrievalHead(nn.Module): + """Map a frozen policy readout into the static task-context key space.""" + + def __init__(self, config: StaticTaskContextRetrievalConfig) -> None: + super().__init__() + self.config = config + self.projection = nn.Sequential( + nn.Linear(config.input_dim, config.hidden_dim), + nn.LayerNorm(config.hidden_dim), + nn.GELU(), + nn.Dropout(config.dropout), + nn.Linear(config.hidden_dim, config.output_dim), + ) + + def forward(self, readout: Tensor) -> Tensor: + if readout.ndim != 2 or readout.shape[-1] != self.config.input_dim: + raise ValueError(f"Expected readout [B,{self.config.input_dim}], got {tuple(readout.shape)}") + return F.normalize(self.projection(readout), dim=-1) + + +def bidirectional_supervised_contrastive_loss( + queries: Tensor, + keys: Tensor, + semantic_ids: Tensor, + *, + temperature: float = 0.07, +) -> Tensor: + """Symmetric multi-positive InfoNCE for aligned query/key mini-batches.""" + if queries.ndim != 2 or keys.shape != queries.shape: + raise ValueError(f"Expected aligned [B,D] queries/keys, got {tuple(queries.shape)} and {tuple(keys.shape)}") + if semantic_ids.shape != (queries.shape[0],): + raise ValueError(f"Expected semantic_ids [{queries.shape[0]}], got {tuple(semantic_ids.shape)}") + if temperature <= 0: + raise ValueError("temperature must be positive") + queries = F.normalize(queries.float(), dim=-1) + keys = F.normalize(keys.float(), dim=-1) + logits = queries @ keys.T / temperature + positive = semantic_ids[:, None].eq(semantic_ids[None, :]) + if not positive.diagonal().all(): + raise ValueError("Every aligned query/key pair must be positive") + + def direction_loss(scores: Tensor, mask: Tensor) -> Tensor: + positive_logsumexp = torch.logsumexp(scores.masked_fill(~mask, -torch.inf), dim=1) + all_logsumexp = torch.logsumexp(scores, dim=1) + return (all_logsumexp - positive_logsumexp).mean() + + return 0.5 * (direction_loss(logits, positive) + direction_loss(logits.T, positive.T)) + + +@torch.no_grad() +def retrieve_static_task_context( + queries: Tensor, + memory_keys: Tensor, + memory_values: Tensor, + *, + top_k: int = 5, + temperature: float = 0.07, +) -> tuple[Tensor, Tensor, Tensor]: + """Retrieve and softmax-average frozen task-context values for each query.""" + if queries.ndim != 2 or memory_keys.ndim != 2 or memory_values.ndim != 2: + raise ValueError("queries, memory_keys, and memory_values must be rank-2 tensors") + if queries.shape[-1] != memory_keys.shape[-1]: + raise ValueError("query and memory-key dimensions must match") + if memory_keys.shape[0] != memory_values.shape[0]: + raise ValueError("memory key/value counts must match") + if not 1 <= top_k <= memory_keys.shape[0]: + raise ValueError(f"top_k must be in [1,{memory_keys.shape[0]}]") + if temperature <= 0: + raise ValueError("temperature must be positive") + scores = F.normalize(queries.float(), dim=-1) @ F.normalize(memory_keys.float(), dim=-1).T + top_scores, top_indices = scores.topk(top_k, dim=-1) + weights = F.softmax(top_scores / temperature, dim=-1) + selected = memory_values[top_indices] + values = torch.einsum("bk,bkd->bd", weights.to(selected.dtype), selected) + return values, top_indices, top_scores diff --git a/releases/bridge-native-v3/code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva.py b/releases/bridge-native-v3/code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva.py new file mode 100644 index 0000000000000000000000000000000000000000..930de8ad5f82753974e581f96800fdd2812a1077 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva.py @@ -0,0 +1,957 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""WebSocket inference server for the fixed-base RoboCasa365 Zeva policy. + +The server uses OpenPI's WebsocketPolicyServer and speaks its msgpack+NumPy protocol: + +- on connection, it sends an empty metadata dict; +- each client message is an observation dict; +- each response is a dict with ``action`` and, when enabled, ``video``. + +Example: + + PYTHONPATH=. python -m cosmos_framework.scripts.action_policy_server_robocasa365 \ + --checkpoint-path /path/to/iter_000010000 \ + --experiment action_policy_robocasa365_atomic5_nano \ + --domain-name robocasa-panda-omron \ + --port 8000 +""" + +# Initialize the script runtime before any cosmos-framework imports, mirroring +# the LIBERO server. The shared helpers below (single-rank distributed init, +# local IP discovery, frozen-config EMA disable) live in +# ``action_policy_server_utils`` so this module doesn't have to import from +# the sibling LIBERO server just to share runtime utilities. +from cosmos_framework.inference.common.init import init_script + +init_script() + +import json +import socket +import threading +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Literal + +import numpy as np +import pydantic +import torch +import torch.nn.functional as F +import tyro + +from cosmos_framework.data.generator.action.domain_utils import get_domain_id +from cosmos_framework.data.generator.action.json_formatter import ActionPromptJsonFormatter +from cosmos_framework.data.generator.action.pose_utils import ( + build_abs_pose_from_components, + convert_rotation, + pose_abs_to_rel, + pose_rel_to_abs, +) +from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline +from cosmos_framework.data.generator.joint_dataloader import IterativeJointDataLoader +from cosmos_framework.data.generator.sequence_packing import SequencePlan +from cosmos_framework.model.zeva import ( + CausalTransitionEncoder, + CausalTransitionEncoderConfig, + StaticTaskContextRetrievalConfig, + StaticTaskContextRetrievalHead, + normalize_cte_state_dict, + retrieve_static_task_context, +) +from cosmos_framework.inference.args import OmniSetupArgs, OmniSetupOverrides +from cosmos_framework.inference.common.args import ConfigFileType, ConfigOverrides, tyro_cli +from cosmos_framework.inference.common.config import deserialize_config, deserialize_config_dict, load_config +from cosmos_framework.inference.common.init import init_output_dir +from cosmos_framework.inference.inference import OmniInference +from cosmos_framework.scripts.action_policy_server_utils import ( + DEFAULT_FALLBACK_OUTPUT_DIR, + disable_runtime_ema_for_frozen_config, + get_local_ip, + maybe_init_distributed, +) +from cosmos_framework.model.generator.utils.data_and_condition import GenerationDataClean +from cosmos_framework.utils import log +from cosmos_framework.utils.checkpoint_db import CheckpointDirHf + +_DEFAULT_DROID_POLICY_CHECKPOINT = "nvidia/Cosmos3-Nano-Policy-DROID" +_DEFAULT_CONDITIONING_FPS = 20.0 +_DEFAULT_ACTION_CHUNK_SIZE = 32 +_DEFAULT_IMAGE_HEIGHT = 256 +_DEFAULT_IMAGE_WIDTH = 512 +_DEFAULT_ACTION_DIM = 7 +_DEFAULT_ROBOLAB_OUTPUT_DIR = DEFAULT_FALLBACK_OUTPUT_DIR / "robolab" +_CONCAT_VIEW_DESCRIPTION = "The left panel is the left agent view and the right panel is the wrist view." +_DEFAULT_HF_REVISION = "main" +_ROBOLAB_POLICY_HF_REPOSITORIES = { + "Cosmos3-Nano-Policy-DROID": "nvidia/Cosmos3-Nano-Policy-DROID", + "nvidia/Cosmos3-Nano-Policy-DROID": "nvidia/Cosmos3-Nano-Policy-DROID", + "Cosmos3-Edge-Policy-DROID": "nvidia/Cosmos3-Edge-Policy-DROID", + "nvidia/Cosmos3-Edge-Policy-DROID": "nvidia/Cosmos3-Edge-Policy-DROID", +} + +ActionSpace = Literal["joint_pos", "midtrain"] + + +def format_action_prompt(instruction: str) -> str: + """Format a RoboCasa instruction exactly as the static retrieval head saw it.""" + sample = { + "ai_caption": instruction.strip(), + "video": torch.empty((3, 33, 1, 1), dtype=torch.uint8), + "conditioning_fps": torch.tensor(20.0), + "image_size": torch.tensor([480, 832, 480, 832]), + "viewpoint": "concat_view", + "additional_view_description": _CONCAT_VIEW_DESCRIPTION, + "mode": "wam", + } + formatted = ActionPromptJsonFormatter(caption_key="ai_caption")(sample)["ai_caption"] + return json.dumps(formatted) if isinstance(formatted, dict) else str(formatted) + + +@torch.inference_mode() +def extract_batch(model, latent_batch: torch.Tensor, prompts: list[str]) -> torch.Tensor: + """Extract clean initial-image policy readouts used by static task-context retrieval.""" + batch_size = len(prompts) + plans = [ + SequencePlan(has_text=True, has_vision=True, condition_frame_indexes_vision=[0]) + for _ in prompts + ] + token_ids = model._tokenize_captions( + prompts, + use_system_prompt=bool(model.vlm_config.use_system_prompt), + system_prompt=None, + is_video=False, + ) + clean = GenerationDataClean( + batch_size=batch_size, + is_image_batch=True, + x0_tokens_vision=[latent_batch[i].unsqueeze(0).unsqueeze(2) for i in range(batch_size)], + fps_vision=torch.full((batch_size,), 20.0), + ) + packed = model._pack_input_sequence( + plans, + token_ids, + clean, + torch.zeros(batch_size, dtype=torch.float32), + include_end_of_generation_token=model._derive_include_end_of_generation_token(), + ) + if packed.behavior_indexes.numel() != 0: + raise RuntimeError("Clean task-context extraction unexpectedly contains Zeva prefix tokens") + packed.to_cuda() + with torch.autocast(device_type="cuda", dtype=torch.bfloat16): + output = model.net(packed_seq=packed) + hidden = output["last_hidden_state"] + indexes = packed.vision.sequence_indexes + readouts = [] + sample_start = 0 + for sample_length in packed.sample_lens: + sample_end = sample_start + sample_length + sample_indexes = indexes[(indexes >= sample_start) & (indexes < sample_end)] + readouts.append(hidden.index_select(0, sample_indexes).mean(dim=0)) + sample_start = sample_end + return torch.stack(readouts).float().cpu() + + +def _load_checkpoint_metadata(checkpoint_path: str) -> dict[str, Any] | None: + if "://" in checkpoint_path: + return None + checkpoint_dir = Path(checkpoint_path).expanduser().absolute() + if (checkpoint_dir / "model").is_dir(): + checkpoint_dir = checkpoint_dir / "model" + metadata_path = checkpoint_dir / "checkpoint.json" + if not metadata_path.exists(): + return None + return deserialize_config_dict(metadata_path) + + +def _load_training_config_from_metadata(metadata: dict[str, Any]) -> Any | None: + config_file = metadata.get("config_file") + if not isinstance(config_file, str) or not config_file: + return None + config_overrides = ConfigOverrides( + config_file=config_file, + experiment=str(metadata.get("experiment", "")), + experiment_overrides=list(metadata.get("experiment_overrides", [])), + ) + config_args = config_overrides.build_config() + if config_args.config_file_type == ConfigFileType.MODULE: + return load_config(config_args.config_file, config_args.experiment, overrides=config_args.experiment_overrides) + return deserialize_config(Path(config_args.config_file)) + + +def _load_training_config(setup_args: OmniSetupArgs, checkpoint_path: str) -> Any | None: + metadata = _load_checkpoint_metadata(checkpoint_path) + if metadata is not None: + try: + config = _load_training_config_from_metadata(metadata) + except Exception as exc: + log.warning(f"[robolab-policy-server] could not load checkpoint metadata config for transforms: {exc}") + config = None + if config is not None: + return config + + if setup_args.config_file_type == ConfigFileType.MODULE and not setup_args.experiment: + return None + + try: + return setup_args.load_config() + except Exception as exc: + log.warning(f"[robolab-policy-server] could not load training config for transforms: {exc}") + return None + + +def _resolve_checkpoint_path(checkpoint_path: str, *, hf_revision: str) -> str: + if Path(checkpoint_path).expanduser().exists(): + return checkpoint_path + + repository = _ROBOLAB_POLICY_HF_REPOSITORIES.get(checkpoint_path) + if repository is None: + return checkpoint_path + + log.info( + f"[robolab-policy-server] downloading consolidated checkpoint from Hugging Face: " + f"repository={repository!r} revision={hf_revision!r}" + ) + return CheckpointDirHf(repository=repository, revision=hf_revision).download() + + +def _validate_checkpoint(checkpoint_path: str, *, allow_dcp_checkpoint: bool) -> None: + if checkpoint_path in OmniSetupOverrides.CHECKPOINTS: + return + if "://" in checkpoint_path: + if allow_dcp_checkpoint: + return + raise ValueError( + "RoboLab OSS serving expects a consolidated local safetensors checkpoint directory, not a DCP path. " + "Run cosmos_framework.scripts.export_model first and pass the exported model directory, or pass " + "--allow-dcp-checkpoint to opt into direct DCP loading." + ) + + checkpoint_dir = Path(checkpoint_path).expanduser().absolute() + if (checkpoint_dir / "model").is_dir(): + checkpoint_dir = checkpoint_dir / "model" + if any(checkpoint_dir.glob("*.distcp")): + if allow_dcp_checkpoint: + return + raise ValueError( + "RoboLab OSS serving expects a consolidated safetensors checkpoint, but found a DCP checkpoint. " + "Run cosmos_framework.scripts.export_model first and pass the exported model directory, or pass " + "--allow-dcp-checkpoint to opt into direct DCP loading." + ) + has_config = (checkpoint_dir / "config.json").exists() + has_consolidated_safetensors = any(checkpoint_dir.glob("*.safetensors")) + has_diffusers_safetensors_index = (checkpoint_dir / "model.safetensors.index.json").exists() + if not checkpoint_dir.is_dir() or not has_config or not ( + has_consolidated_safetensors or has_diffusers_safetensors_index + ): + raise ValueError(f"Invalid safetensors checkpoint directory: {checkpoint_dir}") + + +def _ensure_rgb_uint8_image(value: Any, key: str) -> np.ndarray: + image = np.asarray(value) + if image.ndim != 3 or image.shape[-1] != 3: + raise ValueError(f"{key!r} must have shape [H,W,3], got {image.shape}") + if image.dtype != np.uint8: + image = np.clip(image, 0, 255).astype(np.uint8) + return np.ascontiguousarray(image) + + +def _ensure_2d_float_array(value: Any, key: str, width: int | None = None) -> np.ndarray: + array = np.asarray(value, dtype=np.float32) + if array.ndim == 1: + array = array[None, :] + if array.ndim != 2: + raise ValueError(f"{key!r} must have shape [T,D] or [D], got {array.shape}") + if width is not None and array.shape[-1] != width: + raise ValueError(f"{key!r} must have width {width}, got {array.shape[-1]}") + return np.ascontiguousarray(array) + + +def _ensure_gripper_array(value: Any) -> np.ndarray: + array = np.asarray(value, dtype=np.float32) + if array.ndim == 0: + array = array.reshape(1, 1) + elif array.ndim == 1: + array = array[:, None] + if array.ndim != 2 or array.shape[-1] != 1: + raise ValueError(f"'observation/gripper_position' must have shape [T,1], [T], or scalar, got {array.shape}") + return np.ascontiguousarray(array) + + +def _resize_rgb_uint8(image: np.ndarray, size: tuple[int, int]) -> np.ndarray: + tensor = torch.from_numpy(image).permute(2, 0, 1).unsqueeze(0).float() # [1,3,H,W] + resized = F.interpolate(tensor, size=size, mode="bilinear", align_corners=False) # [1,3,H2,W2] + return resized.squeeze(0).permute(1, 2, 0).numpy().astype(np.uint8) # [H2,W2,3] + + +def _compose_roboarena_views(obs: dict[str, Any]) -> np.ndarray | None: + required_keys = ( + "observation/wrist_image_left", + "observation/exterior_image_1_left", + "observation/exterior_image_2_left", + ) + if not all(key in obs for key in required_keys): + return None + wrist = _ensure_rgb_uint8_image(obs["observation/wrist_image_left"], "observation/wrist_image_left") + left_raw = _ensure_rgb_uint8_image(obs["observation/exterior_image_1_left"], "observation/exterior_image_1_left") + right_raw = _ensure_rgb_uint8_image(obs["observation/exterior_image_2_left"], "observation/exterior_image_2_left") + half_h, half_w = wrist.shape[0] // 2, wrist.shape[1] // 2 + left = _resize_rgb_uint8(left_raw, (half_h, half_w)) + right = _resize_rgb_uint8(right_raw, (half_h, half_w)) + return np.concatenate([wrist, np.concatenate([left, right], axis=1)], axis=0) + + +def _extract_observation_image(obs: dict[str, Any]) -> np.ndarray: + if "observation/image" in obs: + return _ensure_rgb_uint8_image(obs["observation/image"], "observation/image") + image = _compose_roboarena_views(obs) + if image is not None: + return image + raise ValueError("Observation must contain 'observation/image' or RoBoArena wrist/exterior image keys") + + +def _build_data_batch_from_sample(sample: dict[str, Any]) -> dict[str, Any]: + data_batch: dict[str, Any] = {} + for key, value in sample.items(): + if key in IterativeJointDataLoader._MULTI_ITEM_KEYS: + data_batch[key] = [[value]] + elif isinstance(value, torch.Tensor): + data_batch[key] = [value.unsqueeze(0)] # value: [...], batch item: [1,...] + else: + data_batch[key] = [value] + return data_batch + + +def _load_openpi_websocket_policy_server() -> type[Any]: + try: + from openpi_server.websocket_policy_server import WebsocketPolicyServer + except ModuleNotFoundError: + try: + from openpi.serving.websocket_policy_server import WebsocketPolicyServer + except ModuleNotFoundError as exc: + raise ModuleNotFoundError( + "RoboLab WebSocket serving uses OpenPI's WebsocketPolicyServer. Install it with " + "`uv sync --all-extras --group=cu130-train --group=policy-server`, " + "or install the full Physical-Intelligence/openpi package." + ) from exc + return WebsocketPolicyServer + + +class _DummyDataset(torch.utils.data.IterableDataset): + def __iter__(self) -> Any: + return iter(()) + + +@dataclass(frozen=True) +class RobolabPolicyConfig: + checkpoint_path: str + domain_name: str + decode_video: bool + seed: int + deterministic_seed: bool + guidance: float + num_steps: int + shift: float + conditioning_fps: float + resolution: str | None + action_chunk_size: int + action_dim: int + image_height: int = _DEFAULT_IMAGE_HEIGHT + image_width: int = _DEFAULT_IMAGE_WIDTH + action_space: ActionSpace = "joint_pos" + use_state: bool = True + history_length: int = 1 + proprio_dim: int = 9 + + +class RobolabServerArgs(pydantic.BaseModel): + model_config = pydantic.ConfigDict(extra="forbid", use_attribute_docstrings=True) + + checkpoint_path: str = _DEFAULT_DROID_POLICY_CHECKPOINT + """Consolidated local safetensors checkpoint directory, registered checkpoint name, or DCP path with --allow-dcp-checkpoint.""" + hf_revision: str = _DEFAULT_HF_REVISION + """Hugging Face revision used when --checkpoint-path is a supported public RoboLab policy repository.""" + allow_dcp_checkpoint: bool = False + """If set, allow direct DCP/S3 checkpoint loading instead of requiring a consolidated safetensors export.""" + experiment: str | None = None + """Experiment name for DCP checkpoints using module configs, e.g. droid_lerobot_8b_policy.""" + experiment_overrides: list[str] = pydantic.Field(default_factory=list) + """Hydra experiment overrides forwarded to OmniSetup for DCP checkpoint loading.""" + credential_path: str | None = None + """Optional checkpoint object-store credential path for DCP/S3 loading.""" + + port: int = 8000 + """WebSocket port to bind.""" + host: str = "0.0.0.0" + """WebSocket host to bind.""" + domain_name: str = "robocasa-panda-omron" + """Action domain name passed to get_domain_id().""" + decode_video: bool = False + """If set, decode and return the predicted rollout video as a uint8 NumPy array.""" + guardrails: bool = False + """Enable text/video guardrails. Robot policy inference keeps these disabled by default.""" + + output_dir: Path | None = None + """Output directory for OmniInference. Defaults to /tmp/cosmos3_action_server/robolab.""" + sampler: Literal["unipc", "edm"] = "unipc" + """Diffusion sampler used by OmniInference.""" + + seed: int = 0 + """Base generation seed used to initialize the request RNG.""" + deterministic_seed: bool = False + """Use the same seed for every request. The official server advances the RNG by default.""" + guidance: float = 3.0 + """Guidance scale for denoising.""" + num_steps: int = 4 + """Number of denoising steps.""" + shift: float = 5.0 + """UniPC sampler shift.""" + + resolution: str | None = "480" + """Action transform resolution. The default matches the released DROID RoboLab policy.""" + conditioning_fps: float | None = _DEFAULT_CONDITIONING_FPS + """Conditioning FPS. The default matches the released DROID RoboLab policy.""" + action_chunk_size: int | None = _DEFAULT_ACTION_CHUNK_SIZE + """Number of action steps to predict. The default matches the released DROID RoboLab policy.""" + action_dim: int | None = _DEFAULT_ACTION_DIM + """Raw action dimension. The default matches the released DROID RoboLab policy.""" + image_height: int = _DEFAULT_IMAGE_HEIGHT + """Input observation image height. The default matches the released DROID RoboLab policy.""" + image_width: int = _DEFAULT_IMAGE_WIDTH + """Input observation image width. The default matches the released DROID RoboLab policy.""" + action_space: ActionSpace = "joint_pos" + """RoboLab action representation to serve.""" + use_state: bool = False + """Include action state in the policy input.""" + history_length: int = 0 + """State/history action rows to trim from the generated action output.""" + format_prompt_as_json: bool | None = None + """Override structured JSON prompting. The Atomic-5 service defaults this to true.""" + proprio_dim: int = 9 + """Independent fixed-base proprio input: relative EEF pose (7) plus gripper qpos (2).""" + task_context_bank: Path | None = None + """Task-context bank used by Zeva.""" + cte_checkpoint: Path | None = None + """Frozen CTE checkpoint used to derive phase and causal-effect features.""" + task_context_instruction: str | None = None + """Optional task key used to select a task-context prototype.""" + static_task_context_checkpoint: Path | None = None + """Static task-context retrieval head, mutually exclusive with the task-ID oracle.""" + static_task_context_top_k: int = 5 + """Number of retrieved entries used to form the task-context token.""" + bit_mode: Literal["normal", "zero", "shuffled"] = "normal" + """Evaluation ablation for completed causal effects; never use outside controlled diagnostics.""" + disable_policy_injection: bool = False + """Diagnostic only: zero the policy adapter and task-context projector.""" + + +class RobolabPolicyService: + def __init__(self, args: RobolabServerArgs) -> None: + if not torch.cuda.is_available(): + raise RuntimeError("CUDA is required for OmniMoTModel inference in this repo.") + resolved_checkpoint_path = _resolve_checkpoint_path(args.checkpoint_path, hf_revision=args.hf_revision) + args = args.model_copy(update={"checkpoint_path": resolved_checkpoint_path}) + _validate_checkpoint(args.checkpoint_path, allow_dcp_checkpoint=args.allow_dcp_checkpoint) + maybe_init_distributed() + + setup_args = self._build_setup_args(args) + log.info( + f"[robolab-policy-server] loading model: checkpoint_path={setup_args.checkpoint_path!r} " + f"config_file={setup_args.config_file!r} experiment={setup_args.experiment!r}" + ) + pipe = OmniInference.create(setup_args) + self.pipe: OmniInference = pipe + self.model = pipe.model + self.model.eval() + assert isinstance(pipe.setup_args, OmniSetupArgs) + self.setup_args: OmniSetupArgs = pipe.setup_args + + training_config = _load_training_config(self.setup_args, args.checkpoint_path) + self._transform, inferred = self._build_transform(training_config, args) + self.cfg = RobolabPolicyConfig( + checkpoint_path=self.setup_args.checkpoint_path, + domain_name=args.domain_name, + decode_video=bool(args.decode_video), + seed=int(args.seed), + deterministic_seed=bool(args.deterministic_seed), + guidance=float(args.guidance), + num_steps=int(args.num_steps), + shift=float(args.shift), + conditioning_fps=float( + args.conditioning_fps or inferred.get("conditioning_fps") or _DEFAULT_CONDITIONING_FPS + ), + resolution=args.resolution or inferred.get("resolution"), + action_chunk_size=int( + args.action_chunk_size or inferred.get("action_chunk_size") or _DEFAULT_ACTION_CHUNK_SIZE + ), + action_dim=int(args.action_dim or (8 if args.action_space == "joint_pos" else 10)), + image_height=int(args.image_height), + image_width=int(args.image_width), + action_space=args.action_space, + use_state=bool(args.use_state), + history_length=int(args.history_length), + proprio_dim=int(args.proprio_dim), + ) + if self.cfg.history_length < (1 if self.cfg.use_state else 0): + raise ValueError("--history-length must be >= 1 when --use-state is true") + if self.cfg.image_height <= 0 or self.cfg.image_width <= 0: + raise ValueError("--image-height and --image-width must be positive") + + self._init_zeva(args) + self._lock = threading.Lock() + self._rng = np.random.default_rng(self.cfg.seed) + resolved_domain_id = get_domain_id(self.cfg.domain_name) + log.info( + f"[robolab-policy-server] ready domain={self.cfg.domain_name!r} domain_id={resolved_domain_id} " + f"resolution={self.cfg.resolution!r} " + f"action_space={self.cfg.action_space} action_dim={self.cfg.action_dim} " + f"chunk={self.cfg.action_chunk_size} history={self.cfg.history_length} use_state={self.cfg.use_state} " + f"image={self.cfg.image_height}x{self.cfg.image_width} fps={self.cfg.conditioning_fps} " + f"guidance={self.cfg.guidance} num_steps={self.cfg.num_steps} shift={self.cfg.shift} " + f"prompt_json={inferred.get('format_prompt_as_json')} seed={self.cfg.seed} " + f"deterministic_seed={self.cfg.deterministic_seed}" + ) + + def _build_setup_args(self, args: RobolabServerArgs) -> OmniSetupArgs: + setup_overrides: dict[str, Any] = { + "checkpoint_path": args.checkpoint_path, + "output_dir": args.output_dir or _DEFAULT_ROBOLAB_OUTPUT_DIR, + "sampler": args.sampler, + "guardrails": args.guardrails, + } + if args.experiment is not None: + setup_overrides["experiment"] = args.experiment + if args.experiment_overrides: + setup_overrides["experiment_overrides"] = list(args.experiment_overrides) + if args.credential_path is not None: + setup_overrides["credential_path"] = args.credential_path + overrides = OmniSetupOverrides.model_validate(setup_overrides) + setup_args = overrides.build_setup() + init_output_dir(setup_args.output_dir) + return disable_runtime_ema_for_frozen_config(setup_args) + + def _build_transform(self, training_config: Any | None, args: RobolabServerArgs) -> tuple[Any, dict[str, Any]]: + inferred: dict[str, Any] = {} + model_max_action_dim = getattr(getattr(self.model, "config", None), "max_action_dim", None) + max_action_dim = int(model_max_action_dim) if isinstance(model_max_action_dim, int) else 64 + + try: + action_dataset_config = training_config.dataloader_train.dataloader.datasets["robocasa365"].dataset + except (AttributeError, KeyError, TypeError): + action_dataset_config = None + + if action_dataset_config is None: + format_json = True if args.format_prompt_as_json is None else bool(args.format_prompt_as_json) + inferred["format_prompt_as_json"] = format_json + log.warning( + "[robolab-policy-server] no training action dataset config found; using default " + f"ActionTransformPipeline (format_prompt_as_json={format_json})" + ) + return ( + ActionTransformPipeline( + max_action_dim=max_action_dim, + cfg_dropout_rate=0.0, + format_prompt_as_json=format_json, + ), + inferred, + ) + + chunk_length = getattr(action_dataset_config, "chunk_length", None) + if isinstance(chunk_length, int): + inferred["action_chunk_size"] = chunk_length + fps = getattr(action_dataset_config, "fps", None) + if isinstance(fps, (int, float)): + inferred["conditioning_fps"] = float(fps) + configured_resolution = getattr(action_dataset_config, "resolution", None) + if configured_resolution is not None: + inferred["resolution"] = str(configured_resolution) + + format_json = bool(getattr(action_dataset_config, "format_prompt_as_json", True)) + if args.format_prompt_as_json is not None: + format_json = bool(args.format_prompt_as_json) + inferred["format_prompt_as_json"] = format_json + transform = ActionTransformPipeline( + tokenizer_config=getattr(action_dataset_config, "tokenizer_config", None), + cfg_dropout_rate=0.0, + max_action_dim=max_action_dim, + append_viewpoint_info=bool(getattr(action_dataset_config, "append_viewpoint_info", True)), + append_duration_fps_timestamps=bool( + getattr(action_dataset_config, "append_duration_fps_timestamps", True) + ), + append_resolution_info=bool(getattr(action_dataset_config, "append_resolution_info", True)), + append_idle_frames=bool(getattr(action_dataset_config, "append_idle_frames", False)), + format_prompt_as_json=bool(format_json), + ) + return transform, inferred + + def _next_seed(self) -> int: + if self.cfg.deterministic_seed: + return self.cfg.seed + return int(self._rng.integers(0, 2**31)) + + def _init_zeva(self, args: RobolabServerArgs) -> None: + """Load the CTE and task-context retrieval components.""" + artifacts = ( + args.task_context_bank, + args.cte_checkpoint, + args.task_context_instruction, + args.static_task_context_checkpoint, + ) + if not any(item is not None for item in artifacts): + self._zeva_enabled = False + return + if args.task_context_bank is None or args.cte_checkpoint is None: + raise ValueError( + "Zeva serving requires --task-context-bank and --cte-checkpoint" + ) + if (args.task_context_instruction is None) == (args.static_task_context_checkpoint is None): + raise ValueError( + "Provide exactly one of --task-context-instruction or --static-task-context-checkpoint" + ) + if args.static_task_context_top_k < 1: + raise ValueError("--static-task-context-top-k must be positive") + self._bit_mode = args.bit_mode + assert args.task_context_bank is not None + assert args.cte_checkpoint is not None + if not args.task_context_bank.is_file() or not args.cte_checkpoint.is_file(): + raise FileNotFoundError("Zeva artifacts must be regular files") + if getattr(self.model.net, "behavior_pbd", None) is None: + raise ValueError("Loaded policy has no Zeva policy-injection prior; refusing oracle-effect evaluation") + if args.disable_policy_injection: + for name in ("behavior_adapter", "behavior_global_projector"): + module = getattr(self.model.net, name, None) + if module is None: + raise ValueError(f"Loaded policy has no {name} for zero-residual ablation") + for parameter in module.parameters(): + parameter.data.zero_() + log.info("[robolab-policy-server] zeroed Zeva policy injection for ablation") + + device = next(self.model.parameters()).device + bank = torch.load(args.task_context_bank, map_location="cpu", weights_only=True) + entries = bank.get("entries") + if not isinstance(entries, list) or not entries: + raise ValueError(f"Task-context bank has no entries: {args.task_context_bank}") + self._static_task_context_enabled = args.static_task_context_checkpoint is not None + if self._static_task_context_enabled: + assert args.static_task_context_checkpoint is not None + if not args.static_task_context_checkpoint.is_file(): + raise FileNotFoundError(f"Static task-context checkpoint not found: {args.static_task_context_checkpoint}") + retrieval_payload = torch.load(args.static_task_context_checkpoint, map_location="cpu", weights_only=True) + supported_formats = { + "zeva_retrieval_head_v1", + "cosmos_" + "behavior_retrieval_head_v1", + } + if retrieval_payload.get("format") not in supported_formats: + raise ValueError("Unsupported static task-context checkpoint") + self._static_task_context_head = StaticTaskContextRetrievalHead( + StaticTaskContextRetrievalConfig(**retrieval_payload["config"]) + ).to(device) + self._static_task_context_head.load_state_dict(retrieval_payload["model"]) + self._static_task_context_head.eval() + self._static_task_context_keys = torch.stack([entry["retrieval_key"].float() for entry in entries]).to(device) + self._static_task_context_values = torch.stack([entry["behavior_value"].float() for entry in entries]).to(device) + if self._static_task_context_keys.shape[-1] != self._static_task_context_head.config.output_dim: + raise ValueError("Static task-context output dimension does not match bank retrieval keys") + self._static_task_context_top_k = min(args.static_task_context_top_k, len(entries)) + else: + assert args.task_context_instruction is not None + matching = [ + entry["behavior_value"].float() + for entry in entries + if entry.get("instruction") == args.task_context_instruction + ] + if not matching: + available = sorted({str(entry.get("instruction", "")) for entry in entries}) + raise ValueError(f"No memory-bank entries for {args.task_context_instruction!r}; available={available}") + self._task_context = torch.stack(matching).mean(dim=0, keepdim=True).to(device=device) + payload = torch.load(args.cte_checkpoint, map_location="cpu", weights_only=False) + cte_model_config = dict(payload["model_config"]) + cte_state = payload["model"] + # Early GRU checkpoints were exported with ``use_mamba=True`` in their + # metadata even though their state dict contains nn.GRU parameters. + # Infer the serialized architecture from its keys so installing + # mamba_ssm later cannot silently change the model being constructed. + if any(key.endswith("mixer.weight_ih_l0") for key in cte_state): + cte_model_config["use_mamba"] = False + elif any(key.endswith("mixer.A_log") for key in cte_state): + cte_model_config["use_mamba"] = True + self._cte = CausalTransitionEncoder(CausalTransitionEncoderConfig(**cte_model_config)).to(device) + self._cte.load_state_dict(normalize_cte_state_dict(cte_state)) + self._cte.eval() + if self._cte.cfg.action_dim != self.cfg.action_dim: + raise ValueError("CTE action dimension does not match policy action dimension") + self._zeva_enabled = True + if self._static_task_context_enabled: + log.info( + "[robolab-policy-server] static task-context retrieval enabled " + f"bank_entries={len(entries)} top_k={self._static_task_context_top_k}" + ) + else: + log.info( + "[robolab-policy-server] task-context prototype enabled " + f"task={args.task_context_instruction!r} bank_entries={len(matching)}" + ) + + def _encode_cte_frame(self, image: np.ndarray) -> torch.Tensor: + """Map one observed concatenated RGB image to the CTE's Wan latent.""" + device = next(self.model.parameters()).device + frame = torch.from_numpy(np.ascontiguousarray(image)).to(device=device, dtype=torch.float32) + frame = frame.permute(2, 0, 1).unsqueeze(0) + frame = F.interpolate(frame, size=(480, 832), mode="bilinear", align_corners=False) + latent = self.model.encode(frame.unsqueeze(2).div_(127.5).sub_(1.0)) + if latent.ndim != 5 or latent.shape[:3] != (1, self._cte.cfg.image_channels, 1): + raise RuntimeError(f"Unexpected Wan latent for CTE: {tuple(latent.shape)}") + return latent[0, :, 0].float().contiguous() + + def _task_context_from_initial_observation(self, image: np.ndarray, prompt: str) -> torch.Tensor: + """Retrieve static task context from the initial observation and instruction.""" + if not self._static_task_context_enabled: + return self._task_context + latent = self._encode_cte_frame(image).unsqueeze(0) + readout = extract_batch(self.model, latent, [format_action_prompt(prompt)]).to( + device=latent.device, dtype=torch.float32 + ) + with torch.autocast(device_type="cuda", dtype=torch.bfloat16): + query = self._static_task_context_head(readout) + values, _, _ = retrieve_static_task_context( + query, + self._static_task_context_keys, + self._static_task_context_values, + top_k=self._static_task_context_top_k, + ) + return values.float() + + def _causal_interaction_features(self, obs: dict[str, Any], image: np.ndarray) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: + """Return task-cluster global plus causal phase/four-effect history. + + ``cte_boundary_images`` contains observations at raw offsets + 0,4,8,...; ``cte_transition_actions`` contains the corresponding + executed [4,arm7] transitions. Thus an effect token becomes readable + only after four completed transitions (16 raw controls). + """ + if not self._zeva_enabled: + raise RuntimeError("Zeva causal-interaction features are not configured") + frames_rgb = np.asarray(obs.get("cte_boundary_images", np.expand_dims(image, axis=0))) + transitions = np.asarray( + obs.get("cte_transition_actions", np.empty((0, 4, self.cfg.action_dim), dtype=np.float32)), + dtype=np.float32, + ) + if frames_rgb.ndim != 4 or frames_rgb.shape[-1] != 3: + raise ValueError(f"cte_boundary_images must be [T,H,W,3], got {frames_rgb.shape}") + if transitions.shape != (frames_rgb.shape[0] - 1, 4, self.cfg.action_dim): + raise ValueError( + "cte_transition_actions must be [T-1,4,arm7], got " + f"{transitions.shape} for T={frames_rgb.shape[0]}" + ) + latents = torch.stack([self._encode_cte_frame(_ensure_rgb_uint8_image(frame, "cte_boundary_images")) for frame in frames_rgb]) + frames = latents.unsqueeze(0) + actions = torch.from_numpy(np.ascontiguousarray(transitions)).to(device=frames.device, dtype=torch.float32).unsqueeze(0) + valid = torch.ones((1, frames.shape[1]), dtype=torch.bool, device=frames.device) + transition_valid = torch.ones(actions.shape[:-1], dtype=torch.bool, device=frames.device) + with torch.autocast(device_type="cuda", dtype=torch.bfloat16): + encoded = self._cte(frames, actions, valid, transition_valid) + completed = encoded["effect_post"][0][encoded["effect_complete"][0]].float() + history = torch.zeros((1, 4, self._cte.cfg.effect_dim), dtype=torch.float32, device=frames.device) + history_valid = torch.zeros((1, 4), dtype=torch.bool, device=frames.device) + take = min(4, completed.shape[0]) + if take: + history[0, -take:] = completed[-take:] + history_valid[0, -take:] = True + if self._bit_mode == "zero": + # Preserve temporal availability while removing effect content. + history.zero_() + elif self._bit_mode == "shuffled" and take > 1: + # Reverse only completed slots and keep their right-aligned causal positions. + history[0, -take:] = history[0, -take:].flip(dims=(0,)) + global_feature = self._task_context_from_initial_observation(frames_rgb[0], str(obs["prompt"])) + return global_feature, encoded["phase"][:, -1].float(), history, history_valid + + def _build_sample(self, obs: dict[str, Any]) -> dict[str, Any]: + prompt = obs.get("prompt") + if not isinstance(prompt, str): + raise ValueError("'prompt' must be a string") + + image = _extract_observation_image(obs) + image_h = self.cfg.image_height + image_w = self.cfg.image_width + if image.shape[:2] != (image_h, image_w): + image = _resize_rgb_uint8(image, (image_h, image_w)) + t_frames = self.cfg.action_chunk_size + 1 + video = torch.zeros((3, t_frames, image_h, image_w), dtype=torch.uint8) # [3,T,H,W] + video[:, 0] = torch.from_numpy(image.copy()).permute(2, 0, 1) # [3,H,W] + + use_state_rows = 1 if self.cfg.use_state else 0 + action = torch.zeros( + (self.cfg.action_chunk_size + use_state_rows, self.cfg.action_dim), + dtype=torch.float32, + ) # [T,D] + history_action: torch.Tensor | None = None + num_history_rows = self.cfg.history_length - use_state_rows + gripper_position: np.ndarray | None = None + if self.cfg.use_state or num_history_rows > 0: + gripper_position = 1.0 - _ensure_gripper_array(obs["observation/gripper_position"]) + + if self.cfg.action_space == "joint_pos" and (self.cfg.use_state or num_history_rows > 0): + joint_position = _ensure_2d_float_array(obs["observation/joint_position"], "observation/joint_position", 7) + if self.cfg.use_state: + assert gripper_position is not None + action[0] = torch.from_numpy(np.concatenate((joint_position[-1], gripper_position[-1]))) # [D] + if num_history_rows > 0: + assert gripper_position is not None + if len(joint_position) < num_history_rows + 1: + raise ValueError("Not enough joint_position rows for requested history_length") + history_np = np.concatenate( + (joint_position[-num_history_rows - 1 : -1], gripper_position[-num_history_rows - 1 : -1]), + axis=-1, + ) + history_action = torch.from_numpy(history_np).float() # [H,D] + + if self.cfg.action_space == "midtrain" and (self.cfg.use_state or num_history_rows > 0): + eef_pos = _ensure_2d_float_array(obs["observation/eef_pos"], "observation/eef_pos", 3) + eef_quat = _ensure_2d_float_array(obs["observation/eef_quat"], "observation/eef_quat", 4) + if self.cfg.use_state: + assert gripper_position is not None + rot6d = convert_rotation(eef_quat[-1], "quat_xyzw", "rot6d") + action[0] = torch.from_numpy(np.concatenate((eef_pos[-1], rot6d, gripper_position[-1]))) # [D] + if num_history_rows > 0: + assert gripper_position is not None + if len(eef_pos) < num_history_rows + 1 or len(eef_quat) < num_history_rows + 1: + raise ValueError("Not enough eef_pos/eef_quat rows for requested history_length") + poses_abs = build_abs_pose_from_components(eef_pos, eef_quat, "quat_xyzw") + poses_rel = pose_abs_to_rel(poses_abs, rotation_format="rot6d", pose_convention="backward_framewise") + history_np = np.concatenate( + [poses_rel[-num_history_rows:], gripper_position[-num_history_rows:]], + axis=-1, + ) + history_action = torch.from_numpy(history_np).float() # [H,D] + + sample: dict[str, Any] = { + "ai_caption": prompt, + "video": video, + "action": action, + "conditioning_fps": torch.tensor(self.cfg.conditioning_fps, dtype=torch.long), # [] + "mode": "wam", + "domain_id": torch.tensor(get_domain_id(self.cfg.domain_name), dtype=torch.long), # [] + "viewpoint": "concat_view", + "additional_view_description": _CONCAT_VIEW_DESCRIPTION, + } + proprio = np.asarray(obs.get("observation/proprio"), dtype=np.float32) + if proprio.ndim > 1: + proprio = proprio[-1] + if proprio.shape != (self.cfg.proprio_dim,): + raise ValueError( + f"'observation/proprio' must have shape [{self.cfg.proprio_dim}], got {proprio.shape}" + ) + sample["proprio"] = torch.from_numpy(proprio.copy()) + if history_action is not None: + sample["history_action"] = history_action + # The selected arm7 channels have min/max statistics of -1/+1, so the + # configured min-max action normalization is numerically the identity. + # Build the same model-space sample used by training. + sample = self._transform(sample, self.cfg.resolution) + if isinstance(sample.get("ai_caption"), dict): + sample["ai_caption"] = json.dumps(sample["ai_caption"]) + return sample + + def infer(self, obs: dict[str, Any]) -> dict[str, Any]: + sample = self._build_sample(obs) + requested_seed = obs.get("inference_seed") + seed = self._next_seed() if requested_seed is None else int(requested_seed) + if seed < 0 or seed >= 2**32: + raise ValueError("inference_seed must be in uint32 range") + cte_features: dict[str, Any] | None = None + + with self._lock: + with torch.inference_mode(): + if self._zeva_enabled: + global_feature, phase, effect, effect_valid = self._causal_interaction_features( + obs, _extract_observation_image(obs) + ) + sample["behavior_global"] = global_feature[0].cpu() + sample["behavior_phase"] = phase[0].cpu() + sample["behavior_effect"] = effect[0].cpu() + sample["behavior_effect_valid"] = effect_valid[0].cpu() + cte_features = { + "global": global_feature[0].detach().float().cpu().numpy(), + "phase": phase[0].detach().float().cpu().numpy(), + "effect_history": effect[0].detach().float().cpu().numpy(), + "effect_history_valid": effect_valid[0].detach().cpu().numpy(), + } + data_batch = _build_data_batch_from_sample(sample) + log.info(f"[robolab-policy-server] prompt={data_batch['ai_caption'][0]!r} seed={seed}") + samples = self.model.generate_samples_from_batch( + data_batch, + guidance=self.cfg.guidance, + seed=[seed], + num_steps=self.cfg.num_steps, + shift=self.cfg.shift, + ) + + action = samples["action"][0][:, : self.cfg.action_dim] # [T,D] + action = action[self.cfg.history_length :] # [T2,D] + action_np = action.detach().cpu().numpy() # [T2,D] + # RoboCasa365 arm7 already stores gripper_close in the simulator convention. + log.info( + "[robolab-policy-server] action_raw " + f"shape={action_np.shape} min={action_np.min():.4f} max={action_np.max():.4f} " + f"mean_abs={np.abs(action_np).mean():.4f}" + ) + + if self.cfg.action_space == "midtrain": + eef_pos = _ensure_2d_float_array(obs["observation/eef_pos"], "observation/eef_pos", 3) + eef_quat = _ensure_2d_float_array(obs["observation/eef_quat"], "observation/eef_quat", 4) + initial_pose = np.eye(4, dtype=np.float32) + initial_pose[:3, :3] = convert_rotation(eef_quat[-1], "quat_xyzw", "matrix") + initial_pose[:3, 3] = eef_pos[-1] + abs_pose = pose_rel_to_abs( + action_np[:, :9], + rotation_format="rot6d", + pose_convention="backward_framewise", + initial_pose=initial_pose, + ) + position = abs_pose[1:, :3, 3] + quat_xyzw = convert_rotation(abs_pose[1:, :3, :3], "matrix", "quat_xyzw") + action_np = np.concatenate([position, quat_xyzw, action_np[:, 9:]], axis=-1) + + outputs: dict[str, Any] = {"action": action_np} + if cte_features is not None: + outputs["cte_features"] = cte_features + if self.cfg.decode_video: + pred_vision_latent = samples["vision"][0] # [C,T,H,W] + video = self.model.decode(pred_vision_latent) # [1,C,T,H,W] + video = ((video[0].clamp(-1.0, 1.0) + 1.0) * 127.5).to(torch.uint8).permute(1, 2, 3, 0) # [T,H,W,3] + outputs["video"] = video.detach().cpu().numpy() + return outputs + + +def serve(args: RobolabServerArgs) -> None: + hostname = socket.gethostname() + log.info(f"[robolab-policy-server] starting host={hostname} bind={args.host}:{int(args.port)}") + service = RobolabPolicyService(args) + local_ip = get_local_ip() + log.info(f"[robolab-policy-server] Server accessible at: ws://{local_ip}:{int(args.port)}/") + log.info(f"[robolab-policy-server] Health check: http://{local_ip}:{int(args.port)}/healthz") + server_cls = _load_openpi_websocket_policy_server() + server_cls(policy=service, host=args.host, port=int(args.port), metadata={}).serve_forever() + + +def main() -> None: + cascade_subcommand_args = getattr( + tyro.conf, + "CascadeSubcommandArgs", + tyro.conf.ConsolidateSubcommandArgs, + ) + args = tyro_cli( + RobolabServerArgs, + description=__doc__, + config=( + tyro.conf.OmitArgPrefixes, + cascade_subcommand_args, + tyro.conf.OmitSubcommandPrefixes, + ), + ) + serve(args) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva_pim.py b/releases/bridge-native-v3/code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva_pim.py new file mode 100644 index 0000000000000000000000000000000000000000..1363cd7d8eafa87b1d70c9daf8f8321e459f0aeb --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva_pim.py @@ -0,0 +1,2040 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""WebSocket inference server for the fixed-base RoboCasa365 Zeva policy with PIM. + +The server uses OpenPI's WebsocketPolicyServer and speaks its msgpack+NumPy protocol: + +- on connection, it sends an empty metadata dict; +- each client message is an observation dict; +- each response is a dict with ``action`` and, when enabled, ``video``. + +Example: + + PYTHONPATH=. python -m cosmos_framework.scripts.action_policy_server_robocasa365 \ + --checkpoint-path /path/to/iter_000010000 \ + --experiment action_policy_robocasa365_atomic5_nano \ + --domain-name robocasa-panda-omron \ + --port 8000 +""" + +# Initialize the script runtime before any cosmos-framework imports, mirroring +# the LIBERO server. The shared helpers below (single-rank distributed init, +# local IP discovery, frozen-config EMA disable) live in +# ``action_policy_server_utils`` so this module doesn't have to import from +# the sibling LIBERO server just to share runtime utilities. +from cosmos_framework.inference.common.init import init_script + +init_script() + +import hashlib +import json +import socket +import threading +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Literal + +import numpy as np +import pydantic +import torch +import torch.nn.functional as F +from torch import nn +import tyro + +from cosmos_framework.data.generator.action.domain_utils import get_domain_id +from cosmos_framework.data.generator.action.pose_utils import ( + build_abs_pose_from_components, + convert_rotation, + pose_abs_to_rel, + pose_rel_to_abs, +) +from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline +from cosmos_framework.data.generator.joint_dataloader import IterativeJointDataLoader +from cosmos_framework.model.zeva import ( + CausalPromptConfig, + CausalPromptEncoder, + CausalTransitionEncoder, + CausalTransitionEncoderConfig, + StaticTaskContextRetrievalConfig, + StaticTaskContextRetrievalHead, + PersistentInteractionMemory, + PersistentInteractionMemoryConfig, + normalize_cte_state_dict, + retrieve_static_task_context, +) +from cosmos_framework.model.zeva.experimental.robocasa_transition_memory import make_robocasa_atomic5_schema +from cosmos_framework.model.zeva.experimental.transition_memory import ( + TransitionMemoryEncoder, + TransitionMemorySchema, + TransitionRecord, +) +from cosmos_framework.model.zeva.experimental.transition_memory_runtime import TransitionMemoryController +from cosmos_framework.model.zeva.attempt_protocol import ( + EXECUTED_ACTION_HORIZON, + PREDICTED_ACTION_HORIZON, + AttemptSessionKey, + contract_manifest, +) +from cosmos_framework.inference.args import OmniSetupArgs, OmniSetupOverrides +from cosmos_framework.inference.common.args import ConfigFileType, ConfigOverrides, tyro_cli +from cosmos_framework.inference.common.config import deserialize_config, deserialize_config_dict, load_config +from cosmos_framework.inference.common.init import init_output_dir +from cosmos_framework.inference.inference import OmniInference +from cosmos_framework.scripts.action_policy_server_utils import ( + DEFAULT_FALLBACK_OUTPUT_DIR, + disable_runtime_ema_for_frozen_config, + get_local_ip, + maybe_init_distributed, +) +from cosmos_framework.scripts.action_policy_server_robocasa365_zeva import extract_batch, format_action_prompt +from cosmos_framework.utils import log +from cosmos_framework.utils.checkpoint_db import CheckpointDirHf + +_DEFAULT_DROID_POLICY_CHECKPOINT = "nvidia/Cosmos3-Nano-Policy-DROID" +_DEFAULT_CONDITIONING_FPS = 20.0 +_DEFAULT_ACTION_CHUNK_SIZE = 32 +_DEFAULT_IMAGE_HEIGHT = 256 +_DEFAULT_IMAGE_WIDTH = 512 +_DEFAULT_ACTION_DIM = 7 +_DEFAULT_ROBOLAB_OUTPUT_DIR = DEFAULT_FALLBACK_OUTPUT_DIR / "robolab" +_CONCAT_VIEW_DESCRIPTION = "The left panel is the left agent view and the right panel is the wrist view." +_DEFAULT_HF_REVISION = "main" +_ROBOLAB_POLICY_HF_REPOSITORIES = { + "Cosmos3-Nano-Policy-DROID": "nvidia/Cosmos3-Nano-Policy-DROID", + "nvidia/Cosmos3-Nano-Policy-DROID": "nvidia/Cosmos3-Nano-Policy-DROID", + "Cosmos3-Edge-Policy-DROID": "nvidia/Cosmos3-Edge-Policy-DROID", + "nvidia/Cosmos3-Edge-Policy-DROID": "nvidia/Cosmos3-Edge-Policy-DROID", +} + +ActionSpace = Literal["joint_pos", "midtrain"] + + +def _load_checkpoint_metadata(checkpoint_path: str) -> dict[str, Any] | None: + if "://" in checkpoint_path: + return None + checkpoint_dir = Path(checkpoint_path).expanduser().absolute() + if (checkpoint_dir / "model").is_dir(): + checkpoint_dir = checkpoint_dir / "model" + metadata_path = checkpoint_dir / "checkpoint.json" + if not metadata_path.exists(): + return None + return deserialize_config_dict(metadata_path) + + +def _load_training_config_from_metadata(metadata: dict[str, Any]) -> Any | None: + config_file = metadata.get("config_file") + if not isinstance(config_file, str) or not config_file: + return None + config_overrides = ConfigOverrides( + config_file=config_file, + experiment=str(metadata.get("experiment", "")), + experiment_overrides=list(metadata.get("experiment_overrides", [])), + ) + config_args = config_overrides.build_config() + if config_args.config_file_type == ConfigFileType.MODULE: + return load_config(config_args.config_file, config_args.experiment, overrides=config_args.experiment_overrides) + return deserialize_config(Path(config_args.config_file)) + + +def _load_training_config(setup_args: OmniSetupArgs, checkpoint_path: str) -> Any | None: + metadata = _load_checkpoint_metadata(checkpoint_path) + if metadata is not None: + try: + config = _load_training_config_from_metadata(metadata) + except Exception as exc: + log.warning(f"[robolab-policy-server] could not load checkpoint metadata config for transforms: {exc}") + config = None + if config is not None: + return config + + if setup_args.config_file_type == ConfigFileType.MODULE and not setup_args.experiment: + return None + + try: + return setup_args.load_config() + except Exception as exc: + log.warning(f"[robolab-policy-server] could not load training config for transforms: {exc}") + return None + + +def _resolve_checkpoint_path(checkpoint_path: str, *, hf_revision: str) -> str: + if Path(checkpoint_path).expanduser().exists(): + return checkpoint_path + + repository = _ROBOLAB_POLICY_HF_REPOSITORIES.get(checkpoint_path) + if repository is None: + return checkpoint_path + + log.info( + f"[robolab-policy-server] downloading consolidated checkpoint from Hugging Face: " + f"repository={repository!r} revision={hf_revision!r}" + ) + return CheckpointDirHf(repository=repository, revision=hf_revision).download() + + +def _validate_checkpoint(checkpoint_path: str, *, allow_dcp_checkpoint: bool) -> None: + if checkpoint_path in OmniSetupOverrides.CHECKPOINTS: + return + if "://" in checkpoint_path: + if allow_dcp_checkpoint: + return + raise ValueError( + "RoboLab OSS serving expects a consolidated local safetensors checkpoint directory, not a DCP path. " + "Run cosmos_framework.scripts.export_model first and pass the exported model directory, or pass " + "--allow-dcp-checkpoint to opt into direct DCP loading." + ) + + checkpoint_dir = Path(checkpoint_path).expanduser().absolute() + if (checkpoint_dir / "model").is_dir(): + checkpoint_dir = checkpoint_dir / "model" + if any(checkpoint_dir.glob("*.distcp")): + if allow_dcp_checkpoint: + return + raise ValueError( + "RoboLab OSS serving expects a consolidated safetensors checkpoint, but found a DCP checkpoint. " + "Run cosmos_framework.scripts.export_model first and pass the exported model directory, or pass " + "--allow-dcp-checkpoint to opt into direct DCP loading." + ) + has_config = (checkpoint_dir / "config.json").exists() + has_consolidated_safetensors = any(checkpoint_dir.glob("*.safetensors")) + has_diffusers_safetensors_index = (checkpoint_dir / "model.safetensors.index.json").exists() + if not checkpoint_dir.is_dir() or not has_config or not ( + has_consolidated_safetensors or has_diffusers_safetensors_index + ): + raise ValueError(f"Invalid safetensors checkpoint directory: {checkpoint_dir}") + + +def _ensure_rgb_uint8_image(value: Any, key: str) -> np.ndarray: + image = np.asarray(value) + if image.ndim != 3 or image.shape[-1] != 3: + raise ValueError(f"{key!r} must have shape [H,W,3], got {image.shape}") + if image.dtype != np.uint8: + image = np.clip(image, 0, 255).astype(np.uint8) + return np.ascontiguousarray(image) + + +def _ensure_2d_float_array(value: Any, key: str, width: int | None = None) -> np.ndarray: + array = np.asarray(value, dtype=np.float32) + if array.ndim == 1: + array = array[None, :] + if array.ndim != 2: + raise ValueError(f"{key!r} must have shape [T,D] or [D], got {array.shape}") + if width is not None and array.shape[-1] != width: + raise ValueError(f"{key!r} must have width {width}, got {array.shape[-1]}") + return np.ascontiguousarray(array) + + +def _ensure_gripper_array(value: Any) -> np.ndarray: + array = np.asarray(value, dtype=np.float32) + if array.ndim == 0: + array = array.reshape(1, 1) + elif array.ndim == 1: + array = array[:, None] + if array.ndim != 2 or array.shape[-1] != 1: + raise ValueError(f"'observation/gripper_position' must have shape [T,1], [T], or scalar, got {array.shape}") + return np.ascontiguousarray(array) + + +def _resize_rgb_uint8(image: np.ndarray, size: tuple[int, int]) -> np.ndarray: + tensor = torch.from_numpy(image).permute(2, 0, 1).unsqueeze(0).float() # [1,3,H,W] + resized = F.interpolate(tensor, size=size, mode="bilinear", align_corners=False) # [1,3,H2,W2] + return resized.squeeze(0).permute(1, 2, 0).numpy().astype(np.uint8) # [H2,W2,3] + + +def _compose_roboarena_views(obs: dict[str, Any]) -> np.ndarray | None: + required_keys = ( + "observation/wrist_image_left", + "observation/exterior_image_1_left", + "observation/exterior_image_2_left", + ) + if not all(key in obs for key in required_keys): + return None + wrist = _ensure_rgb_uint8_image(obs["observation/wrist_image_left"], "observation/wrist_image_left") + left_raw = _ensure_rgb_uint8_image(obs["observation/exterior_image_1_left"], "observation/exterior_image_1_left") + right_raw = _ensure_rgb_uint8_image(obs["observation/exterior_image_2_left"], "observation/exterior_image_2_left") + half_h, half_w = wrist.shape[0] // 2, wrist.shape[1] // 2 + left = _resize_rgb_uint8(left_raw, (half_h, half_w)) + right = _resize_rgb_uint8(right_raw, (half_h, half_w)) + return np.concatenate([wrist, np.concatenate([left, right], axis=1)], axis=0) + + +def _extract_observation_image(obs: dict[str, Any]) -> np.ndarray: + if "observation/image" in obs: + return _ensure_rgb_uint8_image(obs["observation/image"], "observation/image") + image = _compose_roboarena_views(obs) + if image is not None: + return image + raise ValueError("Observation must contain 'observation/image' or RoBoArena wrist/exterior image keys") + + +def _build_data_batch_from_sample(sample: dict[str, Any]) -> dict[str, Any]: + data_batch: dict[str, Any] = {} + for key, value in sample.items(): + if key in IterativeJointDataLoader._MULTI_ITEM_KEYS: + data_batch[key] = [[value]] + elif isinstance(value, torch.Tensor): + data_batch[key] = [value.unsqueeze(0)] # value: [...], batch item: [1,...] + else: + data_batch[key] = [value] + return data_batch + + +def _load_openpi_websocket_policy_server() -> type[Any]: + try: + from openpi_server.websocket_policy_server import WebsocketPolicyServer + except ModuleNotFoundError: + try: + from openpi.serving.websocket_policy_server import WebsocketPolicyServer + except ModuleNotFoundError as exc: + raise ModuleNotFoundError( + "RoboLab WebSocket serving uses OpenPI's WebsocketPolicyServer. Install it with " + "`uv sync --all-extras --group=cu130-train --group=policy-server`, " + "or install the full Physical-Intelligence/openpi package." + ) from exc + return WebsocketPolicyServer + + +class _DummyDataset(torch.utils.data.IterableDataset): + def __iter__(self) -> Any: + return iter(()) + + +@dataclass(frozen=True) +class RobolabPolicyConfig: + checkpoint_path: str + domain_name: str + decode_video: bool + seed: int + deterministic_seed: bool + guidance: float + num_steps: int + shift: float + conditioning_fps: float + resolution: str | None + action_chunk_size: int + action_dim: int + image_height: int = _DEFAULT_IMAGE_HEIGHT + image_width: int = _DEFAULT_IMAGE_WIDTH + action_space: ActionSpace = "joint_pos" + use_state: bool = True + history_length: int = 1 + proprio_dim: int = 9 + + +class RobolabServerArgs(pydantic.BaseModel): + model_config = pydantic.ConfigDict(extra="forbid", use_attribute_docstrings=True) + + checkpoint_path: str = _DEFAULT_DROID_POLICY_CHECKPOINT + """Consolidated local safetensors checkpoint directory, registered checkpoint name, or DCP path with --allow-dcp-checkpoint.""" + hf_revision: str = _DEFAULT_HF_REVISION + """Hugging Face revision used when --checkpoint-path is a supported public RoboLab policy repository.""" + allow_dcp_checkpoint: bool = False + """If set, allow direct DCP/S3 checkpoint loading instead of requiring a consolidated safetensors export.""" + experiment: str | None = None + """Experiment name for DCP checkpoints using module configs, e.g. droid_lerobot_8b_policy.""" + experiment_overrides: list[str] = pydantic.Field(default_factory=list) + """Hydra experiment overrides forwarded to OmniSetup for DCP checkpoint loading.""" + credential_path: str | None = None + """Optional checkpoint object-store credential path for DCP/S3 loading.""" + + port: int = 8000 + """WebSocket port to bind.""" + host: str = "0.0.0.0" + """WebSocket host to bind.""" + domain_name: str = "robocasa-panda-omron" + """Action domain name passed to get_domain_id().""" + decode_video: bool = False + """If set, decode and return the predicted rollout video as a uint8 NumPy array.""" + guardrails: bool = False + """Enable text/video guardrails. Robot policy inference keeps these disabled by default.""" + + output_dir: Path | None = None + """Output directory for OmniInference. Defaults to /tmp/cosmos3_action_server/robolab.""" + sampler: Literal["unipc", "edm"] = "unipc" + """Diffusion sampler used by OmniInference.""" + + seed: int = 0 + """Base generation seed used to initialize the request RNG.""" + deterministic_seed: bool = False + """Use the same seed for every request. The official server advances the RNG by default.""" + guidance: float = 3.0 + """Guidance scale for denoising.""" + num_steps: int = 4 + """Number of denoising steps.""" + shift: float = 5.0 + """UniPC sampler shift.""" + + resolution: str | None = "480" + """Action transform resolution. The default matches the released DROID RoboLab policy.""" + conditioning_fps: float | None = _DEFAULT_CONDITIONING_FPS + """Conditioning FPS. The default matches the released DROID RoboLab policy.""" + action_chunk_size: int | None = _DEFAULT_ACTION_CHUNK_SIZE + """Number of action steps to predict. The default matches the released DROID RoboLab policy.""" + action_dim: int | None = _DEFAULT_ACTION_DIM + """Raw action dimension. The default matches the released DROID RoboLab policy.""" + image_height: int = _DEFAULT_IMAGE_HEIGHT + """Input observation image height. The default matches the released DROID RoboLab policy.""" + image_width: int = _DEFAULT_IMAGE_WIDTH + """Input observation image width. The default matches the released DROID RoboLab policy.""" + action_space: ActionSpace = "joint_pos" + """RoboLab action representation to serve.""" + use_state: bool = False + """Include action state in the policy input.""" + history_length: int = 0 + """State/history action rows to trim from the generated action output.""" + format_prompt_as_json: bool | None = None + """Serve prompts as structured JSON (matching training ``format_prompt_as_json``).""" + proprio_dim: int = 9 + """Independent fixed-base proprio input: relative EEF pose (7) plus gripper qpos (2).""" + task_context_bank: Path | None = None + """Task-context bank used by Zeva.""" + cte_checkpoint: Path | None = None + """Frozen CTE checkpoint used to derive phase and causal-effect features.""" + task_context_instruction: str | None = None + """Optional task key used to select a task-context prototype.""" + static_task_context_checkpoint: Path | None = None + """Static task-context retrieval head, mutually exclusive with the task-ID oracle.""" + static_task_context_top_k: int = 5 + """Number of retrieved entries used to form the task-context token.""" + bit_mode: Literal["normal", "zero", "shuffled"] = "normal" + """Evaluation ablation for completed causal effects; never use outside controlled diagnostics.""" + disable_policy_injection: bool = False + """Diagnostic only: zero the policy adapter and task-context projector.""" + transition_memory_encoder_checkpoint: Path | None = None + """Standalone history-only RoboCasa Atomic-5 transition-memory encoder checkpoint.""" + transition_memory_enabled: bool = False + """Condition the action branch on the retrieved online context.""" + transition_memory_shadow: bool = False + """Compute and log transition memory while injecting a zero context (no action change).""" + transition_memory_mode: Literal["normal", "empty", "shuffled", "wrong_task"] = "normal" + """Controlled runtime ablation for transition-memory retrieval.""" + transition_memory_support_records: Path | None = None + """Offline RoboCasa transition-record file used only by the wrong-task ablation.""" + transition_memory_support_task: str | None = None + """Task cluster whose offline transitions are deliberately supplied as wrong-task support.""" + pim_enabled: bool = False + """Enable phase-conditioned Persistent Interaction Memory.""" + pim_adapter_delta: Path | None = None + """Optional trained PIM-only delta loaded on top of the released Stage-2 checkpoint.""" + pim_shadow: bool = False + """Build/query PIM but send empty PIM tensors to the model.""" + pim_capacity: int = 64 + """Maximum number of merged phase/effect prototypes in one episode.""" + pim_top_k: int = 4 + """Number of phase-matched PIM entries supplied to the model.""" + pim_merge_threshold: float = 0.85 + """Minimum weighted phase/effect cosine score for schema merging.""" + pim_phase_merge_weight: float = 0.5 + """Phase contribution to PIM merge similarity.""" + pim_effect_merge_weight: float = 0.5 + """Effect contribution to PIM merge similarity.""" + pim_executed_action_horizon: int = EXECUTED_ACTION_HORIZON + """Executed controls required before committing one PIM effect.""" + pim_success_replay_enabled: bool = False + """Retain a successful phase/action trace for later attempts.""" + pim_success_replay_phase_threshold: float = 0.80 + """Minimum current/locked phase cosine similarity for guarded replay.""" + pim_success_replay_blend: float = 1.0 + """Blend of locked successful actions into the generated action chunk.""" + + +class RobolabPolicyService: + def __init__(self, args: RobolabServerArgs) -> None: + if not torch.cuda.is_available(): + raise RuntimeError("CUDA is required for OmniMoTModel inference in this repo.") + resolved_checkpoint_path = _resolve_checkpoint_path(args.checkpoint_path, hf_revision=args.hf_revision) + args = args.model_copy(update={"checkpoint_path": resolved_checkpoint_path}) + _validate_checkpoint(args.checkpoint_path, allow_dcp_checkpoint=args.allow_dcp_checkpoint) + maybe_init_distributed() + + setup_args = self._build_setup_args(args) + log.info( + f"[robolab-policy-server] loading model: checkpoint_path={setup_args.checkpoint_path!r} " + f"config_file={setup_args.config_file!r} experiment={setup_args.experiment!r}" + ) + pipe = OmniInference.create(setup_args) + self.pipe: OmniInference = pipe + self.model = pipe.model + self.model.eval() + self._load_pim_adapter_delta(args.pim_adapter_delta, args.checkpoint_path) + assert isinstance(pipe.setup_args, OmniSetupArgs) + self.setup_args: OmniSetupArgs = pipe.setup_args + self._model_has_online_prefix = getattr(self.model.net, "behavior_online_projector", None) is not None + self._model_has_pim = getattr(self.model.net, "behavior_pim_encoder", None) is not None + training_config = _load_training_config(self.setup_args, args.checkpoint_path) + self._transform, inferred = self._build_transform(training_config, args) + self.cfg = RobolabPolicyConfig( + checkpoint_path=self.setup_args.checkpoint_path, + domain_name=args.domain_name, + decode_video=bool(args.decode_video), + seed=int(args.seed), + deterministic_seed=bool(args.deterministic_seed), + guidance=float(args.guidance), + num_steps=int(args.num_steps), + shift=float(args.shift), + conditioning_fps=float( + args.conditioning_fps or inferred.get("conditioning_fps") or _DEFAULT_CONDITIONING_FPS + ), + resolution=args.resolution or inferred.get("resolution"), + action_chunk_size=int( + args.action_chunk_size or inferred.get("action_chunk_size") or _DEFAULT_ACTION_CHUNK_SIZE + ), + action_dim=int(args.action_dim or (8 if args.action_space == "joint_pos" else 10)), + image_height=int(args.image_height), + image_width=int(args.image_width), + action_space=args.action_space, + use_state=bool(args.use_state), + history_length=int(args.history_length), + proprio_dim=int(args.proprio_dim), + ) + if self.cfg.history_length < (1 if self.cfg.use_state else 0): + raise ValueError("--history-length must be >= 1 when --use-state is true") + if self.cfg.image_height <= 0 or self.cfg.image_width <= 0: + raise ValueError("--image-height and --image-width must be positive") + + self._init_zeva(args) + self._init_transition_memory(args) + self._init_pim(args) + self._lock = threading.Lock() + self._rng = np.random.default_rng(self.cfg.seed) + log.info( + f"[robolab-policy-server] ready domain={self.cfg.domain_name!r} resolution={self.cfg.resolution!r} " + f"action_space={self.cfg.action_space} action_dim={self.cfg.action_dim} " + f"chunk={self.cfg.action_chunk_size} history={self.cfg.history_length} use_state={self.cfg.use_state} " + f"image={self.cfg.image_height}x{self.cfg.image_width} fps={self.cfg.conditioning_fps} " + f"guidance={self.cfg.guidance} num_steps={self.cfg.num_steps} shift={self.cfg.shift} " + f"seed={self.cfg.seed} deterministic_seed={self.cfg.deterministic_seed}" + ) + + def _load_pim_adapter_delta(self, checkpoint: Path | None, base_checkpoint: str) -> None: + """Overlay the small trained PIM adapter without renaming model keys.""" + if checkpoint is None: + return + if not checkpoint.is_file(): + raise FileNotFoundError(checkpoint) + payload = torch.load(checkpoint, map_location="cpu", weights_only=False) + if payload.get("format") != "cosmos_behavior_pim_adapter_delta_v1": + raise ValueError(f"Unsupported PIM adapter delta format in {checkpoint}") + expected_base_hash = payload.get("base_metadata_sha256") + base_path = Path(base_checkpoint).expanduser() + if (base_path / "model").is_dir(): + base_path = base_path / "model" + metadata_path = base_path / ".metadata" + if metadata_path.is_file() and expected_base_hash: + actual_base_hash = hashlib.sha256(metadata_path.read_bytes()).hexdigest() + if actual_base_hash != expected_base_hash: + raise ValueError( + "PIM adapter delta was exported from a different Stage-2 checkpoint: " + f"expected metadata {expected_base_hash}, got {actual_base_hash}" + ) + state_dict = payload.get("state_dict") + if not isinstance(state_dict, dict) or not state_dict: + raise ValueError(f"PIM adapter delta has no state_dict: {checkpoint}") + net = self.model.net + if getattr(net, "behavior_pim_encoder", None) is None: + reference = next(net.parameters()) + global_projector = getattr(net, "behavior_global_projector", None) + if global_projector is None: + raise ValueError("PIM adapter delta requires the released Zeva Stage-2 model") + global_dim = int(global_projector.in_features) + pim_dim = 256 + net.behavior_pim_encoder = CausalPromptEncoder( + CausalPromptConfig( + global_dim=global_dim, + phase_dim=128, + effect_dim=128, + brief_length=4, + persistent_length=4, + hidden_dim=pim_dim, + num_heads=4, + ) + ).to(device=reference.device, dtype=reference.dtype) + net.behavior_pim_projector = nn.Linear(pim_dim, net.hidden_size, bias=True).to( + device=reference.device, dtype=reference.dtype + ) + net.behavior_pim_gate = nn.Parameter( + torch.empty(1, device=reference.device, dtype=reference.dtype) + ) + net.behavior_pim_gate_init = 0.0 + net.behavior_pim_force_bypass = False + behavior_cfg = self.model.config.behavior_stage2 + behavior_cfg.pim_memory_enabled = True + behavior_cfg.pim_persistent_length = 4 + behavior_cfg.pim_context_dim = pim_dim + net.config.behavior_stage2_config.update( + pim_memory_enabled=True, + pim_persistent_length=4, + pim_context_dim=pim_dim, + pim_force_bypass=False, + ) + model_keys = set(self.model.state_dict()) + unexpected = sorted(set(state_dict) - model_keys) + if unexpected: + raise ValueError( + "PIM adapter delta does not match the configured model; " + f"unexpected keys: {unexpected[:5]}" + ) + incompatible = self.model.load_state_dict(state_dict, strict=False) + if incompatible.unexpected_keys: + raise ValueError( + "PIM adapter delta produced unexpected model keys: " + f"{incompatible.unexpected_keys[:5]}" + ) + log.info( + "[robolab-policy-server] loaded PIM adapter delta " + f"path={checkpoint} tensors={len(state_dict)} format={payload['format']}" + ) + + def _init_transition_memory(self, args: RobolabServerArgs) -> None: + """Load the experimental task-scoped transition-memory controller.""" + self._transition_enabled = bool(args.transition_memory_enabled or args.transition_memory_shadow) + self._transition_shadow = bool(args.transition_memory_shadow) + self._transition_mode = args.transition_memory_mode + self._transition_controller: Any | None = None + self._transition_replan_open = False + self._transition_pending_start: dict[str, torch.Tensor] | None = None + self._transition_session_id: str | None = None + self._transition_session_key: AttemptSessionKey | None = None + self._transition_attempt_id: int | None = None + self._transition_wrong_task_entries: list[TransitionRecord] = [] + self._transition_support_task: str | None = None + if not self._transition_enabled: + return + if not self._zeva_enabled: + raise ValueError("Experimental transition memory requires CTE/task-context features") + if args.transition_memory_encoder_checkpoint is None: + raise ValueError("--transition-memory-encoder-checkpoint is required for transition memory") + if not args.transition_memory_encoder_checkpoint.is_file(): + raise FileNotFoundError(args.transition_memory_encoder_checkpoint) + payload = torch.load(args.transition_memory_encoder_checkpoint, map_location="cpu", weights_only=False) + if payload.get("format") != "robocasa_atomic5_transition_memory_encoder_v1": + raise ValueError("Unsupported RoboCasa transition-memory encoder format") + raw_schema = dict(payload.get("schema", {})) + schema = TransitionMemorySchema(**{k: raw_schema[k] for k in TransitionMemorySchema.__dataclass_fields__ if k in raw_schema}) + expected = make_robocasa_atomic5_schema( + cte_hash=schema.cte_hash, + vae_temporal_hash=schema.vae_temporal_hash, + capacity=schema.capacity, + top_k=schema.top_k, + ) + if schema.hash != expected.hash or raw_schema.get("hash") != schema.hash: + raise ValueError("Transition-memory encoder schema/hash is not RoboCasa Atomic-5 compatible") + if ( + schema.action_dim != 7 + or schema.action_horizon != EXECUTED_ACTION_HORIZON + or schema.task_contract != expected.task_contract + ): + raise ValueError("Transition-memory encoder has the wrong RoboCasa action/temporal contract") + encoder = TransitionMemoryEncoder(schema=schema, hidden_dim=256) + encoder.load_state_dict(payload["model"], strict=True) + device = next(self.model.parameters()).device + self._transition_controller = TransitionMemoryController( + schema=schema, encoder=encoder.to(device), enabled=bool(args.transition_memory_enabled) + ) + self._transition_controller.encoder.eval() + if self._transition_mode == "wrong_task": + if args.transition_memory_support_records is None or args.transition_memory_support_task is None: + raise ValueError( + "wrong_task mode requires --transition-memory-support-records and " + "--transition-memory-support-task" + ) + support_payload = torch.load(args.transition_memory_support_records, map_location="cpu", weights_only=False) + self._transition_support_task = str(args.transition_memory_support_task) + support_schema = str(support_payload.get("schema", {}).get("hash", "")) + if support_schema != schema.hash: + raise ValueError("wrong-task support records have a schema hash mismatch") + for raw in support_payload.get("transitions", []): + if raw.get("task_cluster") != args.transition_memory_support_task: + continue + self._transition_wrong_task_entries.append( + TransitionRecord( + task_cluster=str(raw["task_cluster"]), + phase=raw["phase"].float().cpu(), + visual_key=raw["visual_key"].float().cpu(), + effect_post=raw["effect_post"].float().cpu(), + executed_action=raw["executed_action"].float().cpu(), + next_visual_key=raw["next_visual_key"].float().cpu(), + next_phase=raw["next_phase"].float().cpu(), + latent_index=int(raw.get("latent_index", 0)), + schema_hash=schema.hash, + ) + ) + if not self._transition_wrong_task_entries: + raise ValueError(f"No transitions found for wrong-task support {args.transition_memory_support_task!r}") + log.info( + "[robolab-policy-server] RoboCasa transition memory ready " + f"mode={self._transition_mode} conditioning={bool(args.transition_memory_enabled)} " + f"shadow={self._transition_shadow} schema_hash={schema.hash}" + ) + + def _init_pim(self, args: RobolabServerArgs) -> None: + """Create the episode-scoped PIM without touching released model weights.""" + self._pim_active = bool(args.pim_enabled or args.pim_shadow) + self._pim_conditioning = bool(args.pim_enabled) + self._pim_shadow = bool(args.pim_shadow) + self._pim_executed_action_horizon = int(args.pim_executed_action_horizon) + if self._pim_executed_action_horizon <= 0: + raise ValueError("--pim-executed-action-horizon must be positive") + self._pim_success_replay_enabled = bool(args.pim_success_replay_enabled) + self._pim_success_replay_phase_threshold = float(args.pim_success_replay_phase_threshold) + self._pim_success_replay_blend = float(args.pim_success_replay_blend) + if not -1.0 <= self._pim_success_replay_phase_threshold <= 1.0: + raise ValueError("--pim-success-replay-phase-threshold must be in [-1,1]") + if not 0.0 <= self._pim_success_replay_blend <= 1.0: + raise ValueError("--pim-success-replay-blend must be in [0,1]") + self._pim: PersistentInteractionMemory | None = None + self._pim_replan_open = False + self._pim_pending_start: dict[str, Any] | None = None + self._pim_session_id: str | None = None + self._pim_session_key: AttemptSessionKey | None = None + self._pim_attempt_id: int | None = None + self._pim_attempt_chunks: list[dict[str, Any]] = [] + self._pim_success_trace: list[dict[str, Any]] = [] + self._pim_success_attempt_id: int | None = None + if not self._pim_active: + return + if self._transition_enabled: + raise ValueError("PIM and transition-memory conditioning are mutually exclusive") + if not self._zeva_enabled: + raise ValueError("PIM requires CTE/task-context features") + if self._pim_conditioning and not self._model_has_pim: + raise ValueError("--pim-enabled requires a checkpoint trained with pim_memory_enabled=true") + model_pim = getattr(self.model.net, "behavior_pim_encoder", None) + model_gate = getattr(self.model.net, "behavior_pim_gate", None) + self._pim_model_hard_bypass = bool( + getattr(self.model.net, "behavior_pim_force_bypass", False) + ) + if self._pim_conditioning and self._pim_model_hard_bypass: + raise ValueError( + "--pim-enabled is incompatible with " + "model.config.behavior_stage2.pim_force_bypass=true" + ) + if self._pim_conditioning and ( + model_gate is None or bool(torch.count_nonzero(model_gate.detach()).item() == 0) + ): + raise ValueError( + "--pim-enabled requires a trained non-zero PIM gate; use the PIM inference " + "experiment so checkpoint loading does not skip adapter weights" + ) + if model_pim is not None and int(args.pim_top_k) != int(model_pim.config.persistent_length): + raise ValueError( + f"--pim-top-k={args.pim_top_k} must match checkpoint persistent_length=" + f"{model_pim.config.persistent_length}" + ) + config = PersistentInteractionMemoryConfig( + phase_dim=128, + effect_dim=128, + capacity=int(args.pim_capacity), + top_k=int(args.pim_top_k), + merge_threshold=float(args.pim_merge_threshold), + phase_merge_weight=float(args.pim_phase_merge_weight), + effect_merge_weight=float(args.pim_effect_merge_weight), + ) + self._pim = PersistentInteractionMemory(config) + log.info( + "[robolab-policy-server] PIM ready " + f"conditioning={self._pim_conditioning} shadow={self._pim_shadow} " + f"model_hard_bypass={self._pim_model_hard_bypass} " + f"capacity={config.capacity} top_k={config.top_k} " + f"merge_threshold={config.merge_threshold} " + f"success_replay={self._pim_success_replay_enabled} " + f"replay_phase_threshold={self._pim_success_replay_phase_threshold} " + f"replay_blend={self._pim_success_replay_blend}" + ) + + def _build_setup_args(self, args: RobolabServerArgs) -> OmniSetupArgs: + setup_overrides: dict[str, Any] = { + "checkpoint_path": args.checkpoint_path, + "output_dir": args.output_dir or _DEFAULT_ROBOLAB_OUTPUT_DIR, + "sampler": args.sampler, + "guardrails": args.guardrails, + } + if args.experiment is not None: + setup_overrides["experiment"] = args.experiment + if args.experiment_overrides: + setup_overrides["experiment_overrides"] = list(args.experiment_overrides) + if args.credential_path is not None: + setup_overrides["credential_path"] = args.credential_path + overrides = OmniSetupOverrides.model_validate(setup_overrides) + setup_args = overrides.build_setup() + init_output_dir(setup_args.output_dir) + return disable_runtime_ema_for_frozen_config(setup_args) + + def _build_transform(self, training_config: Any | None, args: RobolabServerArgs) -> tuple[Any, dict[str, Any]]: + inferred: dict[str, Any] = {} + model_max_action_dim = getattr(getattr(self.model, "config", None), "max_action_dim", None) + max_action_dim = int(model_max_action_dim) if isinstance(model_max_action_dim, int) else 64 + + try: + action_dataset_config = training_config.dataloader_train.dataloader.datasets["robocasa365"].dataset + except (AttributeError, KeyError, TypeError): + action_dataset_config = None + + if action_dataset_config is None: + log.warning( + "[robolab-policy-server] no training action dataset config found; using default " + f"ActionTransformPipeline (format_prompt_as_json={bool(args.format_prompt_as_json)})" + ) + return ( + ActionTransformPipeline( + max_action_dim=max_action_dim, + cfg_dropout_rate=0.0, + format_prompt_as_json=bool(args.format_prompt_as_json), + ), + inferred, + ) + + chunk_length = getattr(action_dataset_config, "chunk_length", None) + if isinstance(chunk_length, int): + inferred["action_chunk_size"] = chunk_length + fps = getattr(action_dataset_config, "fps", None) + if isinstance(fps, (int, float)): + inferred["conditioning_fps"] = float(fps) + configured_resolution = getattr(action_dataset_config, "resolution", None) + if configured_resolution is not None: + inferred["resolution"] = str(configured_resolution) + + format_json = getattr(action_dataset_config, "format_prompt_as_json", True) + if args.format_prompt_as_json is not None: + format_json = bool(args.format_prompt_as_json) + transform = ActionTransformPipeline( + tokenizer_config=getattr(action_dataset_config, "tokenizer_config", None), + cfg_dropout_rate=0.0, + max_action_dim=max_action_dim, + append_viewpoint_info=bool(getattr(action_dataset_config, "append_viewpoint_info", True)), + append_duration_fps_timestamps=bool( + getattr(action_dataset_config, "append_duration_fps_timestamps", True) + ), + append_resolution_info=bool(getattr(action_dataset_config, "append_resolution_info", True)), + append_idle_frames=bool(getattr(action_dataset_config, "append_idle_frames", False)), + format_prompt_as_json=bool(format_json), + ) + return transform, inferred + + def _next_seed(self) -> int: + if self.cfg.deterministic_seed: + return self.cfg.seed + return int(self._rng.integers(0, 2**31)) + + def _init_zeva(self, args: RobolabServerArgs) -> None: + """Load the CTE and task-context retrieval components.""" + artifacts = ( + args.task_context_bank, + args.cte_checkpoint, + args.task_context_instruction, + args.static_task_context_checkpoint, + ) + if not any(item is not None for item in artifacts): + self._zeva_enabled = False + return + if args.task_context_bank is None or args.cte_checkpoint is None: + raise ValueError( + "Zeva serving requires --task-context-bank and --cte-checkpoint" + ) + if (args.task_context_instruction is None) == (args.static_task_context_checkpoint is None): + raise ValueError( + "Provide exactly one of --task-context-instruction or --static-task-context-checkpoint" + ) + if args.static_task_context_top_k < 1: + raise ValueError("--static-task-context-top-k must be positive") + self._bit_mode = args.bit_mode + assert args.task_context_bank is not None + assert args.cte_checkpoint is not None + if not args.task_context_bank.is_file() or not args.cte_checkpoint.is_file(): + raise FileNotFoundError("Zeva artifacts must be regular files") + if getattr(self.model.net, "behavior_pbd", None) is None: + raise ValueError("Loaded policy has no Zeva policy-injection prior; refusing oracle-effect evaluation") + if args.disable_policy_injection: + for name in ("behavior_adapter", "behavior_global_projector"): + module = getattr(self.model.net, name, None) + if module is None: + raise ValueError(f"Loaded policy has no {name} for zero-residual ablation") + for parameter in module.parameters(): + parameter.data.zero_() + log.info("[robolab-policy-server] zeroed Zeva policy injection for ablation") + + device = next(self.model.parameters()).device + bank = torch.load(args.task_context_bank, map_location="cpu", weights_only=True) + entries = bank.get("entries") + if not isinstance(entries, list) or not entries: + raise ValueError(f"Task-context bank has no entries: {args.task_context_bank}") + self._static_task_context_enabled = args.static_task_context_checkpoint is not None + if self._static_task_context_enabled: + assert args.static_task_context_checkpoint is not None + if not args.static_task_context_checkpoint.is_file(): + raise FileNotFoundError(f"Static task-context checkpoint not found: {args.static_task_context_checkpoint}") + retrieval_payload = torch.load(args.static_task_context_checkpoint, map_location="cpu", weights_only=True) + supported_formats = { + "zeva_retrieval_head_v1", + "cosmos_" + "behavior_retrieval_head_v1", + } + if retrieval_payload.get("format") not in supported_formats: + raise ValueError("Unsupported static task-context checkpoint") + self._static_task_context_head = StaticTaskContextRetrievalHead( + StaticTaskContextRetrievalConfig(**retrieval_payload["config"]) + ).to(device) + self._static_task_context_head.load_state_dict(retrieval_payload["model"]) + self._static_task_context_head.eval() + self._static_task_context_keys = torch.stack([entry["retrieval_key"].float() for entry in entries]).to(device) + self._static_task_context_values = torch.stack([entry["behavior_value"].float() for entry in entries]).to(device) + if self._static_task_context_keys.shape[-1] != self._static_task_context_head.config.output_dim: + raise ValueError("Static task-context output dimension does not match bank retrieval keys") + self._static_task_context_top_k = min(args.static_task_context_top_k, len(entries)) + else: + assert args.task_context_instruction is not None + matching = [ + entry["behavior_value"].float() + for entry in entries + if entry.get("instruction") == args.task_context_instruction + ] + if not matching: + available = sorted({str(entry.get("instruction", "")) for entry in entries}) + raise ValueError(f"No memory-bank entries for {args.task_context_instruction!r}; available={available}") + self._task_context = torch.stack(matching).mean(dim=0, keepdim=True).to(device=device) + payload = torch.load(args.cte_checkpoint, map_location="cpu", weights_only=False) + cte_model_config = dict(payload["model_config"]) + cte_state = payload["model"] + if any(key.endswith("mixer.weight_ih_l0") for key in cte_state): + cte_model_config["use_mamba"] = False + elif any(key.endswith("mixer.A_log") for key in cte_state): + cte_model_config["use_mamba"] = True + self._cte = CausalTransitionEncoder(CausalTransitionEncoderConfig(**cte_model_config)).to(device) + self._cte.load_state_dict(normalize_cte_state_dict(cte_state)) + self._cte.eval() + if self._cte.cfg.action_dim != self.cfg.action_dim: + raise ValueError("CTE action dimension does not match policy action dimension") + self._zeva_enabled = True + if self._static_task_context_enabled: + log.info( + "[robolab-policy-server] static task-context retrieval enabled " + f"bank_entries={len(entries)} top_k={self._static_task_context_top_k}" + ) + else: + log.info( + "[robolab-policy-server] task-context prototype enabled " + f"task={args.task_context_instruction!r} bank_entries={len(matching)}" + ) + + def _encode_cte_frame(self, image: np.ndarray) -> torch.Tensor: + """Map one observed concatenated RGB image to the CTE's Wan latent.""" + device = next(self.model.parameters()).device + frame = torch.from_numpy(np.ascontiguousarray(image)).to(device=device, dtype=torch.float32) + frame = frame.permute(2, 0, 1).unsqueeze(0) + frame = F.interpolate(frame, size=(480, 832), mode="bilinear", align_corners=False) + latent = self.model.encode(frame.unsqueeze(2).div_(127.5).sub_(1.0)) + if latent.ndim != 5 or latent.shape[:3] != (1, self._cte.cfg.image_channels, 1): + raise RuntimeError(f"Unexpected Wan latent for CTE: {tuple(latent.shape)}") + return latent[0, :, 0].float().contiguous() + + def _task_context_from_initial_observation(self, image: np.ndarray, prompt: str) -> torch.Tensor: + """Retrieve static task context from the initial observation and instruction.""" + if not self._static_task_context_enabled: + return self._task_context + latent = self._encode_cte_frame(image).unsqueeze(0) + readout = extract_batch(self.model, latent, [format_action_prompt(prompt)]).to( + device=latent.device, dtype=torch.float32 + ) + with torch.autocast(device_type="cuda", dtype=torch.bfloat16): + query = self._static_task_context_head(readout) + values, _, _ = retrieve_static_task_context( + query, + self._static_task_context_keys, + self._static_task_context_values, + top_k=self._static_task_context_top_k, + ) + return values.float() + + def _causal_interaction_features( + self, obs: dict[str, Any], image: np.ndarray + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, bool]: + """Return task-cluster global plus causal phase/four-effect history. + + ``cte_boundary_images`` contains observations at raw offsets + 0,4,8,...; ``cte_transition_actions`` contains the corresponding + executed [4,arm7] transitions. Thus an effect token becomes readable + only after four completed transitions (16 raw controls). + """ + if not self._zeva_enabled: + raise RuntimeError("Zeva causal-interaction features are not configured") + frames_rgb = np.asarray(obs.get("cte_boundary_images", np.expand_dims(image, axis=0))) + transitions = np.asarray( + obs.get("cte_transition_actions", np.empty((0, 4, self.cfg.action_dim), dtype=np.float32)), + dtype=np.float32, + ) + if frames_rgb.ndim != 4 or frames_rgb.shape[-1] != 3: + raise ValueError(f"cte_boundary_images must be [T,H,W,3], got {frames_rgb.shape}") + if transitions.shape != (frames_rgb.shape[0] - 1, 4, self.cfg.action_dim): + raise ValueError( + "cte_transition_actions must be [T-1,4,arm7], got " + f"{transitions.shape} for T={frames_rgb.shape[0]}" + ) + latents = torch.stack([self._encode_cte_frame(_ensure_rgb_uint8_image(frame, "cte_boundary_images")) for frame in frames_rgb]) + frames = latents.unsqueeze(0) + actions = torch.from_numpy(np.ascontiguousarray(transitions)).to(device=frames.device, dtype=torch.float32).unsqueeze(0) + valid = torch.ones((1, frames.shape[1]), dtype=torch.bool, device=frames.device) + transition_valid = torch.ones(actions.shape[:-1], dtype=torch.bool, device=frames.device) + with torch.autocast(device_type="cuda", dtype=torch.bfloat16): + encoded = self._cte(frames, actions, valid, transition_valid) + completed = encoded["effect_post"][0][encoded["effect_complete"][0]].float() + history = torch.zeros((1, 4, self._cte.cfg.effect_dim), dtype=torch.float32, device=frames.device) + history_valid = torch.zeros((1, 4), dtype=torch.bool, device=frames.device) + take = min(4, completed.shape[0]) + if take: + history[0, -take:] = completed[-take:] + history_valid[0, -take:] = True + if self._bit_mode == "zero": + # Preserve temporal availability while removing effect content. + history.zero_() + elif self._bit_mode == "shuffled" and take > 1: + # Reverse only completed slots and keep their right-aligned causal positions. + history[0, -take:] = history[0, -take:].flip(dims=(0,)) + global_feature = self._task_context_from_initial_observation(frames_rgb[0], str(obs["prompt"])) + current_phase = encoded["phase"][:, -1].float() + current_visual_key = encoded["visual_key"][:, -1].float() + complete_indices = torch.nonzero(encoded["effect_complete"][0], as_tuple=False).flatten() + if complete_indices.numel() > 0: + current_effect_post = encoded["effect_post"][:, complete_indices[-1]].float() + current_effect_valid = True + else: + current_effect_post = current_phase.new_zeros((1, self._cte.cfg.effect_dim)) + current_effect_valid = False + return ( + global_feature, + current_phase, + history, + history_valid, + current_visual_key, + current_effect_post, + current_effect_valid, + ) + + def _transition_context( + self, + obs: dict[str, Any], + phase: torch.Tensor, + visual_key: torch.Tensor, + effect_post: torch.Tensor, + effect_valid: bool, + ) -> tuple[torch.Tensor, dict[str, Any]] | None: + """Read/commit one causal transition-memory step. + + ``pim_executed_action`` is accepted only on the *next* request and + must contain exactly the 16 controls executed after the previous + request. Therefore an incomplete/safety-aborted rollout cannot enter + the memory. The current request itself is never used as support. + """ + controller = self._transition_controller + if controller is None: + return None + task_cluster = str(obs.get("pim_task_cluster") or obs.get("prompt") or "") + if not task_cluster: + raise ValueError("pim_task_cluster/prompt is required for transition memory") + session_id = str(obs.get("pim_session_id") or task_cluster) + environment_seed = int(obs.get("pim_environment_seed", -1)) + attempt_id = int(obs.get("pim_attempt_id", -1)) + if environment_seed < 0 or attempt_id < 0: + raise ValueError("pim_environment_seed and pim_attempt_id are required and must be non-negative") + requested_session = AttemptSessionKey(session_id, task_cluster, environment_seed) + reset_memory = bool(obs.get("pim_memory_reset", False)) + reset_replan = bool(obs.get("pim_replan_reset", False)) + if reset_memory or self._transition_session_id != session_id: + if attempt_id != 0: + raise ValueError("a new attempt-session must start at pim_attempt_id=0") + controller.reset(task_cluster) + self._transition_replan_open = False + self._transition_pending_start = None + self._transition_session_id = session_id + self._transition_session_key = requested_session + self._transition_attempt_id = attempt_id + elif controller.memory.task_cluster != task_cluster: + # A task change without an explicit reset is unsafe; fail-fast + # rather than mixing support across Atomic-5 clusters. + raise ValueError( + f"transition memory task changed from {controller.memory.task_cluster!r} to {task_cluster!r}; " + "send pim_memory_reset=true" + ) + else: + assert self._transition_session_key is not None + self._transition_session_key.assert_compatible(requested_session) + assert self._transition_attempt_id is not None + if attempt_id < self._transition_attempt_id or attempt_id > self._transition_attempt_id + 1: + raise ValueError( + f"pim_attempt_id must stay constant within an attempt or increment by one; " + f"previous={self._transition_attempt_id}, requested={attempt_id}" + ) + if attempt_id == self._transition_attempt_id + 1 and not reset_replan: + raise ValueError("a new attempt must send pim_replan_reset=true") + self._transition_attempt_id = attempt_id + + if self._transition_replan_open: + if reset_replan: + completed = False + executed = torch.zeros((controller.schema.action_horizon, controller.schema.action_dim)) + else: + executed_np = np.asarray(obs.get("pim_executed_action", np.empty((0, 7))), dtype=np.float32) + completed = bool(obs.get("pim_transition_complete", False)) + if completed: + if executed_np.shape != (controller.schema.action_horizon, controller.schema.action_dim): + raise ValueError( + "pim_transition_complete requires exactly [16,7] executed actions, " + f"got {executed_np.shape}" + ) + if not np.isfinite(executed_np).all() or self._transition_pending_start is None or not effect_valid: + completed = False + executed = torch.from_numpy(np.ascontiguousarray(executed_np)) + else: + executed = torch.zeros((controller.schema.action_horizon, controller.schema.action_dim)) + pending = self._transition_pending_start + if pending is None: + completed = False + pending = {"phase": phase.detach(), "visual_key": visual_key.detach()} + controller.complete_replan( + phase=pending["phase"], + visual_key=pending["visual_key"], + effect_post=effect_post[0].detach(), + executed_action=executed, + next_visual_key=visual_key[0].detach(), + next_phase=phase[0].detach(), + latent_index=int(obs.get("pim_latent_index", 0)), + completed=completed, + metadata=(pending.get("metadata", {}) if isinstance(pending, dict) else {}), + ) + self._transition_replan_open = False + self._transition_pending_start = None + + controller.begin_replan() + phase_cpu = phase[0].detach().float().cpu() + visual_cpu = visual_key[0].detach().float().cpu() + if self._transition_mode == "wrong_task": + query = F.normalize(torch.cat((phase_cpu, visual_cpu)), dim=0) + keys = torch.stack( + [F.normalize(torch.cat((entry.phase, entry.visual_key)), dim=0) for entry in self._transition_wrong_task_entries] + ) + all_scores = keys @ query + k = min(controller.schema.top_k, len(self._transition_wrong_task_entries)) + scores, indices = torch.topk(all_scores, k=k, largest=True, sorted=True) + entries = [self._transition_wrong_task_entries[int(index)] for index in indices] + else: + entries, scores = controller.memory.query(phase_cpu, visual_cpu) + if self._transition_mode == "empty": + entries = [] + scores = torch.empty(0, dtype=torch.float32) + elif self._transition_mode == "shuffled": + entries = list(reversed(entries)) + context = controller.encoder(phase, visual_key, entries) + self._transition_replan_open = True + self._transition_pending_start = { + "phase": phase[0].detach().float().cpu(), + "visual_key": visual_key[0].detach().float().cpu(), + "metadata": { + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "attempt_id": attempt_id, + "replan_index": int(obs.get("pim_replan_index", 0)), + }, + } + info = { + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "attempt_id": attempt_id, + "num_entries": len(entries), + "topk_latent_indices": [int(entry.latent_index) for entry in entries], + "scores": [float(score) for score in scores.tolist()], + "mode": self._transition_mode, + "support_task": self._transition_support_task, + "conditioning": bool(controller.enabled and not self._transition_shadow), + } + log.info(f"[robolab-policy-server] transition_memory {info}") + return context, info + + def _empty_pim_tensors(self, reference: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + length = 4 + if self._pim is not None: + length = self._pim.config.top_k + elif self._model_has_pim: + length = int(self.model.net.behavior_pim_encoder.config.persistent_length) + return ( + reference.new_zeros((1, length, 128), dtype=torch.float32), + reference.new_zeros((1, length, 128), dtype=torch.float32), + torch.zeros((1, length), dtype=torch.bool, device=reference.device), + ) + + def _pim_context( + self, + obs: dict[str, Any], + phase: torch.Tensor, + effect_post: torch.Tensor, + effect_valid: bool, + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, dict[str, Any], np.ndarray | None] | None: + """Commit the previous completed interaction, then retrieve by current phase.""" + pim = self._pim + if pim is None: + return None + task_cluster = str(obs.get("pim_task_cluster") or obs.get("prompt") or "") + session_id = str(obs.get("pim_session_id") or task_cluster) + environment_seed = int(obs.get("pim_environment_seed", -1)) + attempt_id = int(obs.get("pim_attempt_id", -1)) + if not task_cluster or environment_seed < 0 or attempt_id < 0: + raise ValueError("PIM requires task_cluster, environment_seed, and attempt_id") + requested_session = AttemptSessionKey(session_id, task_cluster, environment_seed) + reset_memory = bool(obs.get("pim_memory_reset", False)) + reset_replan = bool(obs.get("pim_replan_reset", False)) + if reset_memory or self._pim_session_id != session_id: + pim.reset_episode(task_cluster, attempt_id=attempt_id) + self._pim_replan_open = False + self._pim_pending_start = None + self._pim_session_id = session_id + self._pim_session_key = requested_session + self._pim_attempt_id = attempt_id + self._pim_attempt_chunks = [] + self._pim_success_trace = [] + self._pim_success_attempt_id = None + else: + assert self._pim_session_key is not None and self._pim_attempt_id is not None + self._pim_session_key.assert_compatible(requested_session) + if attempt_id < self._pim_attempt_id or attempt_id > self._pim_attempt_id + 1: + raise ValueError( + f"PIM attempt_id must stay constant or increment by one: " + f"active={self._pim_attempt_id}, requested={attempt_id}" + ) + new_attempt = attempt_id == self._pim_attempt_id + 1 + if new_attempt and not reset_replan: + raise ValueError("A new PIM attempt must send pim_replan_reset=true") + pim.begin_attempt(attempt_id) + self._pim_attempt_id = attempt_id + if new_attempt: + self._pim_attempt_chunks = [] + + committed = False + merged = False + if self._pim_replan_open: + if not reset_replan: + completed = bool(obs.get("pim_transition_complete", False)) + executed = np.asarray(obs.get("pim_executed_action", np.empty((0, 7))), dtype=np.float32) + expected_shape = (self._pim_executed_action_horizon, 7) + if completed and executed.shape != expected_shape: + raise ValueError( + "PIM completed transition requires " + f"[{self._pim_executed_action_horizon},7] actions, " + f"got {executed.shape}" + ) + pending = self._pim_pending_start + if completed and pending is not None and np.isfinite(executed).all(): + self._pim_attempt_chunks.append( + { + "phase": pending["phase"].detach().float().cpu().contiguous(), + "action": torch.from_numpy(executed.copy()).float().contiguous(), + "replan_index": int(pending.get("metadata", {}).get("replan_index", 0)), + "attempt_id": attempt_id, + } + ) + if completed and pending is not None and effect_valid and np.isfinite(executed).all(): + _, merged = pim.append_completed( + task_cluster=task_cluster, + phase=pending["phase"], + effect=effect_post[0], + attempt_id=attempt_id, + metadata=dict(pending.get("metadata", {})), + ) + committed = True + self._pim_replan_open = False + self._pim_pending_start = None + + current_phase = phase[0].detach().float().cpu() + pim_phase, pim_effect, pim_valid, scores = pim.query_tensors(current_phase) + replan_index = int(obs.get("pim_replan_index", 0)) + replay_action: np.ndarray | None = None + replay_phase_similarity: float | None = None + if ( + self._pim_success_replay_enabled + and self._pim_conditioning + and not self._pim_shadow + and self._pim_success_attempt_id is not None + and attempt_id > self._pim_success_attempt_id + and 0 <= replan_index < len(self._pim_success_trace) + ): + locked = self._pim_success_trace[replan_index] + replay_phase_similarity = float( + F.cosine_similarity( + current_phase.unsqueeze(0), + locked["phase"].unsqueeze(0), + dim=-1, + )[0] + ) + if replay_phase_similarity >= self._pim_success_replay_phase_threshold: + replay_action = locked["action"].detach().float().cpu().numpy().copy() + self._pim_replan_open = True + self._pim_pending_start = { + "phase": phase[0].detach().float().cpu(), + "metadata": { + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "attempt_id": attempt_id, + "replan_index": replan_index, + }, + } + info = { + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "attempt_id": attempt_id, + "entries_total": len(pim), + "num_entries": len(pim), + "retrieved": int(pim_valid.sum()), + "scores": [float(value) for value in scores[pim_valid].tolist()], + "committed": committed, + "merged": merged, + "conditioning": bool(self._pim_conditioning and not self._pim_shadow), + "success_replay_enabled": self._pim_success_replay_enabled, + "success_trace_attempt_id": self._pim_success_attempt_id, + "success_trace_chunks": len(self._pim_success_trace), + "replay_candidate": replay_action is not None, + "replay_phase_similarity": replay_phase_similarity, + } + log.info(f"[robolab-policy-server] pim {info}") + return ( + pim_phase.unsqueeze(0).to(device=phase.device), + pim_effect.unsqueeze(0).to(device=phase.device), + pim_valid.unsqueeze(0).to(device=phase.device), + info, + replay_action, + ) + + def _finalize_pim_attempt(self, obs: dict[str, Any]) -> dict[str, Any]: + pim = self._pim + if pim is None: + raise ValueError("PIM finalization requested while PIM is disabled") + session_id = str(obs.get("pim_session_id") or "") + task_cluster = str(obs.get("pim_task_cluster") or "") + environment_seed = int(obs.get("pim_environment_seed", -1)) + attempt_id = int(obs.get("pim_attempt_id", -1)) + requested = AttemptSessionKey(session_id, task_cluster, environment_seed) + if self._pim_session_key is None or self._pim_attempt_id is None: + raise ValueError("cannot finalize PIM before a session has started") + self._pim_session_key.assert_compatible(requested) + if attempt_id != self._pim_attempt_id: + raise ValueError("PIM finalize attempt_id does not match the active attempt") + committed = False + merged = False + executed = np.asarray(obs.get("pim_executed_action", np.empty((0, 7))), dtype=np.float32) + pending = self._pim_pending_start + if ( + self._pim_replan_open + and pending is not None + and executed.ndim == 2 + and executed.shape[1:] == (7,) + and 0 < executed.shape[0] <= self._pim_executed_action_horizon + and np.isfinite(executed).all() + ): + self._pim_attempt_chunks.append( + { + "phase": pending["phase"].detach().float().cpu().contiguous(), + "action": torch.from_numpy(executed.copy()).float().contiguous(), + "replan_index": int(pending.get("metadata", {}).get("replan_index", 0)), + "attempt_id": attempt_id, + } + ) + if self._pim_replan_open and bool(obs.get("pim_transition_complete", False)): + expected_shape = (self._pim_executed_action_horizon, 7) + if executed.shape != expected_shape: + raise ValueError( + "terminal PIM transition requires exactly " + f"[{self._pim_executed_action_horizon},7] executed actions" + ) + if pending is not None and np.isfinite(executed).all(): + image = _extract_observation_image(obs) + features = self._causal_interaction_features(obs, image) + current_effect_post, current_effect_valid = features[-2], features[-1] + if current_effect_valid: + _, merged = pim.append_completed( + task_cluster=task_cluster, + phase=pending["phase"], + effect=current_effect_post[0], + attempt_id=attempt_id, + metadata=dict(pending.get("metadata", {})), + ) + committed = True + terminal_outcome = str(obs.get("pim_terminal_outcome") or "") + locked_success_trace = False + if ( + self._pim_success_replay_enabled + and terminal_outcome == "success" + and self._pim_success_attempt_id is None + and self._pim_attempt_chunks + ): + ordered = sorted(self._pim_attempt_chunks, key=lambda item: int(item["replan_index"])) + expected_indices = list(range(len(ordered))) + actual_indices = [int(item["replan_index"]) for item in ordered] + if actual_indices != expected_indices: + raise ValueError( + "successful PIM replay trace must contain contiguous replan indices: " + f"expected={expected_indices}, actual={actual_indices}" + ) + self._pim_success_trace = [ + { + "phase": item["phase"].detach().float().cpu().contiguous(), + "action": item["action"].detach().float().cpu().contiguous(), + "replan_index": int(item["replan_index"]), + "attempt_id": attempt_id, + } + for item in ordered + ] + self._pim_success_attempt_id = attempt_id + locked_success_trace = True + self._pim_replan_open = False + self._pim_pending_start = None + info = { + "session_id": session_id, + "task_cluster": task_cluster, + "attempt_id": attempt_id, + "committed_terminal_transition": committed, + "merged": merged, + "pim_entries_total": len(pim), + "conditioning": bool(self._pim_conditioning and not self._pim_shadow), + "terminal_outcome": terminal_outcome, + "success_trace_locked": locked_success_trace, + "success_trace_attempt_id": self._pim_success_attempt_id, + "success_trace_chunks": len(self._pim_success_trace), + } + log.info(f"[robolab-policy-server] pim_finalize {info}") + return info + + def _restore_pim_session(self, obs: dict[str, Any]) -> dict[str, Any]: + pim = self._pim + if pim is None: + raise ValueError("PIM restore requested while PIM is disabled") + session_id = str(obs.get("pim_session_id") or "") + task_cluster = str(obs.get("pim_task_cluster") or "") + environment_seed = int(obs.get("pim_environment_seed", -1)) + last_attempt_id = int(obs.get("pim_last_attempt_id", -1)) + phase = np.asarray(obs.get("restore_phase"), dtype=np.float32) + effect = np.asarray(obs.get("restore_effect_post"), dtype=np.float32) + n = phase.shape[0] if phase.ndim == 2 else -1 + effect_valid = np.asarray( + obs.get("restore_effect_valid", np.ones(max(n, 0), dtype=np.bool_)), dtype=np.bool_ + ) + attempt_ids = np.asarray(obs.get("restore_attempt_ids"), dtype=np.int64) + success_phase = np.asarray( + obs.get("restore_success_trace_phase", np.empty((0, 128))), dtype=np.float32 + ) + success_action = np.asarray( + obs.get( + "restore_success_trace_action", + np.empty((0, self._pim_executed_action_horizon, 7)), + ), + dtype=np.float32, + ) + success_action_count = np.asarray( + obs.get("restore_success_trace_action_count", np.empty((0,))), dtype=np.int64 + ) + success_attempt_id = int(obs.get("restore_success_trace_attempt_id", -1)) + success_chunks = success_phase.shape[0] if success_phase.ndim == 2 else -1 + if ( + not session_id + or not task_cluster + or environment_seed < 0 + or last_attempt_id < 0 + or phase.shape != (n, 128) + or effect.shape != (n, 128) + or effect_valid.shape != (n,) + or attempt_ids.shape != (n,) + or success_phase.shape != (success_chunks, 128) + or success_action.shape != (success_chunks, self._pim_executed_action_horizon, 7) + or success_action_count.shape != (success_chunks,) + ): + raise ValueError("invalid PIM restore payload") + if n and ( + attempt_ids.min() < 0 + or attempt_ids.max() > last_attempt_id + or np.any(np.diff(attempt_ids) < 0) + ): + raise ValueError("PIM restore attempt IDs must be ordered within the declared history") + if success_chunks: + if ( + success_attempt_id < 0 + or success_attempt_id > last_attempt_id + or np.any(success_action_count <= 0) + or np.any(success_action_count > self._pim_executed_action_horizon) + or not np.isfinite(success_phase).all() + or not np.isfinite(success_action).all() + ): + raise ValueError("invalid successful PIM replay trace in restore payload") + elif success_attempt_id != -1: + raise ValueError("successful PIM replay attempt id requires a non-empty trace") + pim.reset_episode(task_cluster) + for index in range(n): + target_attempt = int(attempt_ids[index]) + while pim.attempt_id is not None and pim.attempt_id < target_attempt: + pim.begin_attempt(pim.attempt_id + 1) + if bool(effect_valid[index]): + pim.append_completed( + task_cluster=task_cluster, + phase=torch.from_numpy(np.ascontiguousarray(phase[index])), + effect=torch.from_numpy(np.ascontiguousarray(effect[index])), + attempt_id=target_attempt, + metadata={"restored": True}, + ) + while pim.attempt_id is not None and pim.attempt_id < last_attempt_id: + pim.begin_attempt(pim.attempt_id + 1) + self._pim_session_id = session_id + self._pim_session_key = AttemptSessionKey(session_id, task_cluster, environment_seed) + self._pim_attempt_id = last_attempt_id + self._pim_replan_open = False + self._pim_pending_start = None + self._pim_attempt_chunks = [] + self._pim_success_trace = [ + { + "phase": torch.from_numpy(np.ascontiguousarray(success_phase[index])).float(), + "action": torch.from_numpy( + np.ascontiguousarray(success_action[index, : success_action_count[index]]) + ).float(), + "replan_index": index, + "attempt_id": success_attempt_id, + } + for index in range(success_chunks) + ] + self._pim_success_attempt_id = success_attempt_id if success_chunks else None + info = { + "session_id": session_id, + "task_cluster": task_cluster, + "last_attempt_id": last_attempt_id, + "restored_transitions": n, + "restored_valid_effects": int(effect_valid.sum()), + "pim_entries_total": len(pim), + "conditioning": bool(self._pim_conditioning and not self._pim_shadow), + "success_trace_attempt_id": self._pim_success_attempt_id, + "success_trace_chunks": len(self._pim_success_trace), + } + log.info(f"[robolab-policy-server] pim_restore {info}") + return info + + def _finalize_transition_attempt(self, obs: dict[str, Any]) -> dict[str, Any]: + """Commit a final full window, discard a partial one, then label the attempt.""" + controller = self._transition_controller + if controller is None: + raise ValueError("pim_finalize_attempt requires transition memory or shadow mode") + session_id = str(obs.get("pim_session_id") or "") + task_cluster = str(obs.get("pim_task_cluster") or "") + environment_seed = int(obs.get("pim_environment_seed", -1)) + attempt_id = int(obs.get("pim_attempt_id", -1)) + if not session_id or not task_cluster or environment_seed < 0 or attempt_id < 0: + raise ValueError("finalize requires session_id, task_cluster, environment_seed, and attempt_id") + requested_session = AttemptSessionKey(session_id, task_cluster, environment_seed) + if self._transition_session_key is None or self._transition_attempt_id is None: + raise ValueError("cannot finalize before a transition-memory session has started") + self._transition_session_key.assert_compatible(requested_session) + if attempt_id != self._transition_attempt_id: + raise ValueError( + f"finalize attempt_id mismatch: active={self._transition_attempt_id}, requested={attempt_id}" + ) + + committed_terminal_transition = False + if self._transition_replan_open: + completed = bool(obs.get("pim_transition_complete", False)) + executed_np = np.asarray(obs.get("pim_executed_action", np.empty((0, 7))), dtype=np.float32) + pending = self._transition_pending_start + if completed: + if executed_np.shape != (controller.schema.action_horizon, controller.schema.action_dim): + raise ValueError( + "terminal pim_transition_complete requires exactly [16,7] actions, " + f"got {executed_np.shape}" + ) + if not np.isfinite(executed_np).all() or pending is None: + completed = False + if completed: + ( + _, + phase, + _, + _, + visual_key, + current_effect_post, + current_effect_valid, + ) = self._causal_interaction_features(obs, _extract_observation_image(obs)) + completed = bool(current_effect_valid) + if completed: + assert pending is not None + committed_terminal_transition = controller.complete_replan( + phase=pending["phase"], + visual_key=pending["visual_key"], + effect_post=current_effect_post[0].detach(), + executed_action=torch.from_numpy(np.ascontiguousarray(executed_np)), + next_visual_key=visual_key[0].detach(), + next_phase=phase[0].detach(), + latent_index=int(obs.get("pim_latent_index", 0)), + completed=True, + metadata=pending.get("metadata", {}), + ) + else: + controller.discard_open_replan() + self._transition_replan_open = False + self._transition_pending_start = None + + outcome = str(obs.get("pim_terminal_outcome") or "") + termination_reason = str(obs.get("pim_termination_reason") or "") + total_steps = int(obs.get("pim_total_steps", -1)) + final_progress = float(obs.get("pim_final_progress", -1.0)) + annotated = controller.memory.annotate_attempt_outcome( + attempt_id, + outcome=outcome, + termination_reason=termination_reason, + total_steps=total_steps, + final_progress=final_progress, + ) + info = { + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "attempt_id": attempt_id, + "terminal_outcome": outcome, + "termination_reason": termination_reason, + "total_steps": total_steps, + "final_progress": final_progress, + "progress_source": "success_only", + "annotated_transitions": annotated, + "committed_terminal_transition": committed_terminal_transition, + "memory_entries_total": len(controller.memory), + "conditioning": bool(controller.enabled and not self._transition_shadow), + } + log.info(f"[robolab-policy-server] pim_finalize {info}") + return info + + def _restore_transition_session(self, obs: dict[str, Any]) -> dict[str, Any]: + """Restore causally completed transitions from attempt artifacts.""" + controller = self._transition_controller + if controller is None: + raise ValueError("pim_restore_session requires transition memory or shadow mode") + session_id = str(obs.get("pim_session_id") or "") + task_cluster = str(obs.get("pim_task_cluster") or "") + environment_seed = int(obs.get("pim_environment_seed", -1)) + last_attempt_id = int(obs.get("pim_last_attempt_id", -1)) + if not session_id or not task_cluster or environment_seed < 0 or last_attempt_id < 0: + raise ValueError("restore requires session/task/seed and a non-negative last_attempt_id") + + phase = np.asarray(obs.get("restore_phase"), dtype=np.float32) + visual_key = np.asarray(obs.get("restore_visual_key"), dtype=np.float32) + effect_post = np.asarray(obs.get("restore_effect_post"), dtype=np.float32) + executed_action = np.asarray(obs.get("restore_executed_action"), dtype=np.float32) + next_visual_key = np.asarray(obs.get("restore_next_visual_key"), dtype=np.float32) + next_phase = np.asarray(obs.get("restore_next_phase"), dtype=np.float32) + latent_index = np.asarray(obs.get("restore_latent_index"), dtype=np.int64) + attempt_ids = np.asarray(obs.get("restore_attempt_ids"), dtype=np.int64) + replan_indices = np.asarray(obs.get("restore_replan_indices"), dtype=np.int64) + outcomes = list(obs.get("restore_outcomes", [])) + reasons = list(obs.get("restore_termination_reasons", [])) + total_steps = np.asarray(obs.get("restore_total_steps"), dtype=np.int64) + final_progress = np.asarray(obs.get("restore_final_progress"), dtype=np.float32) + n = phase.shape[0] if phase.ndim == 2 else -1 + expected_shapes = { + "phase": (n, controller.schema.phase_dim), + "visual_key": (n, controller.schema.visual_key_dim), + "effect_post": (n, controller.schema.effect_dim), + "executed_action": (n, controller.schema.action_horizon, controller.schema.action_dim), + "next_visual_key": (n, controller.schema.visual_key_dim), + "next_phase": (n, controller.schema.phase_dim), + "latent_index": (n,), + "attempt_ids": (n,), + "replan_indices": (n,), + "total_steps": (n,), + "final_progress": (n,), + } + actual = { + "phase": phase.shape, + "visual_key": visual_key.shape, + "effect_post": effect_post.shape, + "executed_action": executed_action.shape, + "next_visual_key": next_visual_key.shape, + "next_phase": next_phase.shape, + "latent_index": latent_index.shape, + "attempt_ids": attempt_ids.shape, + "replan_indices": replan_indices.shape, + "total_steps": total_steps.shape, + "final_progress": final_progress.shape, + } + bad = {key: (actual[key], shape) for key, shape in expected_shapes.items() if actual[key] != shape} + if n < 0 or bad or len(outcomes) != n or len(reasons) != n: + raise ValueError(f"invalid online restore payload: n={n}, bad_shapes={bad}") + if n > controller.schema.capacity: + raise ValueError(f"restore payload exceeds memory capacity {controller.schema.capacity}") + if n and (attempt_ids.min() < 0 or attempt_ids.max() > last_attempt_id): + raise ValueError("restore transition attempt IDs exceed the declared session history") + + controller.reset(task_cluster) + for index in range(n): + outcome = str(outcomes[index]) + reason = str(reasons[index]) + if outcome not in {"success", "failure"}: + raise ValueError(f"invalid restored outcome {outcome!r}") + controller.memory.append( + TransitionRecord( + task_cluster=task_cluster, + phase=torch.from_numpy(np.ascontiguousarray(phase[index])), + visual_key=torch.from_numpy(np.ascontiguousarray(visual_key[index])), + effect_post=torch.from_numpy(np.ascontiguousarray(effect_post[index])), + executed_action=torch.from_numpy(np.ascontiguousarray(executed_action[index])), + next_visual_key=torch.from_numpy(np.ascontiguousarray(next_visual_key[index])), + next_phase=torch.from_numpy(np.ascontiguousarray(next_phase[index])), + latent_index=int(latent_index[index]), + schema_hash=controller.schema.hash, + metadata={ + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "attempt_id": int(attempt_ids[index]), + "replan_index": int(replan_indices[index]), + "terminal_outcome": outcome, + "termination_reason": reason, + "total_steps": int(total_steps[index]), + "final_progress": float(final_progress[index]), + "progress_source": "success_only", + "restored_from_client_artifact": True, + }, + ) + ) + self._transition_session_id = session_id + self._transition_session_key = AttemptSessionKey(session_id, task_cluster, environment_seed) + self._transition_attempt_id = last_attempt_id + self._transition_replan_open = False + self._transition_pending_start = None + info = { + "session_id": session_id, + "task_cluster": task_cluster, + "environment_seed": environment_seed, + "last_attempt_id": last_attempt_id, + "restored_transitions": n, + "memory_entries_total": len(controller.memory), + "conditioning": bool(controller.enabled and not self._transition_shadow), + } + log.info(f"[robolab-policy-server] pim_restore {info}") + return info + + def _build_sample(self, obs: dict[str, Any]) -> dict[str, Any]: + prompt = obs.get("prompt") + if not isinstance(prompt, str): + raise ValueError("'prompt' must be a string") + + image = _extract_observation_image(obs) + image_h = self.cfg.image_height + image_w = self.cfg.image_width + if image.shape[:2] != (image_h, image_w): + image = _resize_rgb_uint8(image, (image_h, image_w)) + t_frames = self.cfg.action_chunk_size + 1 + video = torch.zeros((3, t_frames, image_h, image_w), dtype=torch.uint8) # [3,T,H,W] + video[:, 0] = torch.from_numpy(image.copy()).permute(2, 0, 1) # [3,H,W] + + use_state_rows = 1 if self.cfg.use_state else 0 + action = torch.zeros( + (self.cfg.action_chunk_size + use_state_rows, self.cfg.action_dim), + dtype=torch.float32, + ) # [T,D] + history_action: torch.Tensor | None = None + num_history_rows = self.cfg.history_length - use_state_rows + gripper_position: np.ndarray | None = None + if self.cfg.use_state or num_history_rows > 0: + gripper_position = 1.0 - _ensure_gripper_array(obs["observation/gripper_position"]) + + if self.cfg.action_space == "joint_pos" and (self.cfg.use_state or num_history_rows > 0): + joint_position = _ensure_2d_float_array(obs["observation/joint_position"], "observation/joint_position", 7) + if self.cfg.use_state: + assert gripper_position is not None + action[0] = torch.from_numpy(np.concatenate((joint_position[-1], gripper_position[-1]))) # [D] + if num_history_rows > 0: + assert gripper_position is not None + if len(joint_position) < num_history_rows + 1: + raise ValueError("Not enough joint_position rows for requested history_length") + history_np = np.concatenate( + (joint_position[-num_history_rows - 1 : -1], gripper_position[-num_history_rows - 1 : -1]), + axis=-1, + ) + history_action = torch.from_numpy(history_np).float() # [H,D] + + if self.cfg.action_space == "midtrain" and (self.cfg.use_state or num_history_rows > 0): + eef_pos = _ensure_2d_float_array(obs["observation/eef_pos"], "observation/eef_pos", 3) + eef_quat = _ensure_2d_float_array(obs["observation/eef_quat"], "observation/eef_quat", 4) + if self.cfg.use_state: + assert gripper_position is not None + rot6d = convert_rotation(eef_quat[-1], "quat_xyzw", "rot6d") + action[0] = torch.from_numpy(np.concatenate((eef_pos[-1], rot6d, gripper_position[-1]))) # [D] + if num_history_rows > 0: + assert gripper_position is not None + if len(eef_pos) < num_history_rows + 1 or len(eef_quat) < num_history_rows + 1: + raise ValueError("Not enough eef_pos/eef_quat rows for requested history_length") + poses_abs = build_abs_pose_from_components(eef_pos, eef_quat, "quat_xyzw") + poses_rel = pose_abs_to_rel(poses_abs, rotation_format="rot6d", pose_convention="backward_framewise") + history_np = np.concatenate( + [poses_rel[-num_history_rows:], gripper_position[-num_history_rows:]], + axis=-1, + ) + history_action = torch.from_numpy(history_np).float() # [H,D] + + sample: dict[str, Any] = { + "ai_caption": prompt, + "video": video, + "action": action, + "conditioning_fps": torch.tensor(self.cfg.conditioning_fps, dtype=torch.long), # [] + "mode": "wam", + "domain_id": torch.tensor(get_domain_id(self.cfg.domain_name), dtype=torch.long), # [] + "viewpoint": "concat_view", + "additional_view_description": _CONCAT_VIEW_DESCRIPTION, + } + proprio = np.asarray(obs.get("observation/proprio"), dtype=np.float32) + if proprio.ndim > 1: + proprio = proprio[-1] + if proprio.shape != (self.cfg.proprio_dim,): + raise ValueError( + f"'observation/proprio' must have shape [{self.cfg.proprio_dim}], got {proprio.shape}" + ) + sample["proprio"] = torch.from_numpy(proprio.copy()) + if history_action is not None: + sample["history_action"] = history_action + # The selected arm7 channels have min/max statistics of -1/+1, so the + # configured min-max action normalization is numerically the identity. + # Build the same model-space sample used by training. + sample = self._transform(sample, self.cfg.resolution) + if isinstance(sample.get("ai_caption"), dict): + sample["ai_caption"] = json.dumps(sample["ai_caption"]) + return sample + + def infer(self, obs: dict[str, Any]) -> dict[str, Any]: + if bool(obs.get("pim_restore_session", False)): + with self._lock: + restore_info = ( + self._restore_pim_session(obs) if self._pim_active else self._restore_transition_session(obs) + ) + zeva_contract = contract_manifest() + zeva_contract["pim_conditioning"] = bool(restore_info["conditioning"]) + zeva_contract["memory_backend"] = "pim" if self._pim_active else "transition_memory" + return {"pim_restore": restore_info, "zeva_contract": zeva_contract} + + if bool(obs.get("pim_finalize_attempt", False)): + with self._lock: + with torch.inference_mode(): + finalize_info = ( + self._finalize_pim_attempt(obs) if self._pim_active else self._finalize_transition_attempt(obs) + ) + zeva_contract = contract_manifest() + zeva_contract["pim_conditioning"] = bool(finalize_info["conditioning"]) + zeva_contract["memory_backend"] = "pim" if self._pim_active else "transition_memory" + return {"pim_finalize": finalize_info, "zeva_contract": zeva_contract} + + sample = self._build_sample(obs) + requested_seed = obs.get("inference_seed") + seed = self._next_seed() if requested_seed is None else int(requested_seed) + if seed < 0 or seed >= 2**32: + raise ValueError("inference_seed must be in uint32 range") + transition_info: dict[str, Any] | None = None + pim_info: dict[str, Any] | None = None + pim_replay_action: np.ndarray | None = None + cte_features: dict[str, Any] | None = None + + with self._lock: + with torch.inference_mode(): + if self._zeva_enabled: + ( + global_feature, + phase, + effect, + effect_valid, + visual_key, + current_effect_post, + current_effect_valid, + ) = self._causal_interaction_features( + obs, _extract_observation_image(obs) + ) + sample["behavior_global"] = global_feature[0].cpu() + sample["behavior_phase"] = phase[0].cpu() + sample["behavior_effect"] = effect[0].cpu() + sample["behavior_effect_valid"] = effect_valid[0].cpu() + cte_features = { + "global": global_feature[0].detach().float().cpu().numpy(), + "phase": phase[0].detach().float().cpu().numpy(), + "effect_history": effect[0].detach().float().cpu().numpy(), + "visual_key": visual_key[0].detach().float().cpu().numpy(), + "latest_effect_post": current_effect_post[0].detach().float().cpu().numpy(), + "latest_effect_valid": bool(current_effect_valid), + "effect_history_valid": effect_valid[0].detach().cpu().numpy(), + } + transition_readout = self._transition_context( + obs, + phase, + visual_key, + current_effect_post, + current_effect_valid, + ) + if transition_readout is not None: + transition_context, transition_info = transition_readout + if self._transition_shadow: + transition_context = torch.zeros_like(transition_context) + if self._model_has_online_prefix: + sample["behavior_online_context"] = transition_context[0].detach().cpu() + elif self._model_has_online_prefix: + # Policies without a transition-memory readout receive + # an exact zero context. + sample["behavior_online_context"] = torch.zeros((256,), dtype=torch.float32) + pim_diagnostic_skip_lifecycle = bool( + obs.get("pim_diagnostic_skip_lifecycle", False) + ) + pim_readout = ( + None + if pim_diagnostic_skip_lifecycle + else self._pim_context( + obs, + phase, + current_effect_post, + current_effect_valid, + ) + ) + if pim_readout is not None: + pim_phase, pim_effect, pim_valid, pim_info, pim_replay_action = pim_readout + if self._pim_shadow: + pim_valid = torch.zeros_like(pim_valid) + if self._model_has_pim: + sample["behavior_pim_phase"] = pim_phase[0].detach().cpu() + sample["behavior_pim_effect"] = pim_effect[0].detach().cpu() + sample["behavior_pim_valid"] = pim_valid[0].detach().cpu() + elif self._model_has_pim: + pim_phase, pim_effect, pim_valid = self._empty_pim_tensors(phase) + sample["behavior_pim_phase"] = pim_phase[0].cpu() + sample["behavior_pim_effect"] = pim_effect[0].cpu() + sample["behavior_pim_valid"] = pim_valid[0].cpu() + elif self._model_has_online_prefix or self._model_has_pim: + raise RuntimeError("Loaded PIM policy requires CTE features") + data_batch = _build_data_batch_from_sample(sample) + log.info(f"[robolab-policy-server] prompt={data_batch['ai_caption'][0]!r} seed={seed}") + samples = self.model.generate_samples_from_batch( + data_batch, + guidance=self.cfg.guidance, + seed=[seed], + num_steps=self.cfg.num_steps, + shift=self.cfg.shift, + ) + + action = samples["action"][0][:, : self.cfg.action_dim] # [T,D] + action = action[self.cfg.history_length :] # [T2,D] + action_np = action.detach().cpu().numpy() # [T2,D] + if self.cfg.action_dim == 7 and action_np.shape[0] != PREDICTED_ACTION_HORIZON: + raise RuntimeError( + f"Zeva RoboCasa server must predict {PREDICTED_ACTION_HORIZON} actions, " + f"got {action_np.shape}" + ) + if pim_replay_action is not None: + if ( + pim_replay_action.ndim != 2 + or pim_replay_action.shape[1] != self.cfg.action_dim + or not 0 < pim_replay_action.shape[0] <= action_np.shape[0] + or not np.isfinite(pim_replay_action).all() + ): + raise ValueError(f"invalid PIM successful replay action shape {pim_replay_action.shape}") + replay_count = int(pim_replay_action.shape[0]) + blend = self._pim_success_replay_blend + action_np[:replay_count] = ( + (1.0 - blend) * action_np[:replay_count] + blend * pim_replay_action + ) + if pim_info is not None: + pim_info["replay_applied"] = True + pim_info["replay_action_count"] = replay_count + pim_info["replay_blend"] = blend + log.info( + "[robolab-policy-server] pim_success_replay " + f"attempt={pim_info.get('attempt_id') if pim_info else None} " + f"count={replay_count} blend={blend} " + f"phase_similarity={pim_info.get('replay_phase_similarity') if pim_info else None}" + ) + elif pim_info is not None: + pim_info["replay_applied"] = False + # RoboCasa365 arm7 already stores gripper_close in the simulator convention. + log.info( + "[robolab-policy-server] action_raw " + f"shape={action_np.shape} min={action_np.min():.4f} max={action_np.max():.4f} " + f"mean_abs={np.abs(action_np).mean():.4f}" + ) + + if self.cfg.action_space == "midtrain": + eef_pos = _ensure_2d_float_array(obs["observation/eef_pos"], "observation/eef_pos", 3) + eef_quat = _ensure_2d_float_array(obs["observation/eef_quat"], "observation/eef_quat", 4) + initial_pose = np.eye(4, dtype=np.float32) + initial_pose[:3, :3] = convert_rotation(eef_quat[-1], "quat_xyzw", "matrix") + initial_pose[:3, 3] = eef_pos[-1] + abs_pose = pose_rel_to_abs( + action_np[:, :9], + rotation_format="rot6d", + pose_convention="backward_framewise", + initial_pose=initial_pose, + ) + position = abs_pose[1:, :3, 3] + quat_xyzw = convert_rotation(abs_pose[1:, :3, :3], "matrix", "quat_xyzw") + action_np = np.concatenate([position, quat_xyzw, action_np[:, 9:]], axis=-1) + + zeva_contract = contract_manifest() + zeva_contract.update( + { + "inference_seed": seed, + "pim_conditioning": bool( + ( + self._transition_controller is not None + and self._transition_controller.enabled + and not self._transition_shadow + ) + or (self._pim_conditioning and not self._pim_shadow) + ), + "memory_backend": ( + "pim" if self._pim_active else ("transition_memory" if self._transition_enabled else "none") + ), + "pim_model_hard_bypass": bool( + self._pim_active and getattr(self, "_pim_model_hard_bypass", False) + ), + "pim_diagnostic_skip_lifecycle": bool( + obs.get("pim_diagnostic_skip_lifecycle", False) + ), + } + ) + outputs: dict[str, Any] = {"action": action_np, "zeva_contract": zeva_contract} + if transition_info is not None: + outputs["transition_memory"] = transition_info + if pim_info is not None: + outputs["pim"] = pim_info + if cte_features is not None: + outputs["cte_features"] = cte_features + if self.cfg.decode_video: + pred_vision_latent = samples["vision"][0] # [C,T,H,W] + video = self.model.decode(pred_vision_latent) # [1,C,T,H,W] + video = ((video[0].clamp(-1.0, 1.0) + 1.0) * 127.5).to(torch.uint8).permute(1, 2, 3, 0) # [T,H,W,3] + outputs["video"] = video.detach().cpu().numpy() + return outputs + + +def serve(args: RobolabServerArgs) -> None: + hostname = socket.gethostname() + log.info(f"[robolab-policy-server] starting host={hostname} bind={args.host}:{int(args.port)}") + service = RobolabPolicyService(args) + local_ip = get_local_ip() + log.info(f"[robolab-policy-server] Server accessible at: ws://{local_ip}:{int(args.port)}/") + log.info(f"[robolab-policy-server] Health check: http://{local_ip}:{int(args.port)}/healthz") + server_cls = _load_openpi_websocket_policy_server() + server_cls(policy=service, host=args.host, port=int(args.port), metadata={}).serve_forever() + + +def main() -> None: + cascade_subcommand_args = getattr( + tyro.conf, + "CascadeSubcommandArgs", + tyro.conf.ConsolidateSubcommandArgs, + ) + args = tyro_cli( + RobolabServerArgs, + description=__doc__, + config=( + tyro.conf.OmitArgPrefixes, + cascade_subcommand_args, + tyro.conf.OmitSubcommandPrefixes, + ), + ) + serve(args) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/cosmos_framework/scripts/eval_zeva_robocasa365.py b/releases/bridge-native-v3/code/cosmos_framework/scripts/eval_zeva_robocasa365.py new file mode 100644 index 0000000000000000000000000000000000000000..a185fcfe6e1892490919670979b41d515c572878 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/scripts/eval_zeva_robocasa365.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python3 +"""Closed-loop RoboCasa365 evaluator for the released Atomic-5 policy.""" + +from __future__ import annotations + +import argparse +import json +import os +import time +from collections import deque +from pathlib import Path + +import cv2 +import gymnasium as gym +import numpy as np +from openpi_client.websocket_client_policy import WebsocketClientPolicy + +import robocasa # noqa: F401 +import robocasa.wrappers.gym_wrapper # noqa: F401 +from robocasa.utils.env_utils import convert_action + + +TASK_PROMPTS = { + "OpenStandMixerHead": "Open the stand mixer head.", + "TurnOnElectricKettle": "Press down the lever to turn on the electric kettle.", + "CloseToasterOvenDoor": "Close the toaster oven door.", + "TurnOnMicrowave": "Press the start button on the microwave.", + "CoffeeSetupMug": "Pick the mug from the counter and place it under the coffee machine dispenser.", +} + + +def _obs_value(obs: dict, *keys: str) -> np.ndarray: + for key in keys: + if key in obs: + return np.asarray(obs[key]) + raise KeyError(f"Missing observation; tried {keys}. Available: {sorted(obs)}") + + +def prepare_policy_observation(obs: dict, prompt: str) -> tuple[dict, np.ndarray]: + left = _obs_value(obs, "video.robot0_agentview_left", "robot0_agentview_left_image") + wrist = _obs_value(obs, "video.robot0_eye_in_hand", "robot0_eye_in_hand_image") + if left.shape != wrist.shape or left.ndim != 3 or left.shape[-1] != 3: + raise ValueError(f"Expected matching RGB views, got left={left.shape}, wrist={wrist.shape}") + image = np.concatenate([left, wrist], axis=1).astype(np.uint8, copy=False) + + if "state.end_effector_position_relative" in obs: + proprio = np.concatenate( + [ + np.asarray(obs["state.end_effector_position_relative"], dtype=np.float32), + np.asarray(obs["state.end_effector_rotation_relative"], dtype=np.float32), + np.asarray(obs["state.gripper_qpos"], dtype=np.float32), + ] + ) + else: + proprio = np.concatenate( + [ + np.asarray(obs["robot0_base_to_eef_pos"], dtype=np.float32), + np.asarray(obs["robot0_base_to_eef_quat"], dtype=np.float32), + np.asarray(obs["robot0_gripper_qpos"], dtype=np.float32), + ] + ) + if proprio.shape != (9,): + raise ValueError(f"Expected arm-only 9D proprio, got {proprio.shape}") + return { + "prompt": prompt, + "observation/image": image, + "observation/proprio": proprio, + }, left + + +def env_step(env, arm_action: np.ndarray): + arm_action = np.asarray(arm_action, dtype=np.float32) + if arm_action.shape != (7,) or not np.isfinite(arm_action).all(): + raise ValueError( + f"Invalid arm7 action: shape={arm_action.shape}, finite={np.isfinite(arm_action).all()}" + ) + simulator_action = np.zeros(12, dtype=np.float32) + simulator_action[:7] = np.clip(arm_action, -1.0, 1.0) + result = env.step(convert_action(simulator_action)) + if len(result) == 5: + obs, reward, terminated, truncated, info = result + done = bool(terminated or truncated) + else: + obs, reward, done, info = result + success = bool(info.get("success", False) or reward > 0) + return obs, success, done + + +def save_video(frames: list[np.ndarray], path: Path, fps: int = 20) -> None: + if not frames: + return + path.parent.mkdir(parents=True, exist_ok=True) + height, width = frames[0].shape[:2] + writer = cv2.VideoWriter(str(path), cv2.VideoWriter_fourcc(*"mp4v"), fps, (width, height)) + if not writer.isOpened(): + raise RuntimeError(f"Could not open video writer for {path}") + try: + for frame in frames: + if frame.shape[:2] != (height, width): + raise ValueError(f"Inconsistent video frame shape {frame.shape}") + writer.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) + finally: + writer.release() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--task", choices=sorted(TASK_PROMPTS), required=True) + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, required=True) + parser.add_argument("--episodes", type=int, default=10) + parser.add_argument("--seed", type=int, default=195) + parser.add_argument("--max-steps", type=int, default=300) + parser.add_argument( + "--pim-formal32", + action="store_true", + help=( + "Send the PIM lifecycle fields while preserving the released " + "32-control formal evaluation protocol." + ), + ) + parser.add_argument( + "--open-loop-steps", + type=int, + default=32, + help="Execute the complete 32-action training chunk; shorter values invalidate comparison.", + ) + parser.add_argument("--split", default="target") + parser.add_argument("--output-dir", type=Path, required=True) + parser.add_argument( + "--render-gpu-device-id", + type=int, + default=-1, + help="MuJoCo EGL device index visible to this evaluator (-1: automatic).", + ) + parser.add_argument("--no-video", action="store_true") + args = parser.parse_args() + if args.pim_formal32 and args.open_loop_steps != 32: + raise ValueError("--pim-formal32 requires --open-loop-steps=32") + + os.environ.setdefault("MUJOCO_GL", "egl") + os.environ.setdefault("PYOPENGL_PLATFORM", "egl") + args.output_dir.mkdir(parents=True, exist_ok=True) + client = WebsocketClientPolicy(args.host, args.port) + results = [] + + for episode_idx in range(args.episodes): + episode_seed = args.seed + episode_idx + env = gym.make( + f"robocasa/{args.task}", + split=args.split, + seed=episode_seed, + camera_widths=256, + camera_heights=256, + enable_render=True, + render_gpu_device_id=args.render_gpu_device_id, + robots="PandaOmron", + randomize_cameras=False, + translucent_robot=False, + ) + reset = env.reset() + obs = reset[0] if isinstance(reset, tuple) else reset + frames: list[np.ndarray] = [] + action_queue: deque[np.ndarray] = deque() + + initial_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + cte_boundary_images: list[np.ndarray] = [initial_policy_obs["observation/image"].copy()] + cte_transitions: list[np.ndarray] = [] + pending_transition_actions: list[np.ndarray] = [] + actions_since_replan: list[np.ndarray] = [] + pim_query_info: list[dict] = [] + query_times = [] + success = False + done = False + steps = 0 + + while steps < args.max_steps and not success and not done: + policy_obs, left_frame = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + policy_obs["cte_boundary_images"] = np.stack(cte_boundary_images, axis=0) + policy_obs["cte_transition_actions"] = ( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ) + policy_obs["cte_reset"] = steps == 0 + if not args.no_video: + frames.append(left_frame.copy()) + if not action_queue: + if args.pim_formal32: + policy_obs.update( + { + "pim_session_id": f"formal32:{args.task}:{episode_seed}", + "pim_task_cluster": args.task, + "pim_environment_seed": episode_seed, + "pim_attempt_id": 0, + "pim_memory_reset": steps == 0, + "pim_replan_reset": False, + "pim_latent_index": steps, + "pim_replan_index": len(query_times), + "pim_executed_action": np.asarray( + actions_since_replan, dtype=np.float32 + ).reshape(-1, 7), + "pim_transition_complete": len(actions_since_replan) == 32, + } + ) + start = time.monotonic() + output = client.infer(policy_obs) + query_times.append(time.monotonic() - start) + if args.pim_formal32: + contract = output.get("zeva_contract") + if not isinstance(contract, dict): + raise ValueError("PIM server did not return zeva_contract") + if contract.get("memory_backend") != "pim" or not bool( + contract.get("pim_conditioning", False) + ): + raise ValueError(f"PIM conditioning is not active: {contract}") + info = output.get("pim") + if not isinstance(info, dict): + raise ValueError("PIM server did not return retrieval metadata") + pim_query_info.append(dict(info)) + actions = np.asarray(output["action"], dtype=np.float32) + if actions.ndim != 2 or actions.shape[1] != 7: + raise ValueError(f"Policy returned action shape {actions.shape}, expected [T,7]") + action_queue.extend(actions[: args.open_loop_steps]) + actions_since_replan = [] + executed_action = action_queue.popleft() + obs, success, done = env_step(env, executed_action) + actions_since_replan.append(executed_action.astype(np.float32, copy=True)) + pending_transition_actions.append(executed_action.astype(np.float32, copy=True)) + if len(pending_transition_actions) == 4: + boundary_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + cte_boundary_images.append(boundary_policy_obs["observation/image"].copy()) + cte_transitions.append(np.stack(pending_transition_actions, axis=0)) + pending_transition_actions.clear() + steps += 1 + + if args.pim_formal32: + final_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + final_policy_obs["cte_boundary_images"] = np.stack(cte_boundary_images, axis=0) + final_policy_obs["cte_transition_actions"] = ( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ) + final_policy_obs.update( + { + "pim_finalize_attempt": True, + "pim_session_id": f"formal32:{args.task}:{episode_seed}", + "pim_task_cluster": args.task, + "pim_environment_seed": episode_seed, + "pim_attempt_id": 0, + "pim_latent_index": steps, + "pim_executed_action": np.asarray( + actions_since_replan, dtype=np.float32 + ).reshape(-1, 7), + "pim_transition_complete": len(actions_since_replan) == 32, + "pim_terminal_outcome": "success" if success else "failure", + "pim_termination_reason": "success" if success else ( + "env_done" if done else "max_steps" + ), + "pim_total_steps": steps, + "pim_final_progress": 1.0 if success else 0.0, + } + ) + finalize_output = client.infer(final_policy_obs) + if not isinstance(finalize_output.get("pim_finalize"), dict): + raise ValueError("PIM server did not acknowledge attempt finalization") + + env.close() + record = { + "task": args.task, + "episode": episode_idx, + "seed": episode_seed, + "success": success, + "steps": steps, + "queries": len(query_times), + "mean_query_seconds": float(np.mean(query_times)) if query_times else None, + "pim_formal32": bool(args.pim_formal32), + "pim_entries_last": ( + int(pim_query_info[-1].get("entries_total", 0)) if pim_query_info else 0 + ), + } + results.append(record) + with (args.output_dir / "episodes.jsonl").open("a") as file: + file.write(json.dumps(record) + "\n") + if not args.no_video: + save_video( + frames, + args.output_dir + / f"ep_{episode_idx:03d}_seed_{episode_seed}_{'success' if success else 'fail'}.mp4", + ) + print(json.dumps(record), flush=True) + + summary = { + "task": args.task, + "episodes": len(results), + "successes": sum(item["success"] for item in results), + "success_rate": float(np.mean([item["success"] for item in results])), + "mean_steps": float(np.mean([item["steps"] for item in results])), + "mean_query_seconds": float( + np.mean( + [ + item["mean_query_seconds"] + for item in results + if item["mean_query_seconds"] is not None + ] + ) + ), + } + (args.output_dir / "summary.json").write_text(json.dumps(summary, indent=2) + "\n") + print("SUMMARY " + json.dumps(summary), flush=True) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/cosmos_framework/scripts/eval_zeva_robocasa365_pim.py b/releases/bridge-native-v3/code/cosmos_framework/scripts/eval_zeva_robocasa365_pim.py new file mode 100644 index 0000000000000000000000000000000000000000..44ad557ef87315ab457bb79b506ef730a1745cb7 --- /dev/null +++ b/releases/bridge-native-v3/code/cosmos_framework/scripts/eval_zeva_robocasa365_pim.py @@ -0,0 +1,800 @@ +#!/usr/bin/env python3 +"""Closed-loop RoboCasa365 evaluation client for the Zeva Atomic-5 policy with PIM.""" + +from __future__ import annotations + +import argparse +import json +import logging +import os +import time +from collections import deque +from pathlib import Path + +import cv2 +import gymnasium as gym +import msgpack_numpy +import numpy as np +import websockets.sync.client +from openpi_client.websocket_client_policy import WebsocketClientPolicy + +import robocasa # noqa: F401 +# Gymnasium registration for the Panda-Omron adapter resides in this module +# rather than in RoboCasa's package initializer. +import robocasa.wrappers.gym_wrapper # noqa: F401 +from robocasa.utils.env_utils import convert_action + +try: + from cosmos_framework.model.zeva.attempt_protocol import ( + EXECUTED_ACTION_HORIZON, + MAX_CONTROLS_PER_ATTEMPT, + PREDICTED_ACTION_HORIZON, + PROTOCOL_VERSION, + REQUIRED_WARMUP_REQUESTS, + contract_manifest, + default_session_id, + inference_seed, + ) +except ModuleNotFoundError: + # Allow the evaluator and contract file to be copied together to a + # simulator-only machine that does not contain the full Cosmos source. + from attempt_protocol import ( # type: ignore[no-redef] + EXECUTED_ACTION_HORIZON, + MAX_CONTROLS_PER_ATTEMPT, + PREDICTED_ACTION_HORIZON, + PROTOCOL_VERSION, + REQUIRED_WARMUP_REQUESTS, + contract_manifest, + default_session_id, + inference_seed, + ) + +try: + from cosmos_framework.model.zeva.attempt_artifacts import ( + ATTEMPT_RECORD_VERSION, + CHUNK_RECORD_VERSION, + sha256_file, + validate_attempt_record, + write_manifest, + ) +except ModuleNotFoundError: + from attempt_artifacts import ( # type: ignore[no-redef] + ATTEMPT_RECORD_VERSION, + CHUNK_RECORD_VERSION, + sha256_file, + validate_attempt_record, + write_manifest, + ) + + +TASK_PROMPTS = { + "OpenStandMixerHead": "Open the stand mixer head.", + "TurnOnElectricKettle": "Press down the lever to turn on the electric kettle.", + "CloseToasterOvenDoor": "Close the toaster oven door.", + "TurnOnMicrowave": "Press the start button on the microwave.", + "CoffeeSetupMug": "Pick the mug from the counter and place it under the coffee machine dispenser.", +} + + +class _LongInferenceWebsocketClientPolicy(WebsocketClientPolicy): + """OpenPI client without a keepalive deadline during long GPU inference. + + A normal request takes only a few seconds, but a temporarily contended GPU + can exceed websockets' 20-second keepalive timeout. The request itself is + synchronous and already bounded by the evaluator process, so disabling + protocol pings prevents a completed model outcome from being mislabeled as + an infrastructure failure. + """ + + def _wait_for_server(self): # type: ignore[no-untyped-def, override] + logging.info("Waiting for server at %s...", self._uri) + headers = {"Authorization": f"Api-Key {self._api_key}"} if self._api_key else None + connection = websockets.sync.client.connect( + self._uri, + compression=None, + max_size=None, + additional_headers=headers, + ping_interval=None, + ) + metadata = msgpack_numpy.unpackb(connection.recv()) + return connection, metadata + + +def _obs_value(obs: dict, *keys: str) -> np.ndarray: + for key in keys: + if key in obs: + return np.asarray(obs[key]) + raise KeyError(f"Missing observation; tried {keys}. Available: {sorted(obs)}") + + +def prepare_policy_observation(obs: dict, prompt: str) -> tuple[dict, np.ndarray]: + left = _obs_value(obs, "video.robot0_agentview_left", "robot0_agentview_left_image") + wrist = _obs_value(obs, "video.robot0_eye_in_hand", "robot0_eye_in_hand_image") + if left.shape != wrist.shape or left.ndim != 3 or left.shape[-1] != 3: + raise ValueError(f"Expected matching RGB views, got left={left.shape}, wrist={wrist.shape}") + image = np.concatenate([left, wrist], axis=1).astype(np.uint8, copy=False) + + if "state.end_effector_position_relative" in obs: + proprio = np.concatenate( + [ + np.asarray(obs["state.end_effector_position_relative"], dtype=np.float32), + np.asarray(obs["state.end_effector_rotation_relative"], dtype=np.float32), + np.asarray(obs["state.gripper_qpos"], dtype=np.float32), + ] + ) + else: + proprio = np.concatenate( + [ + np.asarray(obs["robot0_base_to_eef_pos"], dtype=np.float32), + np.asarray(obs["robot0_base_to_eef_quat"], dtype=np.float32), + np.asarray(obs["robot0_gripper_qpos"], dtype=np.float32), + ] + ) + if proprio.shape != (9,): + raise ValueError(f"Expected arm-only 9D proprio, got {proprio.shape}") + return { + "prompt": prompt, + "observation/image": image, + "observation/proprio": proprio, + }, left + + +def env_step(env, arm_action: np.ndarray): + arm_action = np.asarray(arm_action, dtype=np.float32) + if arm_action.shape != (7,) or not np.isfinite(arm_action).all(): + raise ValueError(f"Invalid arm7 action: shape={arm_action.shape}, finite={np.isfinite(arm_action).all()}") + raw = np.zeros(12, dtype=np.float32) + raw[:7] = np.clip(arm_action, -1.0, 1.0) + result = env.step(convert_action(raw)) + if len(result) == 5: + obs, reward, terminated, truncated, info = result + done = bool(terminated or truncated) + else: + obs, reward, done, info = result + success = bool(info.get("success", False) or reward > 0) + return obs, success, done, dict(info) + + +def task_predicate_progress(env, task: str) -> tuple[float, dict[str, float | bool | str]]: + """Return a transparent task-state progress signal for Phase-2 supervision.""" + core = env.unwrapped.env + if task == "TurnOnMicrowave": + turned_on = bool(core.microwave.get_state()["turned_on"]) + button_id = core.sim.model.geom_name2id( + f"{core.microwave.naming_prefix}start_button" + ) + button_pos = core.sim.data.geom_xpos[button_id] + gripper_pos = core.sim.data.site_xpos[core.robots[0].eef_site_id["right"]] + distance = float(np.linalg.norm(gripper_pos - button_pos)) + reach = float(np.exp(-distance / 0.15)) + # Before activation, proximity supplies only the first half of progress. + # After activation, moving >15cm away completes RoboCasa's success predicate. + progress = (0.5 * reach) if not turned_on else (0.75 + 0.25 * min(distance / 0.15, 1.0)) + return float(np.clip(progress, 0.0, 1.0)), { + "schema": "turn_on_microwave_predicate_progress_v1", + "turned_on": turned_on, + "gripper_button_distance": distance, + "reach_score": reach, + } + if task == "OpenStandMixerHead": + head = float(core.stand_mixer.get_state(core)["head"]) + return float(np.clip(head, 0.0, 1.0)), { + "schema": "open_stand_mixer_head_predicate_progress_v1", + "head_joint": head, + } + # Phase-2 training currently admits only tasks with an explicit dense adapter. + return 1.0 if bool(core._check_success()) else 0.0, { + "schema": "terminal_predicate_only_v1", + } + + +def _feature_array(items: list[np.ndarray], width: int) -> np.ndarray: + if not items: + return np.empty((0, width), dtype=np.float32) + result = np.asarray(items, dtype=np.float32) + if result.shape != (len(items), width): + raise ValueError(f"invalid behavior feature shape: expected [N,{width}], got {result.shape}") + return result + + +def restore_session_from_artifacts( + client: WebsocketClientPolicy, + output_dir: Path, + records: list[dict], + *, + session_id: str, + task_cluster: str, + environment_seed: int, +) -> dict: + """Restore completed history so the local manifest remains the session source of truth.""" + restored: dict[str, list] = { + "phase": [], "visual_key": [], "effect_post": [], "effect_valid": [], "executed_action": [], + "next_visual_key": [], "next_phase": [], "latent_index": [], "attempt_ids": [], + "replan_indices": [], "outcomes": [], "termination_reasons": [], + "total_steps": [], "final_progress": [], + } + success_trace_phase = np.empty((0, 128), dtype=np.float32) + success_trace_action = np.empty((0, EXECUTED_ACTION_HORIZON, 7), dtype=np.float32) + success_trace_action_count = np.empty((0,), dtype=np.int64) + success_trace_attempt_id = -1 + for record in records: + artifact = np.load(output_dir / record["artifact_npz"]) + complete = [chunk for chunk in record["chunk_records"] if chunk["completed_16"]] + available = min( + int(artifact["phase"].shape[0]), + int(artifact["visual_key"].shape[0]), + int(artifact["latest_effect_post"].shape[0]), + int(artifact["latest_effect_valid"].shape[0]), + ) - 1 + if len(complete) > available: + terminal_without_post = ( + len(complete) == available + 1 + and bool(record["success"]) + and bool(complete[-1].get("terminal_chunk")) + ) + if not terminal_without_post: + raise ValueError( + "cannot restore a complete chunk without its post-transition behavior features" + ) + # A success exactly on a 16-control boundary has no next + # observation. It is not a valid transition-memory entry, but it + # remains part of the separately restored successful replay trace. + complete = complete[:available] + n = len(complete) + actions = artifact["executed_actions"][: n * EXECUTED_ACTION_HORIZON].reshape(n, 16, 7) + restored["phase"].extend(artifact["phase"][:n]) + restored["visual_key"].extend(artifact["visual_key"][:n]) + restored["effect_post"].extend(artifact["latest_effect_post"][1 : n + 1]) + restored["effect_valid"].extend(artifact["latest_effect_valid"][1 : n + 1]) + restored["executed_action"].extend(actions) + restored["next_visual_key"].extend(artifact["visual_key"][1 : n + 1]) + restored["next_phase"].extend(artifact["phase"][1 : n + 1]) + restored["latent_index"].extend(chunk["end_step"] for chunk in complete) + restored["attempt_ids"].extend([record["attempt_id"]] * n) + restored["replan_indices"].extend(chunk["replan_index"] for chunk in complete) + restored["outcomes"].extend([record["terminal_outcome"]] * n) + restored["termination_reasons"].extend([record["termination_reason"]] * n) + restored["total_steps"].extend([record["total_steps"]] * n) + restored["final_progress"].extend([record["final_progress"]] * n) + if bool(record["success"]) and success_trace_attempt_id < 0: + query_steps = np.asarray(artifact["query_steps"], dtype=np.int64) + executed_actions = np.asarray(artifact["executed_actions"], dtype=np.float32) + phases = np.asarray(artifact["phase"], dtype=np.float32) + if phases.shape[0] < query_steps.shape[0]: + raise ValueError("successful artifact is missing a phase for a replay chunk") + padded_actions = np.zeros( + (query_steps.shape[0], EXECUTED_ACTION_HORIZON, 7), dtype=np.float32 + ) + action_counts = [] + for replan_index, start in enumerate(query_steps): + end = ( + int(query_steps[replan_index + 1]) + if replan_index + 1 < query_steps.shape[0] + else int(record["total_steps"]) + ) + count = end - int(start) + if not 0 < count <= EXECUTED_ACTION_HORIZON: + raise ValueError(f"invalid successful replay chunk length {count}") + padded_actions[replan_index, :count] = executed_actions[int(start) : end] + action_counts.append(count) + success_trace_phase = phases[: query_steps.shape[0]].copy() + success_trace_action = padded_actions + success_trace_action_count = np.asarray(action_counts, dtype=np.int64) + success_trace_attempt_id = int(record["attempt_id"]) + n = len(restored["phase"]) + request = { + "pim_restore_session": True, + "pim_session_id": session_id, + "pim_task_cluster": task_cluster, + "pim_environment_seed": environment_seed, + "pim_last_attempt_id": int(records[-1]["attempt_id"]), + "restore_phase": np.asarray(restored["phase"], dtype=np.float32).reshape(n, 128), + "restore_visual_key": np.asarray(restored["visual_key"], dtype=np.float32).reshape(n, 128), + "restore_effect_post": np.asarray(restored["effect_post"], dtype=np.float32).reshape(n, 128), + "restore_effect_valid": np.asarray(restored["effect_valid"], dtype=np.bool_).reshape(n), + "restore_executed_action": np.asarray(restored["executed_action"], dtype=np.float32).reshape(n, 16, 7), + "restore_next_visual_key": np.asarray(restored["next_visual_key"], dtype=np.float32).reshape(n, 128), + "restore_next_phase": np.asarray(restored["next_phase"], dtype=np.float32).reshape(n, 128), + "restore_latent_index": np.asarray(restored["latent_index"], dtype=np.int64), + "restore_attempt_ids": np.asarray(restored["attempt_ids"], dtype=np.int64), + "restore_replan_indices": np.asarray(restored["replan_indices"], dtype=np.int64), + "restore_outcomes": restored["outcomes"], + "restore_termination_reasons": restored["termination_reasons"], + "restore_total_steps": np.asarray(restored["total_steps"], dtype=np.int64), + "restore_final_progress": np.asarray(restored["final_progress"], dtype=np.float32), + "restore_success_trace_phase": success_trace_phase, + "restore_success_trace_action": success_trace_action, + "restore_success_trace_action_count": success_trace_action_count, + "restore_success_trace_attempt_id": success_trace_attempt_id, + } + output = client.infer(request).get("pim_restore") + if not isinstance(output, dict) or int(output.get("restored_transitions", -1)) != n: + raise ValueError("policy server did not acknowledge the exact restored transition count") + return output + + +def save_video(frames: list[np.ndarray], path: Path, fps: int = 20) -> None: + if not frames: + return + path.parent.mkdir(parents=True, exist_ok=True) + height, width = frames[0].shape[:2] + writer = cv2.VideoWriter( + str(path), cv2.VideoWriter_fourcc(*"mp4v"), fps, (width, height) + ) + if not writer.isOpened(): + raise RuntimeError(f"Could not open video writer for {path}") + try: + for frame in frames: + if frame.shape[:2] != (height, width): + raise ValueError(f"Inconsistent video frame shape {frame.shape}") + writer.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) + finally: + writer.release() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--task", choices=sorted(TASK_PROMPTS), required=True) + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, required=True) + parser.add_argument("--episodes", type=int, default=10) + parser.add_argument( + "--attempt-start", + type=int, + default=0, + help="Resume a fixed-seed session at this attempt ID; existing episodes.jsonl is audited first.", + ) + parser.add_argument("--seed", type=int, default=195) + parser.add_argument("--max-steps", type=int, default=MAX_CONTROLS_PER_ATTEMPT) + parser.add_argument( + "--open-loop-steps", + type=int, + default=EXECUTED_ACTION_HORIZON, + help="Controls executed from each 32-step policy chunk; 16 is the PIM contract.", + ) + parser.add_argument( + "--seed-mode", + choices=("fixed", "increment"), + default="fixed", + help="fixed repeats one environment seed across attempts; increment is an independent-seed batch.", + ) + parser.add_argument( + "--diffusion-seed", + type=int, + default=20260824, + help="Base for the explicit attempt/replan inference-seed schedule used by paired conditions.", + ) + parser.add_argument( + "--expect-pim-conditioning", + dest="expect_pim_conditioning", + choices=("off", "on", "any"), + default="off", + help="Require the server to report the expected PIM conditioning state.", + ) + parser.add_argument( + "--pim-session-id", + dest="pim_session_id", + default=None, + help="Session key shared across repeated attempts of the same task; defaults to the task name.", + ) + parser.add_argument( + "--task-cluster", + dest="task_cluster", + default=None, + help="Atomic-5 task cluster key; defaults to --task.", + ) + parser.add_argument("--split", default="target") + parser.add_argument("--output-dir", type=Path, required=True) + parser.add_argument( + "--render-gpu-device-id", + type=int, + default=-1, + help="MuJoCo EGL device index visible to this evaluator (-1: automatic).", + ) + parser.add_argument("--no-video", action="store_true") + args = parser.parse_args() + if args.open_loop_steps != EXECUTED_ACTION_HORIZON: + raise ValueError( + f"Zeva requires --open-loop-steps={EXECUTED_ACTION_HORIZON}; " + "all PIM comparisons must use the same controller horizon" + ) + if args.max_steps != MAX_CONTROLS_PER_ATTEMPT: + raise ValueError(f"Zeva requires --max-steps={MAX_CONTROLS_PER_ATTEMPT}") + if args.attempt_start < 0: + raise ValueError("--attempt-start must be non-negative") + if args.attempt_start and args.seed_mode != "fixed": + raise ValueError("--attempt-start is supported only for fixed-seed repeated attempts") + + os.environ.setdefault("MUJOCO_GL", "egl") + os.environ.setdefault("PYOPENGL_PLATFORM", "egl") + args.output_dir.mkdir(parents=True, exist_ok=True) + client = _LongInferenceWebsocketClientPolicy(args.host, args.port) + results = [] + task_cluster = args.task_cluster or args.task + base_session_id = args.pim_session_id or default_session_id(task_cluster, args.seed) + + episodes_path = args.output_dir / "episodes.jsonl" + if args.attempt_start: + if not episodes_path.is_file(): + raise ValueError("resume requires an existing episodes.jsonl") + for line in episodes_path.read_text().splitlines(): + if line.strip(): + record = json.loads(line) + validate_attempt_record(record) + results.append(record) + expected_ids = list(range(args.attempt_start)) + actual_ids = [int(item["attempt_id"]) for item in results] + if actual_ids != expected_ids: + raise ValueError(f"resume attempt history mismatch: expected={expected_ids}, actual={actual_ids}") + if any( + item["task"] != args.task + or int(item["environment_seed"]) != args.seed + or item["session_id"] != base_session_id + for item in results + ): + raise ValueError("resume history does not match task/seed/session") + restore_info = restore_session_from_artifacts( + client, + args.output_dir, + results, + session_id=base_session_id, + task_cluster=task_cluster, + environment_seed=args.seed, + ) + print("RESTORE " + json.dumps(restore_info), flush=True) + + # The first request after server startup may initialize/compile kernels. + # It is a separate, discarded session so this one-time effect cannot + # contaminate attempt 0 or enter its memory. + for warmup_index in range(REQUIRED_WARMUP_REQUESTS if args.attempt_start == 0 else 0): + warmup_env = gym.make( + f"robocasa/{args.task}", + split=args.split, + seed=args.seed, + camera_widths=256, + camera_heights=256, + enable_render=True, + render_gpu_device_id=args.render_gpu_device_id, + robots="PandaOmron", + randomize_cameras=False, + translucent_robot=False, + ) + warmup_reset = warmup_env.reset() + warmup_obs = warmup_reset[0] if isinstance(warmup_reset, tuple) else warmup_reset + warmup_policy_obs, _ = prepare_policy_observation(warmup_obs, TASK_PROMPTS[args.task]) + warmup_policy_obs["cte_boundary_images"] = np.expand_dims( + warmup_policy_obs["observation/image"].copy(), axis=0 + ) + warmup_policy_obs["cte_transition_actions"] = np.empty((0, 4, 7), dtype=np.float32) + warmup_policy_obs["cte_reset"] = True + warmup_policy_obs["pim_session_id"] = f"{base_session_id}:discarded-warmup" + warmup_policy_obs["pim_task_cluster"] = task_cluster + warmup_policy_obs["pim_environment_seed"] = args.seed + warmup_policy_obs["pim_attempt_id"] = 0 + warmup_policy_obs["pim_memory_reset"] = True + warmup_policy_obs["pim_replan_reset"] = False + warmup_policy_obs["pim_latent_index"] = 0 + warmup_policy_obs["pim_replan_index"] = 0 + warmup_policy_obs["pim_executed_action"] = np.empty((0, 7), dtype=np.float32) + warmup_policy_obs["pim_transition_complete"] = False + warmup_policy_obs["inference_seed"] = inference_seed(args.diffusion_seed + 1_000_000, 0, warmup_index) + warmup_output = client.infer(warmup_policy_obs) + warmup_action = np.asarray(warmup_output["action"], dtype=np.float32) + if warmup_action.shape != (PREDICTED_ACTION_HORIZON, 7): + raise ValueError(f"Warm-up returned invalid action shape {warmup_action.shape}") + warmup_env.close() + + for episode_idx in range(args.attempt_start, args.attempt_start + args.episodes): + episode_seed = args.seed if args.seed_mode == "fixed" else args.seed + episode_idx + attempt_id = episode_idx if args.seed_mode == "fixed" else 0 + pim_session_id = ( + base_session_id + if args.seed_mode == "fixed" + else default_session_id(task_cluster, episode_seed) + ) + env = gym.make( + f"robocasa/{args.task}", + split=args.split, + seed=episode_seed, + camera_widths=256, + camera_heights=256, + enable_render=True, + render_gpu_device_id=args.render_gpu_device_id, + robots="PandaOmron", + randomize_cameras=False, + translucent_robot=False, + ) + # Match the official RoboCasa365 RLDX harness: the seed is supplied to + # gym.make(), whose constructor performs an initial reset, and rollout + # then calls reset() without rewinding the environment RNG a second time. + reset = env.reset() + obs = reset[0] if isinstance(reset, tuple) else reset + frames: list[np.ndarray] = [] + action_queue: deque[np.ndarray] = deque() + # The CTE is defined at Wan's four-control cadence. Retain only + # observations at raw offsets 0,4,8,... and the *executed* arm7 + # controls between them. The policy server derives a first effect + # only after four such transitions (16 executed controls). + initial_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + cte_boundary_images: list[np.ndarray] = [initial_policy_obs["observation/image"].copy()] + cte_transitions: list[np.ndarray] = [] + pending_transition_actions: list[np.ndarray] = [] + actions_since_replan: list[np.ndarray] = [] + query_times = [] + query_steps: list[int] = [] + query_seeds: list[int] = [] + predicted_actions: list[np.ndarray] = [] + executed_actions: list[np.ndarray] = [] + phase_features: list[np.ndarray] = [] + visual_key_features: list[np.ndarray] = [] + effect_post_features: list[np.ndarray] = [] + effect_valid_values: list[bool] = [] + effect_history_valid_values: list[np.ndarray] = [] + predicate_progress_values: list[float] = [] + predicate_progress_components: list[dict] = [] + pim_queries = [] + observed_pim_conditioning: set[bool] = set() + clipped_values = 0 + nonfinite_actions = 0 + success = False + done = False + final_info: dict = {} + + steps = 0 + while steps < args.max_steps and not success and not done: + policy_obs, left_frame = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + policy_obs["cte_boundary_images"] = np.stack(cte_boundary_images, axis=0) + policy_obs["cte_transition_actions"] = ( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ) + policy_obs["cte_reset"] = steps == 0 + policy_obs["pim_session_id"] = pim_session_id + policy_obs["pim_task_cluster"] = task_cluster + policy_obs["pim_environment_seed"] = episode_seed + policy_obs["pim_attempt_id"] = attempt_id + policy_obs["pim_memory_reset"] = steps == 0 and ( + episode_idx == 0 or args.seed_mode == "increment" + ) + policy_obs["pim_replan_reset"] = ( + steps == 0 and episode_idx > 0 and args.seed_mode == "fixed" + ) + policy_obs["pim_latent_index"] = steps + policy_obs["pim_replan_index"] = len(query_times) + if not args.no_video: + frames.append(left_frame.copy()) + if not action_queue: + predicate_progress, predicate_components = task_predicate_progress(env, args.task) + predicate_progress_values.append(predicate_progress) + predicate_progress_components.append(predicate_components) + if actions_since_replan: + policy_obs["pim_executed_action"] = np.asarray(actions_since_replan, dtype=np.float32) + policy_obs["pim_transition_complete"] = len(actions_since_replan) == 16 + else: + policy_obs["pim_executed_action"] = np.empty((0, 7), dtype=np.float32) + policy_obs["pim_transition_complete"] = False + request_seed = inference_seed(args.diffusion_seed, attempt_id, len(query_times)) + policy_obs["inference_seed"] = request_seed + start = time.monotonic() + output = client.infer(policy_obs) + query_times.append(time.monotonic() - start) + query_steps.append(steps) + query_seeds.append(request_seed) + if isinstance(output.get("pim"), dict): + pim_queries.append({"backend": "pim", **dict(output["pim"])}) + elif isinstance(output.get("transition_memory"), dict): + pim_queries.append({"backend": "transition_memory", **dict(output["transition_memory"])}) + else: + pim_queries.append({}) + actions = np.asarray(output["action"], dtype=np.float32) + if actions.shape != (PREDICTED_ACTION_HORIZON, 7): + raise ValueError( + f"Policy returned action shape {actions.shape}, expected " + f"[{PREDICTED_ACTION_HORIZON},7]" + ) + server_contract = output.get("zeva_contract") + if not isinstance(server_contract, dict) or server_contract.get("version") != PROTOCOL_VERSION: + raise ValueError("Policy server did not acknowledge the Zeva protocol") + if int(server_contract.get("inference_seed", -1)) != request_seed: + raise ValueError("Policy server did not use the requested paired inference seed") + pim_conditioning = bool(server_contract.get("pim_conditioning", False)) + observed_pim_conditioning.add(pim_conditioning) + expected_conditioning = {"off": False, "on": True}.get(args.expect_pim_conditioning) + if expected_conditioning is not None and pim_conditioning != expected_conditioning: + raise ValueError( + "Policy server memory conditioning mismatch: " + f"expected={expected_conditioning}, actual={pim_conditioning}" + ) + nonfinite_actions += int((~np.isfinite(actions)).sum()) + clipped_values += int((np.abs(actions) > 1.0).sum()) + predicted_actions.append(actions.copy()) + features = output.get("cte_features") + if not isinstance(features, dict): + raise ValueError("PIM evaluation requires CTE features from the policy server") + phase_features.append(np.asarray(features["phase"], dtype=np.float32)) + visual_key_features.append(np.asarray(features["visual_key"], dtype=np.float32)) + effect_post_features.append(np.asarray(features["latest_effect_post"], dtype=np.float32)) + effect_valid_values.append(bool(features["latest_effect_valid"])) + effect_history_valid_values.append( + np.asarray(features["effect_history_valid"], dtype=np.bool_) + ) + action_queue.extend(actions[: args.open_loop_steps]) + actions_since_replan = [] + executed_action = action_queue.popleft() + obs, success, done, final_info = env_step(env, executed_action) + actions_since_replan.append(executed_action.astype(np.float32, copy=True)) + executed_actions.append(executed_action.astype(np.float32, copy=True)) + pending_transition_actions.append(executed_action.astype(np.float32, copy=True)) + if len(pending_transition_actions) == 4: + boundary_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + cte_boundary_images.append(boundary_policy_obs["observation/image"].copy()) + cte_transitions.append(np.stack(pending_transition_actions, axis=0)) + pending_transition_actions.clear() + steps += 1 + + terminal_outcome = "success" if success else "failure" + termination_reason = "success" if success else ("env_done" if done else "max_steps") + final_progress = 1.0 if success else 0.0 + terminal_predicate_progress, terminal_predicate_components = task_predicate_progress(env, args.task) + final_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + final_policy_obs["cte_boundary_images"] = np.stack(cte_boundary_images, axis=0) + final_policy_obs["cte_transition_actions"] = ( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ) + final_policy_obs.update( + { + "pim_finalize_attempt": True, + "pim_session_id": pim_session_id, + "pim_task_cluster": task_cluster, + "pim_environment_seed": episode_seed, + "pim_attempt_id": attempt_id, + "pim_latent_index": steps, + "pim_executed_action": np.asarray(actions_since_replan, dtype=np.float32), + "pim_transition_complete": len(actions_since_replan) == EXECUTED_ACTION_HORIZON, + "pim_terminal_outcome": terminal_outcome, + "pim_termination_reason": termination_reason, + "pim_total_steps": steps, + "pim_final_progress": final_progress, + } + ) + finalize_output = client.infer(final_policy_obs) + finalize_info = finalize_output.get("pim_finalize") + if not isinstance(finalize_info, dict): + raise ValueError("PIM server did not acknowledge attempt finalization") + if int(finalize_info.get("attempt_id", -1)) != attempt_id: + raise ValueError("PIM attempt finalization mismatch") + + chunk_records = [] + for replan_index, start_step in enumerate(query_steps): + end_step = query_steps[replan_index + 1] if replan_index + 1 < len(query_steps) else steps + executed_count = end_step - start_step + chunk_records.append( + { + "schema_version": CHUNK_RECORD_VERSION, + "replan_index": replan_index, + "start_step": start_step, + "end_step": end_step, + "executed_count": executed_count, + "completed_16": executed_count == EXECUTED_ACTION_HORIZON, + "inference_seed": query_seeds[replan_index], + "memory_entries_before_query": int( + pim_queries[replan_index].get( + "entries_total", pim_queries[replan_index].get("num_entries", 0) + ) + ), + "predicate_progress_before": predicate_progress_values[replan_index], + "predicate_progress_after": ( + predicate_progress_values[replan_index + 1] + if replan_index + 1 < len(predicate_progress_values) + else terminal_predicate_progress + ), + "terminal_chunk": replan_index == len(query_steps) - 1, + } + ) + chunk_records[-1]["predicate_progress_delta"] = ( + chunk_records[-1]["predicate_progress_after"] + - chunk_records[-1]["predicate_progress_before"] + ) + + artifact_path = args.output_dir / f"attempt_{attempt_id:03d}_seed_{episode_seed}.npz" + np.savez_compressed( + artifact_path, + cte_boundary_images=np.stack(cte_boundary_images, axis=0), + cte_transition_actions=( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ), + executed_actions=np.asarray(executed_actions, dtype=np.float32), + predicted_actions=np.asarray(predicted_actions, dtype=np.float32), + query_steps=np.asarray(query_steps, dtype=np.int32), + inference_seeds=np.asarray(query_seeds, dtype=np.uint32), + phase=_feature_array(phase_features, 128), + visual_key=_feature_array(visual_key_features, 128), + latest_effect_post=_feature_array(effect_post_features, 128), + latest_effect_valid=np.asarray(effect_valid_values, dtype=np.bool_), + effect_history_valid=np.asarray(effect_history_valid_values, dtype=np.bool_), + memory_entries_before_query=np.asarray( + [item["memory_entries_before_query"] for item in chunk_records], dtype=np.int32 + ), + predicate_progress_before=np.asarray(predicate_progress_values, dtype=np.float32), + predicate_progress_after=np.asarray( + [item["predicate_progress_after"] for item in chunk_records], dtype=np.float32 + ), + ) + env.close() + record = { + "schema_version": ATTEMPT_RECORD_VERSION, + "session_id": pim_session_id, + "task": args.task, + "episode": episode_idx, + "attempt_id": attempt_id, + "environment_seed": episode_seed, + "seed": episode_seed, + "success": success, + "terminal_outcome": terminal_outcome, + "termination_reason": termination_reason, + "total_steps": steps, + "steps": steps, + "final_progress": final_progress, + "progress_source": "success_only", + "predicate_progress_source": predicate_progress_components[0]["schema"], + "terminal_predicate_progress": terminal_predicate_progress, + "terminal_predicate_components": terminal_predicate_components, + "predicate_progress_components": predicate_progress_components, + "queries": len(query_times), + "mean_query_seconds": float(np.mean(query_times)) if query_times else None, + "pim_session_id": pim_session_id, + "seed_mode": args.seed_mode, + "diffusion_seed_base": args.diffusion_seed, + "protocol": contract_manifest(), + "server_pim_conditioning": sorted(observed_pim_conditioning), + "pim_queries": pim_queries, + "pim_finalize": finalize_info, + "chunk_records": chunk_records, + "artifact_npz": artifact_path.name, + "artifact_sha256": sha256_file(artifact_path), + "final_env_info_keys": sorted(final_info), + "action_values_clipped": clipped_values, + "action_nonfinite_values": nonfinite_actions, + } + validate_attempt_record(record) + results.append(record) + with episodes_path.open("a") as file: + file.write(json.dumps(record) + "\n") + if not args.no_video: + save_video( + frames, + args.output_dir / f"ep_{episode_idx:03d}_seed_{episode_seed}_{'success' if success else 'fail'}.mp4", + ) + print(json.dumps(record), flush=True) + + summary = { + "schema_version": ATTEMPT_RECORD_VERSION, + "task": args.task, + "episodes": len(results), + "successes": sum(item["success"] for item in results), + "success_rate": float(np.mean([item["success"] for item in results])), + "mean_steps": float(np.mean([item["steps"] for item in results])), + "seed_mode": args.seed_mode, + "environment_seeds": sorted({item["seed"] for item in results}), + "diffusion_seed_base": args.diffusion_seed, + "protocol": contract_manifest(), + "expected_pim_conditioning": args.expect_pim_conditioning, + "observed_pim_conditioning": sorted( + {value for item in results for value in item["server_pim_conditioning"]} + ), + "mean_query_seconds": float( + np.mean([item["mean_query_seconds"] for item in results if item["mean_query_seconds"] is not None]) + ), + } + write_manifest(args.output_dir / "attempts_manifest.json", results) + (args.output_dir / "summary.json").write_text(json.dumps(summary, indent=2) + "\n") + print("SUMMARY " + json.dumps(summary), flush=True) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/docs/bridge_cte_stage1.md b/releases/bridge-native-v3/code/docs/bridge_cte_stage1.md new file mode 100644 index 0000000000000000000000000000000000000000..859afafad17c2a7bb117f995a00042c807dbd6da --- /dev/null +++ b/releases/bridge-native-v3/code/docs/bridge_cte_stage1.md @@ -0,0 +1,175 @@ +# WidowX / Bridge Stage-1 CTE + +This is a new standalone Bridge training pipeline in the Zeva repository. It +does not start the former Stage-2 policy trainer, use its frozen feature cache, +or load any RoboCasa CTE, demonstration bank, retrieval head, or policy weights. + +## Scope and relation to the paper + +The paper's [Section III-C](https://arxiv.org/html/2608.30880#S3.SS3) +describes causal interaction extraction, task identity clustering, and phase +progression. Section III-E trains CTE first and freezes it for policy training. + +This implementation reuses the **public repository's GRU CTE and effect-v3 +loss**, adapting its data and semantic supervision to Bridge. It is not an +exact reproduction of every equation in the paper: + +- The code has three causal recurrent streams and same-boundary attention; + it does not explicitly implement the paper's instruction-conditioned + `F_init(g, s0)`. Instructions supervise the trajectory-level task projection. +- The paper specifies visual-change MSE. The public effect-v3 code optimizes + outcome InfoNCE with anti-collapse auxiliaries and reports MSE diagnostically. + We deliberately retain that published code objective, including its weak + action reconstruction and EMA next-visual prediction auxiliaries, rather + than silently rewriting the algorithm or claiming an exact paper replica. +- CTE weights are **randomly initialized**, including its visual stem and + phase/effect/task heads. The **generic pretrained Wan 2.2 VAE is frozen**; + "from scratch" here does not mean re-training a visual foundation model. +- No Cosmos action denoiser or Qwen model is loaded in this stage. + +## Data and feature contract + +Source: `/home/gpu4/tianyi/TTTVLA/datasets/bridge_orig_1.0.0_lerobot`. +There are 53,192 episodes and 1,893,026 raw timesteps. Seed 42 allocates 52,128 +episodes to training and 1,064 to a held-out, episode-disjoint validation set. +`split.json` records every ID. This is not a task-disjoint generalization split. + +Each sample starts at its episode's first frame and includes every complete +four-control transition. Trajectories are not cropped to 32 controls or sampled +only from the latter half. Images at raw boundaries `0, 4, 8, ...` are encoded +**independently**, at native 256x256, with frozen Wan VAE, yielding 48x16x16 +latents. An effect spans four transitions / 16 raw controls. At Bridge's 5 Hz, +these are 0.8-second transitions and 3.2-second effect windows. + +The 7-D action contract is inherited from the audited WidowX adapter: XYZ/RPY +quantile-normalized and clipped to [-1,1], gripper open=+1 / closed=-1. A state +at boundary `b` sees only actions that finished before `b`. A final action +without its next observation, and an incomplete tail shorter than four +controls, cannot provide a complete transition target; they are not invented +by repeating the last image. Short episodes remain present but unavailable +losses are masked. Padded observations/actions contribute no supervision. + +Task labels use conservative exact equality after lowercase/whitespace/trailing +period normalization. Empty or ambiguous instructions are excluded from the +**entire task contrastive objective**, including its negative pool, but not +from action, visual, phase, or effect training. This does not synthesize missing +language annotations. Duplicate copies of the same episode cannot count as +task positives or negatives. The task contrastive loss gathers differentiable +embeddings across all ranks; other release objectives are averaged over ranks. + +The exhaustive paired sampler visits every training episode as an anchor once +per anchor epoch, then adds a different episode with the same known task where +available. Singleton/unknown anchors receive a random extra episode without +being falsely labeled positive. Final batches wrap a small number of anchors, +recorded by the deterministic sampler. A batch contains 32 anchors + 32 +partners, so **one anchor epoch = 1,629 optimizer steps** at eight GPUs. Partner +sampling changes the draw distribution; `anchor_epoch` is dataset coverage, +not `global_step * 64 / 52128` and not a claim of uniform episode weighting. + +No full latent cache is written: on-the-fly VAE encoding avoids exceeding the +machine's small remaining disk space. Dataset metadata, VAE SHA256, source-code +hashes, feature resolution, action format, sampler, world size and optimizer +configuration are saved in `manifest.json` and checkpoint contracts. + +## Default training configuration + +- GPUs 0–7, DDP; eight episodes per GPU, global batch 64, no accumulation. +- 8,835,600 trainable CTE parameters; FP32 parameters and AdamW states, + BF16 autocast forward, FP32 losses, gradient norm clip 1.0. +- AdamW: learning rate 1e-4, betas (0.9,0.95), weight decay 0.01; + 500-step linear warmup followed by constant LR. +- Public model dimensions: hidden 256, task/phase/effect 128, four GRU blocks, + eight attention heads, four controls per transition, four transitions/effect. +- EMA visual target decay 0.996, updated after every optimizer step. +- Public objective: action + vision + 0.2 task + 0.1 phase + 0.25 effect. + Effect = InfoNCE + 0.05 action-summary + 0.1 pre/post alignment + variance + + 0.04 covariance; InfoNCE temperature 0.07, task temperature 0.1. +- Validate before training and every 2,000 steps on all held-out anchors + (plus deterministic held-out partners). This is a representation diagnostic, + not a SimplerEnv policy success evaluation. Validation has no optimizer/EMA + updates and cannot insert held-out trajectories into training. +- Save every 10,000 steps; preserve **all** checkpoints. Initial step-0 weights + are also saved. SIGTERM/SIGINT to a training rank request a checkpoint after + the current update. Unexpected hardware/process death can lose unsaved work. +- Max steps defaults to 2,147,483,647; no automatic early stopping is enabled. + This is continued training until explicitly stopped, not a promise of + convergence. It will fail safely on invalid data, nonfinite gradients, or + insufficient disk space rather than deleting old files or skipping errors. +- Per-process PyTorch allocator limit: 12.5% of GPU memory (~10 GiB on 80 GiB + cards). CUDA/NCCL overhead is additional. VAE encoding microbatch is four. + A startup free-memory check reserves another 2 GiB of headroom. This limit + is not GPU scheduling/isolation: co-resident servers may contend for compute + if they become active. Their processes are neither killed nor reconfigured. + +## Launch, inspect, stop and resume + +From the repository root: + +```bash +bash scripts/run_bridge_cte_stage1.sh +``` + +The default output is `.artifacts/bridge_cte_stage1_20260924`. A fresh run +refuses to overwrite an existing manifest. Set `CTE_RUN_DIR` for a new run. +No auto-resume from old Stage-2/RoboCasa checkpoints is possible. + +```bash +tail -f .artifacts/bridge_cte_stage1_20260924/launcher.log +tail -n 1 .artifacts/bridge_cte_stage1_20260924/metrics.jsonl +``` + +`status.json` is an atomic last-status snapshot. `metrics.jsonl` records the +total and component losses, gradient norm, LR, observed effect-code standard +deviation, task-positive counts, real transition/effect counts, throughput and +memory. Counts for the task objective describe the global batch; transition +and effect counts are per-rank means. Total loss is not comparable to the old +Stage-2 flow-matching loss. Absolute MSE need not fall because it is diagnostic +only; compare contrastive/anti-collapse metrics and held-out trends as well. + +For graceful shutdown, locate **this run's rank 0** from `RANK_READY rank=0` +in the log and send `kill -TERM `. Do not use broad `pkill`, kill +the tmux server, or stop unrelated GPU residents. Sending a signal to a rank +lets the remaining ranks coordinate checkpointing; killing the torchrun +supervisor may terminate child ranks before a graceful save completes. + +Read the exact path in `latest_checkpoint.json`, then explicitly resume: + +```bash +bash scripts/run_bridge_cte_stage1.sh \ + --resume /absolute/path/to/cte_step_000010000.pt +``` + +Resume restores model (including EMA), optimizer, all-rank RNG states, epoch, +and **consumed batch cursor**, not the loader-prefetch cursor. Dataset, source +code, VAE, batch/world size and optimizer contracts must match. Switching GPU +count or objectives is not silently treated as an exact continuation. + +W&B uses project `Zeva` by default and honors the launching shell's W&B entity, +credentials and project overrides. The launcher defaults to **offline** because +this shared host's default login differed from the preceding user's run. +After verifying the intended account, explicitly set `WANDB_MODE=online` to +enable syncing. Online init failure falls back to offline in the same output +directory; the actual mode and run ID are in `wandb_status.json`. Secrets are +not stored in source code or the manifest. Local JSONL metrics are written +independently of W&B. Do not sync an offline run with another user's login. + +## Tests and downstream restrictions + +```bash +PYTHONPATH=.:/home/gpu4/tianyi/cosmos-framework \ + /home/gpu4/tianyi/cosmos-framework/.venv/bin/python \ + -m unittest scripts.test_bridge_cte_stage1 -v +``` + +Tests cover strict-past causality, padding, short episodes, real gradients/EMA, +unknown language, duplicate-episode exclusion, and exhaustive/resumable +sampling. GPU smoke tests additionally exercise VAE encoding, multi-rank +backward, checkpoint writes, full held-out validation and resume. + +The new checkpoint exposes the release-compatible `model_config`/`model` +keys, but is **not a drop-in replacement in the old pipeline**: the old server +and cache builder encode CTE frames at 480x832 and hardcode RoboCasa weights. +Before Stage 2, they must consume this new 256x256 feature contract and a new +Bridge demonstration bank/retriever, and rebuild all phase/effect caches. +Nothing in this launcher silently reuses or re-certifies the old cache. This +stage does not train a retrieval head, export the bank, or start policy training. diff --git a/releases/bridge-native-v3/code/docs/bridge_handoff_message_zh.md b/releases/bridge-native-v3/code/docs/bridge_handoff_message_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..f168da0ccfc231821757d58f0446867b84e2e400 --- /dev/null +++ b/releases/bridge-native-v3/code/docs/bridge_handoff_message_zh.md @@ -0,0 +1,94 @@ +# 给师兄的 Bridge/WidowX 交接说明 + +## 可以直接转发的说明 + +师兄,可以帮我接手 Bridge/WidowX 的 ZeVA Stage2 实验吗?数据集是 +`IPEC-COMMUNITY/bridge_orig_lerobot`;policy 基座固定为 NVIDIA 原始 +`nvidia/Cosmos3-Nano@e59a53c25979a090fa8706c9acc0c254a6e89b92`,不是 DROID specialist。 + +代码快照、已选定的 Bridge 30k CTE、3000 条 support static bank、两套独立的 +normalizer 和来源校验清单都在这个固定版本里: + +https://huggingface.co/spaces/DanTim05/DynaTTT/tree/b15b2c3fdf95a0ac4ba1d42f9bfab820d305a21c/releases/bridge-native-v2 + +**目前这是代码和记忆资产交接包,不是已经跑通的 native Stage2 训练器。** +21 项 CPU 测试通过;新 retrieval head、native Stage2 集成和 50/500 步训练 gate +尚未完成。请不要运行仓库根目录的旧 `run_bridge_stage2_pilot.py`、 +`run_ipec_full_training.sh` 或 `run_widowx_training.sh` 代替本实验。 + +## 先下载与校验(不启动训练) + +下面在一个新的工作目录执行;需要 Python 和 Git。 + +```bash +mkdir bridge-handoff +cd bridge-handoff +python3 -m venv download-env +source download-env/bin/activate +python -m pip install 'huggingface_hub==0.36.2' + +hf download DanTim05/DynaTTT --repo-type space \ + --revision b15b2c3fdf95a0ac4ba1d42f9bfab820d305a21c \ + --include 'releases/bridge-native-v2/*' \ + --local-dir ./zeva-transfer + +export BRIDGE_RELEASE_DIR="$PWD/zeva-transfer/releases/bridge-native-v2" +python "$BRIDGE_RELEASE_DIR/code/scripts/bridge_handoff.py" verify \ + --bundle "$BRIDGE_RELEASE_DIR" +``` + +预期 `memory_integrity=PASS`,同时 `training_ready=false`。 +`--require-training-ready` 会明确报错,避免把资产完整误认为训练验收完成。 +不要使用不完整的 `bridge-native-v1` 草稿。 + +## 环境与代码 + +ZeVA 是 NVIDIA Cosmos Framework 的代码 overlay,不能只下载 ZeVA 后直接 pip 安装。 +继续在上述工作目录执行: + +```bash +git clone https://github.com/NVIDIA/cosmos-framework.git cosmos-framework +git -C cosmos-framework checkout --detach ee58e41467f33c49ddde08b4d0ef4923876a95ac +rsync -a --exclude=README.md "$BRIDGE_RELEASE_DIR/code/" ./cosmos-framework/ +cd cosmos-framework + +# 先按该版本 docs/setup.md 安装 uv、CUDA/编译环境。 +uv sync --all-extras --group=cu128-train +source .venv/bin/activate + +python -m unittest -v scripts.test_bridge_handoff \ + scripts.test_bridge_native_contract scripts.test_bridge_static_bank +python -m scripts.bridge_handoff verify --bundle "$BRIDGE_RELEASE_DIR" --deep +``` + +实际验证过的是“干净的 pinned framework + overlay + 现有 Python 环境”; +没有声称在一台全新机器上完整重装 CUDA/依赖已通过。 +如使用 NGC 容器,按 upstream `docs/setup.md` 排查 `LD_LIBRARY_PATH` 的 PyTorch 导入问题。 + +## 下载固定版本的原始基座、数据、VAE + +以下命令会下载大文件。把路径改成有足够空间的数据盘,使用师兄自己的 HF 凭据; +包里不含任何账号密钥。 + +```bash +python -m scripts.bridge_handoff download \ + --bundle "$BRIDGE_RELEASE_DIR" \ + --destination /large/disk/bridge-run --base --dataset --vae +``` + +必须下载 Cosmos3-Nano 的完整 snapshot,不能只取 `/transformer` 子目录。 +具体 base/data/VAE revision 和 SHA256 均在 `handoff_manifest.json`。 +该命令不启动训练,不会使用旧 policy/optimizer。 + +## 训练必须继续遵守的边界 + +- Policy native10 / proprio10 / CTE reached7 完全分开;policy gripper=9,CTE gripper=6。 +- Horizon=32;内部 padded width 必须实际验证为64;native10 标签不能来自 reached7 转换。 +- 原始 domain7 action 权重保留;Qwen/shared understanding、VAE、CTE 冻结。 +- Cosmos generation/action pathway 与 ZeVA/proprio 注入模块需要训练,不是仅训最后动作头。 +- 新 Bridge query head 尚需训练;不能复用 RoboCasa retrieval,不能用 query 的未来生成当前 context。 +- 必须补完 runtime trace、50-step 和 500-step gate 后,才可提供正式 continuous 训练命令。 +- 训练验收通过后的设计是每 10k optimizer updates 保存,不自动删 checkpoint。 + +因此目前没有一条已验证的正式训练启动命令。完整待办和设计参数见下载包的 +`README.md` 与 `code/configs/bridge_stage2_native_contract.json`;后者是设计合同,不是可执行训练配置。 diff --git a/releases/bridge-native-v3/code/docs/bridge_memory_plan.md b/releases/bridge-native-v3/code/docs/bridge_memory_plan.md new file mode 100644 index 0000000000000000000000000000000000000000..645484905a003cf8da6c6e86cfc052e5a5a2dd8f --- /dev/null +++ b/releases/bridge-native-v3/code/docs/bridge_memory_plan.md @@ -0,0 +1,132 @@ +# Bridge 外部记忆库:现状、消融与适配方案 + +检查日期:2026-09-24。本文是代码/权重审计与实施方案,**尚未启动 Bridge +CTE 或检索头训练,也没有替换正在准备的全量训练缓存**。 + +## 当前记忆如何影响训练 + +当前使用 `/home/gpu4/tianyi/zeva-release/weights/stage1/` 中的 +`zeva_cte.pt` 和 `train_memory_effect_v3.pt`,以及 `stage3/best.pt`。 + +记忆库、CTE、检索头本身被冻结。`prepare_widowx_features.py` 从初始图像和 +指令检索得到 `behavior_global`,缓存后作为 Stage-2 输入。 +它经过 `behavior_global_projector` 和 `behavior_pbd` 影响动作预测及梯度, +因此“冻结记忆库”**不等于它不影响权重更新**。监督动作仍来自 Bridge 样本, +不是 RoboCasa 的动作标签。可训练参数名单见 `scripts/widowx_config.py:25`。 + +关键实现(路径相对 `/home/gpu4/tianyi/cosmos-framework`): + +- `cosmos_framework/model/generator/omni_mot_model.py:698`:接入缓存行为特征。 +- `cosmos_framework/model/generator/mot/cosmos3_vfm_network.py:718`:全局记忆前缀投影。 +- `cosmos_framework/model/generator/mot/cosmos3_vfm_network.py:1015`:记忆参与动作先验。 +- `cosmos_framework/model/generator/omni_mot_model.py:1734`:动作先验监督损失。 + +这是**跨域、不匹配的 RoboCasa 记忆**,但仅凭这一点不能断言它是成功率低的 +唯一原因。当前静态检索库也不要与 Zeva 的在线 PIM 混为一谈;本地 WidowX +配置继承的 Atomic5 配方未启用 PIM/online-memory。 + +## 实际权重内容 + +`train_memory_effect_v3.pt` 有 2,495 条记录,均来自 RoboCasa: +TurnOnMicrowave 527、TurnOnElectricKettle 504、CloseToasterOvenDoor 490、 +CoffeeSetupMug 487、OpenStandMixerHead 487。没有 Bridge 条目。 + +每条包含 `episode_id`、`source_index`、`instruction`、`length`, +以及归一化的 128 维 `retrieval_key` 和 256 维 `behavior_value`。 +库格式为 `cosmos_behavior_memory_effect_v3`。 +现有检索头输入 4,096 维,隐藏层 1,024 维,输出归一化的 128 维查询; +余弦检索后对 top-5 的 256 维 value 加权。 + +检索头 checkpoint 的 Recall@1=1.0 是其 RoboCasa 五类验证集指标, +不是 Bridge 的指标,也不能证明在 Bridge 中可用。 + +## 本次消融 + +`scripts/widowx_policy_server.py` 增加 `--memory-mode bank_off`: +不加载外部库和检索头,令全局输入为零;保留真实当前轨迹的 CTE phase/effect +历史及全部已训练策略权重。投影层和 PBD 的已学偏置仍保留, +因此这是“去除外部记忆内容”,不是“关闭全部 Zeva 模块”。 + +固定旧训练最后保存的 `step_000290000.pt`,每组种子 0–19、150 个环境步、 +30 步去噪、guidance=3。按每次执行 4/16 个动作,各做外部库 off/on 对照。 +模型仍预测 32 个动作;执行 16 个动作后再规划,在 5 Hz 下对应 3.2 秒。 +所有实际执行动作都会进入历史,CTE 的四步边界不随执行长度改变。 + +此消融仅发生在评测时:不能消除已有权重对旧记忆的依赖,也不等同于 +“从头关闭记忆训练”。关闭更好可提示旧条件有害,关闭更差也可能是输入 +分布改变;小样本成功率均需结合视频、抓取/移动指标和更多种子判断。 + +运行入口和输出说明见 `scripts/WIDOWX.md` 的 External-bank ablation 一节。 + +## Bridge 构建方案(以下步骤需要新增/补齐实现) + +本地已找到 CTE 模型/损失、检索头模型/对比损失、库加载与推理代码, +**未找到可以直接运行的 Bridge Stage-1 训练器、记忆库导出器或 Stage-3 +训练器**。不要把下面的步骤理解为已有完整官方命令。 + +1. **整理任务标签和划分数据。** 本地 IPEC 导出有 53,192 个 episode; + 按 `meta/episodes.jsonl` 的任务文本统计,38,660 个有非空文本, + 14,532 个无非空文本(27.32%,分母是 episode,不是采样窗口)。 + 共有 19,973 个非空任务字符串,其中 18,380 个只对应一个 episode。 + 先做可审计的同义任务归并,保留物体、方向、目标容器等差别; + “放胡萝卜到盘里”与“从盘里拿走”不能合并。空文本不能全部视为同一种任务。 + 先按 episode/原始采集 session 划分 train/val,验证和仿真评测数据不入库。 + 建议先选约 5–10 个有足够重复样本的任务试跑,再扩展全量。 + +2. **固定 Bridge 输入契约。** 使用真实前视 `image_0`、5 Hz、现有 + XYZ/RPY 六维归一化与夹爪正开负闭约定、每四个控制步一个 CTE 边界。 + CTE 输入包括潜变量图像 `[B,T,48,H,W]`、动作 `[B,T-1,4,7]`、 + 帧/动作有效掩码,动作只包含已经执行的历史。 + 要记录分辨率、RGB 约定、VAE 和所有权重指纹,并保持训练/服务一致。 + 当前外部检索 readout 仍沿用 RoboCasa 的 20 FPS/拼接视图提示模板 + (上游 server 的 `format_action_prompt`/`extract_batch`),真正适配时应与 + Bridge 单视图、5 Hz 一并修正并重新训练检索头,不能单独修改线上提示。 + +3. **训练或适配 Bridge CTE。** 可从发布 CTE 初始化,保留模型定义和 + `cte_losses.py` 中的视觉/动作预测、语义聚类、阶段和 effect 目标。 + 每次优化后调用 `update_ema_target()`。不足 16 个控制步的轨迹没有完整 + effect 窗口,应按掩码跳过对应目标,而不是删除整条轨迹。 + 语义损失需要多个任务、每类多个样本;未知标签应显式屏蔽语义目标, + 仍可用于其他有监督/自监督目标。不要直接照搬发布模型的 500 步停止点。 + 同样的 16 控制步在 Bridge 是 3.2 秒,在 RoboCasa 20 Hz 下只有 0.8 秒, + 因而时间尺度也需要适配。 + +4. **从训练轨迹导出 Bridge key/value。** CTE 有 128 维 `retrieval` + 和 256 维 `causal_interaction_state`。一种维度兼容的初始方案是分别对 + 有效时刻池化并 L2 归一化,保存 key/value 和任务/episode ID; + **这只是建议实现,不是已核实的官方导出池化公式**,需要检索验证。 + 训练演示的完整轨迹可以用于离线建库,部署查询只能使用当时已知信息。 + 特征生成时建议排除同一 episode 的自检索,并记录 CTE SHA256、 + 输入契约、split 和数据版本,防止验证泄漏和自匹配捷径。 + +5. **适配 Stage-3 检索头。** 冻结策略 readout,从初始图像与指令提取 + 4,096 维特征,训练 4,096→1,024→128 的 head 查询新 key 空间。 + 利用 `bidirectional_supervised_contrastive_loss` 的同任务多正样本目标; + batch 中必须有多个任务,否则单一任务的对比学习缺少负类。 + 之前 159 条单任务集可以做行为过拟合测试,但不适合独立证明多任务检索有效。 + 用未入库的验证轨迹报告 Recall@1/5、top-k 任务纯度、任务宏平均结果。 + readout checkpoint、提示模板和 CTE/bank/head 必须成套固定。 + +6. **重新生成 Stage-2 条件并训练/评测。** 给 prepare、server、cache contract + 三处增加统一的 CTE/bank/head 路径配置,生成新的缓存目录并严格校验。 + 当前缓存只有旧库检索后的 global 和 phase/effect,并不含重建新库所需的 + 完整 CTE key/value 或原始 VAE 潜变量,不能改名后充作 Bridge 库。 + 新向量空间需要重新适配 Stage-2;不要悄悄给旧 290k checkpoint 换库后 + 就认定它已经完成 Bridge 记忆训练。独立比较 bank-off、RoboCasa bank、 + Bridge bank,固定动作执行长度和去噪步数。 + +## 成本与建议顺序 + +首先完成当前 off/on × 4/16 步评测,再决定是否投入完整的 Stage-1/3 适配。 +一个更快的诊断版是先用冻结发布 CTE 编码 Bridge 建库、仅适配检索头; +它仍含跨域 CTE 限制,应明确标为 provisional,不能当作完整适配结论。 + +检查时工作盘仅约 19 GiB 空闲。按当前每帧 `48×30×52`、492,160 个边界 +帧估算,仅全量 FP16 VAE 缓存就约 **68.6 GiB**,尚未算训练中间量; +53,192 条 FP32 key/value 原始向量本身仅约 **78 MiB**。 +因此应先做多任务子集/流式编码,或准备新磁盘;不能因为库文件小就直接 +启动全量潜变量缓存,也不要自动删除现有 checkpoint 腾空间。 + +官方背景资料:[Zeva 项目](https://air-embodied-brain.github.io/Zeva/)、 +[发布仓库](https://github.com/dsdfasfaac/zeva-test)。具体本地差异以以上代码、 +已安装版本和实际 checkpoint 内容为准。 diff --git a/releases/bridge-native-v3/code/docs/bridge_native_handoff.md b/releases/bridge-native-v3/code/docs/bridge_native_handoff.md new file mode 100644 index 0000000000000000000000000000000000000000..c971a78ab9bb78ad7a185522100b29566befbd48 --- /dev/null +++ b/releases/bridge-native-v3/code/docs/bridge_native_handoff.md @@ -0,0 +1,160 @@ +# Bridge/WidowX handoff — memory assets verified + +**v3 implementation update:** `scripts/run_bridge_stage2_native.py` now exists. +See [native training instructions](bridge_native_training.md). Its GPU training and +50/500-step acceptance remain NOT_RUN. The previously published v2 code snapshot +predates this implementation. Use v3 for the current code; the GPU readiness flag stays false. + +The v3 bundle contains the native trainer source and the verified v2 memory assets. +Use `releases/bridge-native-v3`. The earlier v1 upload was incomplete because +the Space's existing `.gitignore` silently omitted `.pt` files. It is retained +for provenance, not as a usable release. The publisher checks every remote +Git/LFS hash and preserves all pre-existing Space files and ignore rules. +Do not run `run_bridge_stage2_pilot.py`, `run_ipec_full_training.sh`, or +`run_widowx_training.sh` for this experiment: those historical paths use the old +policy contracts and/or old RoboCasa/IPEC initialization. + +## What is delivered + +- `memory/cte_30000_inference.pt`: the exact 177 model tensors of the selected + Bridge reached-state-delta CTE at step 30,000. No optimizer/RNG is exported. +- `memory/static_bank_3000/`: unchanged bank and its original manifest, selection, + support/query partition, and the shards needed to verify the original manifest. + Keys are `[3000,128]`, values `[3000,256]`, one entry per support episode. +- `memory/stage1_split.json`, `pilot_split.json`, and the separate CTE legacy and + policy native10 normalizers. +- `code/`: the actual ZeVA overlay source snapshot, including local/uncommitted + scripts, the native geometry contract helpers, tests, and handoff tools. +- `handoff_manifest.json`: per-file SHA256/size, exact upstream versions, data/VAE + provenance, CTE export-to-original tensor binding, and explicit readiness. + +The local original 30k CTE checkpoint is unchanged. Its SHA256 is +`5c94378ea87b875dd709d46cf7941cdb5ca33584df071fef254311c6bbab912e`. +It contained a Stage1 optimizer, so the downloadable inference export necessarily +has a **different file hash**. All model tensors were checked exactly equal; +the export manifest records both identities. The bank's original source-checkpoint +identity is preserved, not silently rewritten to the export hash. + +The original bank SHA256 remains +`bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb`. +Absolute paths in original provenance JSON are historical records only, not +runtime paths. Use bundle-relative paths and local CLI arguments. + +## Download and verify on another machine + +First obtain the release commit from the handoff message or publication receipt. +Replace `RELEASE_COMMIT` below with that full commit. Never substitute a moving +`main` when reproducing an experiment. + +```bash +hf download DanTim05/DynaTTT --repo-type space \ + --revision RELEASE_COMMIT --include 'releases/bridge-native-v3/*' \ + --local-dir ./zeva-transfer + +cd zeva-transfer/releases/bridge-native-v3 +python code/scripts/bridge_handoff.py verify --bundle . +``` + +That first check uses only the Python standard library. A successful memory check +does **not** imply training readiness: `training_ready` remains false. + +Install the pinned NVIDIA Cosmos Framework following its setup guide. ZeVA is an +overlay, not a stand-alone pip package. In a new dedicated workspace: + +```bash +git clone https://github.com/NVIDIA/cosmos-framework.git cosmos-framework +git -C cosmos-framework checkout --detach ee58e41467f33c49ddde08b4d0ef4923876a95ac + +# Run from the downloaded release directory; use an absolute path to the clone. +export BRIDGE_FRAMEWORK_DIR=/absolute/path/to/cosmos-framework +rsync -a --exclude=README.md ./code/ "$BRIDGE_FRAMEWORK_DIR/" +cd "$BRIDGE_FRAMEWORK_DIR" + +# Requires the CUDA/PyTorch prerequisites documented by this pinned framework. +uv sync --all-extras --group=cu128-train +source .venv/bin/activate +``` + +Run in the resulting environment, specifying the release directory: + +```bash +python -m unittest -v scripts.test_bridge_handoff scripts.test_bridge_native_contract +python -m scripts.bridge_handoff verify \ + --bundle /absolute/path/to/zeva-transfer/releases/bridge-native-v3 --deep +``` + +The export uses safe tensor/basic-type deserialization (`weights_only=True`). +It loads strictly into CTE and is frozen. Nothing here loads a policy checkpoint, +starts a training job, allocates GPUs, or stops another process. + +## Download pinned external dependencies + +```bash +python -m scripts.bridge_handoff download \ + --bundle /absolute/path/to/zeva-transfer/releases/bridge-native-v3 \ + --destination /large/disk/bridge-run --base --dataset --vae +``` + +The downloader uses: + +- `nvidia/Cosmos3-Nano@e59a53c25979a090fa8706c9acc0c254a6e89b92`, including + root configuration, transformer, vision encoder and tokenizer. A URL ending + in `/transformer` alone is not a complete training installation. +- `IPEC-COMMUNITY/bridge_orig_lerobot@0e9d76d07e9df3ea3eba257b2520d4913833fad2`. + Its metadata must match the CTE source hashes; no task strings are invented. +- The exact pinned Wan VAE revision recorded in the manifest. Expected SHA256: + `20eb789667fa5e60e7516bf509512f6cb61f01b0aa0695eadaea930c13892b36`. + +Use each machine's own HF/W&B credentials; no credentials are included here. +Before a full run, verify all expected per-episode parquet/image_0 video files, +not merely the presence of `meta/info.json`. + +## Fixed research design / release validation + +`code/configs/bridge_stage2_native_contract.json` describes the research contract. +The native launcher implements it; use the v3 source and +[training instructions](bridge_native_training.md), alongside the included memory assets. +`verify --require-training-ready` still exits nonzero for this release +because its GPU acceptance has not passed. + +The native path must preserve: + +- Native policy `[B,32,10]` (XYZ + rot6d + gripper index 9), current absolute + proprio `[B,10]`, independent reached CTE7 (RPY, gripper index 6), runtime-verified + internal width 64 with padded channels masked. Labels come from adjacent raw + states through NVIDIA's transforms, not reached7 converted to 10D. +- Original Nano domain-7 action projections and shared action embedding. Compare + checkpoint/constructed/pre-optimizer hashes. No DROID specialist, RoboCasa, + old IPEC delta, old 7D policy, or old policy optimizer. +- Frozen shared understanding/reasoner, Wan VAE and CTE; train generation + `moe_gen/time_embedder/vae2llm/llm2vae`, domain7 action rows, and new ZeVA/proprio + modules. Never put the entire policy forward in no_grad. Use a real WAM vision + loss so llm2vae receives nonzero gradients. Other-domain rows must not change. +- A **new** trained/frozen Bridge query head (not supplied yet), pure frozen + understanding image+instruction readout 4096→1024→128, cosine top5/T=0.07. + Do not reuse a RoboCasa head or treat random queries as trained retrieval. +- Support/query separation; phase/effects from query prefixes only; one + transition per four actual controls, first completed effect at 16 controls, + last four effects only. No all-episode future context and no full-dataset cache. +- Native10 decoding must invert the tool/flange/OpenCV transforms and account + for the Simpler controller's previous target. Recompute reached7 from actual + before/after states only after env.step. +- Real runtime shape trace; 32 train/8 development 50-step engineering gate, + then 500-step fit gate, then continuous. The 8 development episodes are held + out from Stage2, not independent of CTE training. Log sampled actions, masks, + per-dimension/physical/gripper errors, BIT histogram, gradients and deltas. +- Generation/action/ZeVA LR 2e-5/1e-4/3e-5; domain tables weight_decay=0; + every 50 steps verify other-domain diff=0 and frozen hashes unchanged. +- Save resumable trainable replacements, optimizer/scheduler/RNG/data cursor + every 10k optimizer updates; never delete old checkpoints. Estimate ~91 GiB + per checkpoint with FP32-master Adam; plan disk capacity accordingly. + +50/500-step gates, full model runtime dimensions, online environment acceptance, +and continuous training are **NOT RUN**. CPU geometry/asset tests are not substitutes. + +## Licenses and provenance + +The source snapshot includes the original LICENSE/NOTICE/ATTRIBUTIONS. The +dataset, NVIDIA base and Wan VAE retain their respective upstream licenses. +The 3000-entry bank is derived from IPEC Bridge; it is not a copy of the raw videos. +No base model, raw dataset, policy optimizer, secret, or training log is redistributed. diff --git a/releases/bridge-native-v3/code/docs/bridge_native_training.md b/releases/bridge-native-v3/code/docs/bridge_native_training.md new file mode 100644 index 0000000000000000000000000000000000000000..8caefcf9138d1d91011d6279959e898b8fdfa9b7 --- /dev/null +++ b/releases/bridge-native-v3/code/docs/bridge_native_training.md @@ -0,0 +1,99 @@ +# Bridge Native Stage2:新版训练入口 + +入口:`python -m scripts.run_bridge_stage2_native`。 +新版代码位于 `releases/bridge-native-v3/code`,**尚未执行完整 GPU 训练、50/500-step gate 或真实 SimplerEnv 验收**。 +该版本包含训练入口、运行说明,以及与 v2 完全相同的 CTE30k 和 3000-entry static bank。 + +## 启动 + +在已安装固定版本 Cosmos Framework 的训练环境中运行当前 Zeva 代码。 +环境安装和原始 Nano/IPEC/Wan VAE 下载见 [交接文档](bridge_native_handoff.md)。 +`--assets` 使用 `bridge_handoff download --destination` 对应的目录。 +CTE 和 bank 使用 v3 bundle 中的已验证资产;已有 v2 资产也可通过 `--bundle` 显式指定。 + +```bash +cd /实际路径/Zeva +export PYTHONPATH="$PWD:/实际路径/cosmos-framework${PYTHONPATH:+:$PYTHONPATH}" + +CUDA_VISIBLE_DEVICES=0,1 python -m scripts.run_bridge_stage2_native \ + --bundle /实际路径/releases/bridge-native-v3 \ + --assets /大容量磁盘/bridge-assets \ + --run-dir /大容量磁盘/bridge-native-run \ + --continuous +``` + +默认已固定 Nano revision、domain 7、policy10/CTE7/proprio10、horizon32、seed20260926; +不需要重复填写。默认两卡、每卡 microbatch1、累积8、最多100000步,global batch16。 +可用 `--base-path`、`--dataset`、`--vae` 分别指定已有文件。 +`--max-steps 50` 只执行首个 gate,`--max-steps 500` 执行两个 gate;不加 `--continuous` 最多运行到500。 + +程序会先检查数据和资源,验证原始基座,执行控制器验收,训练并冻结新的检索 head, +完成固定探针,再开始50步训练。通过50和500两个 gate 后自动转入全量 query 训练。 +这些启动检查和检索训练会耗时;检索对齐失败不会使用随机 head 继续训练。 + +需要至少两张没有其他计算进程的80GB GPU,以及输出磁盘320GiB可用持久空间。 +每个完整续训检查点约91GiB,全部保留;长期运行还需要为后续每10k检查点增加空间。 +程序不结束其他任务、不删除旧检查点;空间不足或 gate 失败会明确停止。 + +### SimplerEnv 在独立环境中时 + +训练环境没有 SimplerEnv 时,在装有 SimplerEnv、ManiSkill2_real2sim 及本项目几何依赖的环境先运行: + +```bash +CUDA_VISIBLE_DEVICES=0 python -m scripts.native_stage2.online \ + --output /大容量磁盘/bridge-controller-acceptance.json +``` + +随后训练命令加 `--controller-report /大容量磁盘/bridge-controller-acceptance.json`。 +有 SimplerEnv 的训练环境会自动执行验收。验收涵盖小幅平移、旋转、开合、controller target、 +独立 before/after reached7 和四控制分组;它不代表策略任务成功率。 + +### 检查与恢复 + +在训练命令末尾添加 `--preflight` 可只检查资源、文件和数据分区。 +`--audit-only` 只校验固定版本完整 Nano 文件及 action tensors,不构建训练模型。 +首次原始权重审计需要联网访问 Hugging Face 元数据;以后文件没有变化时可使用 `--offline`。 + +```bash +# 使用同一代码、基座、bundle、run-dir 和 GPU 数;其余路径参数与启动时相同。 +CUDA_VISIBLE_DEVICES=0,1 python -m scripts.run_bridge_stage2_native \ + --bundle /实际路径/releases/bridge-native-v3 \ + --assets /大容量磁盘/bridge-assets \ + --run-dir /大容量磁盘/bridge-native-run \ + --resume /大容量磁盘/bridge-native-run/checkpoints/step_000000050 \ + --continuous +``` + +仅支持本入口产生且验收通过的完整 native checkpoint,同一 GPU 数恢复。 +保存内容含 trainable replacement tensors、FP32 master/Adam moments、warmup所需step、 +RNG、已消费microbatch游标、采样phase、检索head、代码/资产/合同hash。 +恢复不会读取旧 RoboCasa/IPEC policy 或旧 optimizer。 + +## 实现与输出 + +- `scripts/native_stage2/data.py`:episode内33观测/32动作、三条独立编码、短尾mask、可恢复采样。 +- `base.py`、`model.py`:原始Nano严格加载,三次初始化保真审计,WAM视频+动作loss和masked PBD。 +- `memory.py`:understanding-only image+instruction readout,3000 support的2700/300 head训练,prefix CTE和有容量上限的缓存。 +- `optim.py`:BF16参数/FP32 master,三档LR,domain7梯度隔离、表weight_decay=0、真实更新统计。 +- `checkpoint.py`:分片、SHA256、原子目录提交,完整续训状态和精确恢复检查。 +- `evaluate.py`、`train.py`:固定30-step solver探针、50/500 gate、通过后全量训练。 +- `online.py`:normalized10/denormalized10分离输出,完整位姿与上一controller target解码,执行后独立reached7。 + +运行目录包含 `base_audit/`、`dimension_ledger.json`、`trainable_manifest.json`、 +`runtime_shape_trace.json`、`retrieval_report.json`、`probe_step_*.json`、`gate_50.json`、 +`gate_500.json`、`audits/`、`metrics.jsonl`、`status.json` 和 `checkpoints/`。 +失败时额外保存 `failure_rank_*.json`。固定探针分别记录原始loss、逐维normalized error、 +sampled action平移/SO(3)误差、index9夹爪切换指标、BIT长度、两种action输出和离线解码示例。 + +本地验证命令: + +```bash +CUDA_VISIBLE_DEVICES='' python -m unittest \ + scripts.test_bridge_native_contract scripts.test_bridge_native_training -v +CUDA_VISIBLE_DEVICES='' python -m torch.distributed.run --standalone --nproc-per-node=2 \ + --module scripts.test_bridge_native_distributed +``` + +CPU测试覆盖几何/夹爪索引、短尾loss和梯度、future-prefix隔离、native WAM packing、 +BF16实际更新、非domain7参数/master逐位不变、分片完整保存恢复、RNG和消费游标、gate判定。 +完整Nano仅做了meta结构与固定checkpoint索引匹配核查;这不替代两卡FSDP2前向/反向验证。 diff --git a/releases/bridge-native-v3/code/docs/bridge_static_bank_3000.md b/releases/bridge-native-v3/code/docs/bridge_static_bank_3000.md new file mode 100644 index 0000000000000000000000000000000000000000..5e2c1463a6ba73f70d90ce0649c08cd4780ec019 --- /dev/null +++ b/releases/bridge-native-v3/code/docs/bridge_static_bank_3000.md @@ -0,0 +1,72 @@ +# Bridge 3,000-episode static bank + +This bank is independent of the existing 8-support / 40-query pilot. It does +not replace that pilot's task prototypes or invalidate its saved checkpoints. + +## Data and representation contract + +- Source: the local IPEC Bridge LeRobot dataset (53,192 episodes). +- Select 3,000 distinct episodes, seed `20260925`, uniformly without replacement + from the **original Stage1 training split**. Require one nonempty instruction + and at least 17 frames. Exclude all 48 existing pilot episodes and all 1,064 + original validation episodes. Do not task-balance or replicate trajectories. +- Frozen encoder: Bridge CTE step **30,000**, SHA-256 + `5c94378ea87b875dd709d46cf7941cdb5ca33584df071fef254311c6bbab912e`. +- Keep reached-state delta 7D, the legacy normalizer, stride 4, native RGB + 256×256, and **single-frame** BF16 Wan VAE encoding. No video VAE encoding, + policy preprocessing changes, gradient updates, or full-dataset caching. +- Zeva runtime defaults: `cudnn.benchmark=True`, `cudnn.deterministic=False`. + Actual features are saved and hashed; fresh autotuned encoding need not be + bitwise identical. The frame microbatch (4) and runtime versions are recorded. +- One entry per support episode: a 128-D key and 256-D value, both FP32. + Key = L2-normalized temporal mean of the CTE retrieval output. Value = temporal + mean of the causal interaction state. Only real observation boundaries count. + **No pooling between episodes or by task.** This temporal rule is Bridge-v1; + the original RoboCasa export script is unavailable, so identical temporal + aggregation with the released RoboCasa bank is not claimed. + +Whole **support** trajectories may be encoded offline. A query must never be +one of these support trajectories: otherwise its future could enter its own +global context. Future query loaders must honor `partitions.json` as well as +their own train/development split. Query phase/effect caches remain a separate, +strictly causal artifact; this command does not regenerate them. + +## Build, resume, and verify + +From `/home/gpu4/tianyi/Zeva`, on an actually empty GPU (the builder checks it): + +```bash +PYTHONPATH=/home/gpu4/tianyi/Zeva:/home/gpu4/tianyi/cosmos-framework \ +CUDA_VISIBLE_DEVICES=7 OMP_NUM_THREADS=2 MKL_NUM_THREADS=2 \ +/home/gpu4/tianyi/cosmos-framework/.venv/bin/python -u \ + -m scripts.build_bridge_static_bank --gpu 7 +``` + +The same command resumes completed 50-episode shards. The GPU allocation is +capped at 12 GiB. No process is killed; finding another process on that GPU +causes this builder to stop at a shard boundary. Finished bundles are immutable. + +```bash +PYTHONPATH=/home/gpu4/tianyi/Zeva:/home/gpu4/tianyi/cosmos-framework \ +CUDA_VISIBLE_DEVICES='' \ +/home/gpu4/tianyi/cosmos-framework/.venv/bin/python \ + -m scripts.build_bridge_static_bank --verify-only +``` + +Output: `.artifacts/bridge_static_bank_3000_cte30k_v1/`: + +- `selection.json`: raw episode IDs, instructions, source file paths, exclusions. +- `partitions.json`: reserved support IDs and remaining query candidates. +- `static_bank.pt`: the actual per-trajectory bank; source video/parquet hashes + are stored with each entry. No source video is copied or rewritten. +- `contract.json`, `manifest.json`: provenance, pooling/runtime contract, hashes. +- `diagnostics.json`: count, dimensions, finite values, key norms, overlap checks, + synthetic top-5 retrieval operator test, exact feature save/reload test. +- `progress.json`, `shards/`: progress and resumable pooled entries, not frame caches. + +The release retrieval operator (cosine top-5, temperature 0.07 softmax-weighted +values) accepts these tensor dimensions. **A compatible Bridge query head has +not been trained by this export. Do not reuse the RoboCasa query head.** A +synthetic query operator test is not evidence of learned task retrieval or +robot success. Wiring a new head or explicitly labelled train-only selector +into Stage2 requires a new versioned bundle; the old pilot is not auto-switched. diff --git a/releases/bridge-native-v3/code/docs/reproduce.md b/releases/bridge-native-v3/code/docs/reproduce.md new file mode 100644 index 0000000000000000000000000000000000000000..442bf7339412487a6163d334f6d6d9ec6e0d86c9 --- /dev/null +++ b/releases/bridge-native-v3/code/docs/reproduce.md @@ -0,0 +1,94 @@ +# Reproduce the RoboCasa365 result + +## Setup + +Download the release from +[chen123fu/zeva](https://huggingface.co/chen123fu/zeva) and set: + +```bash +export ZEVA_RELEASE=/absolute/path/to/zeva +export QWEN_VLM_PATH=/absolute/path/to/Qwen3-VL-8B-Instruct +export WAN_VAE_PATH=/absolute/path/to/Wan2.2_VAE.pth +export ROBOCASA365_ROOT=/absolute/path/to/robocasa365/target +export PYTHONPATH=. +``` + +RoboCasa evaluation also requires `openpi_client`. For headless rendering use: + +```bash +export MUJOCO_GL=egl +export PYOPENGL_PLATFORM=egl +``` + +## Start the policy server + +```bash +CUDA_VISIBLE_DEVICES=0 python -u -m \ + cosmos_framework.scripts.action_policy_server_robocasa365_zeva \ + --checkpoint-path "$ZEVA_RELEASE/weights/stage2_iter_000005000" \ + --allow-dcp-checkpoint \ + --experiment action_policy_robocasa365_atomic5_zeva \ + --experiment-overrides model.config.tokenizer.vae_path="$WAN_VAE_PATH" \ + --task-context-bank \ + "$ZEVA_RELEASE/weights/stage1/train_memory_effect_v3.pt" \ + --cte-checkpoint \ + "$ZEVA_RELEASE/weights/stage1/cte_step_000500.pt" \ + --static-task-context-checkpoint \ + "$ZEVA_RELEASE/weights/stage3_iter_000005000/best.pt" \ + --static-task-context-top-k 5 \ + --domain-name robocasa-panda-omron \ + --host 0.0.0.0 --port 8300 \ + --num-steps 30 --guidance 3.0 --shift 5.0 \ + --action-dim 7 --action-chunk-size 32 --conditioning-fps 20 \ + --image-height 256 --image-width 512 \ + --format-prompt-as-json \ + --no-use-state --history-length 0 \ + --output-dir /tmp/zeva_server +``` + +Wait until the server reports the task-context bank, domain ID 22, action +horizon 32, and `ready` status. + +## Evaluate + +Use the following fixed protocol: + +- target split; +- five Atomic-5 tasks; +- seeds 195–244 for every task; +- left-agent and wrist cameras concatenated to 256×512; +- 32 executed actions per query at 20 Hz; +- 30 UniPC steps, guidance 3.0, shift 5.0; +- maximum 300 environment steps; +- no retries. + +Run each task with the Zeva evaluator: + +```bash +python -m cosmos_framework.scripts.eval_zeva_robocasa365 \ + --task OpenStandMixerHead \ + --host 127.0.0.1 --port 8300 \ + --episodes 50 --seed 195 --open-loop-steps 32 \ + --split target --render-gpu-device-id 0 --no-video \ + --output-dir results/OpenStandMixerHead +``` + +Repeat the command for: + +```text +TurnOnElectricKettle +CloseToasterOvenDoor +TurnOnMicrowave +CoffeeSetupMug +``` + +## Expected result + +| Task | Success | +| --- | ---: | +| OpenStandMixerHead | 48/50 (96%) | +| TurnOnElectricKettle | 45/50 (90%) | +| CloseToasterOvenDoor | 38/50 (76%) | +| TurnOnMicrowave | 47/50 (94%) | +| CoffeeSetupMug | 17/50 (34%) | +| **Total** | **195/250 (78.0%)** | diff --git a/releases/bridge-native-v3/code/docs/zeva_pim.md b/releases/bridge-native-v3/code/docs/zeva_pim.md new file mode 100644 index 0000000000000000000000000000000000000000..500d3241ace7dfeafb9a85f60e81f1957ae3c86a --- /dev/null +++ b/releases/bridge-native-v3/code/docs/zeva_pim.md @@ -0,0 +1,99 @@ +# Persistent Interaction Memory + +Zeva uses two interaction memories: + +- **Brief Interaction Trace (BIT)** retains recent causal effects inside the + current attempt. +- **Persistent Interaction Memory (PIM)** retains completed interaction evidence + across attempts and retrieves it with the current phase representation. + +PIM entries contain a phase, a causal effect, an attempt ID, and an observation +count. Similar entries are merged; retrieval returns the top phase-matched +evidence for Causal Prompt construction. + +## Model components + +| Paper component | Implementation | +| --- | --- | +| Causal Transition Encoder | `CausalTransitionEncoder` | +| Phase representation | `phase_head` / `phase` | +| Causal effect | `effect_pre` / `effect_post` | +| Brief Interaction Trace | `BriefInteractionTrace` | +| Persistent Interaction Memory | `PersistentInteractionMemory` | +| Phase-Conditioned Retrieval | `PhaseConditionedPIMRetrieval` | +| Causal Prompt | `CausalPromptEncoder` | +| Policy Injection | `CausalPromptPolicyAdapter` | + +## Start a PIM policy server + +Set the release and dependency paths: + +```bash +export ZEVA_RELEASE=/absolute/path/to/zeva +export ZEVA_PIM_CHECKPOINT=/absolute/path/to/iter_000000500 +export WAN_VAE_PATH=/absolute/path/to/Wan2.2_VAE.pth +export PYTHONPATH=. +``` + +Start the server with a Zeva-PIM checkpoint: + +```bash +CUDA_VISIBLE_DEVICES=0 python -u -m \ + cosmos_framework.scripts.action_policy_server_robocasa365_zeva_pim \ + --checkpoint-path "$ZEVA_PIM_CHECKPOINT" \ + --allow-dcp-checkpoint \ + --experiment action_policy_robocasa365_atomic5_zeva_pim_inference \ + --experiment-overrides model.config.tokenizer.vae_path="$WAN_VAE_PATH" \ + --task-context-bank \ + "$ZEVA_RELEASE/weights/stage1/train_memory_effect_v3.pt" \ + --cte-checkpoint \ + "$ZEVA_RELEASE/weights/stage1/cte_step_000500.pt" \ + --static-task-context-checkpoint \ + "$ZEVA_RELEASE/weights/stage3_iter_000005000/best.pt" \ + --pim-enabled --pim-top-k 4 \ + --pim-success-replay-enabled \ + --num-steps 30 --guidance 3.0 --shift 5.0 \ + --action-dim 7 --action-chunk-size 32 --conditioning-fps 20 \ + --image-height 256 --image-width 512 \ + --no-use-state --history-length 0 \ + --host 0.0.0.0 --port 8300 +``` + +Use `--pim-shadow` instead of `--pim-enabled` to execute PIM lifecycle and +retrieval without injecting the retrieved evidence into policy actions. + +## Fixed-seed cross-attempt evaluation + +```bash +python -m cosmos_framework.scripts.eval_zeva_robocasa365_pim \ + --task TurnOnElectricKettle \ + --host 127.0.0.1 --port 8300 \ + --episodes 6 --seed 197 --seed-mode fixed \ + --expect-pim-conditioning on \ + --output-dir results/kettle_seed197 --no-video +``` + +The fixed seed preserves the task instance while the attempt ID increases. +Success replay is activated only after PIM has observed a successful attempt. + +## Reproducible case studies + +Each sequence was reproduced twice from empty PIM. `F` denotes failure and `S` +denotes success. + +| Task | Seed | Attempts | +| --- | ---: | --- | +| OpenStandMixerHead | 199 | `FSSSS` | +| TurnOnElectricKettle | 197 | `FSSSSS` | +| CloseToasterOvenDoor | 199 | `FFFSSSSSSSS` | +| TurnOnMicrowave | 200 | `FFFFSSSS` | +| CoffeeSetupMug | 204 | `FFFFFFFFFSSSS` | + +Validate an exported case-study pair with: + +```bash +python experiment_manifests/verify_pim_evolve_case.py \ + --first /path/to/first_run \ + --repeat /path/to/repeat_run \ + --task TurnOnElectricKettle --seed 197 +``` diff --git a/releases/bridge-native-v3/code/examples/launch_sft_action_policy_robocasa365_atomic5_zeva_pim.sh b/releases/bridge-native-v3/code/examples/launch_sft_action_policy_robocasa365_atomic5_zeva_pim.sh new file mode 100644 index 0000000000000000000000000000000000000000..fc04bc9edba30176c6f985d443b60e8b536cc056 --- /dev/null +++ b/releases/bridge-native-v3/code/examples/launch_sft_action_policy_robocasa365_atomic5_zeva_pim.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. +# SPDX-License-Identifier: OpenMDW-1.1 + +# Short frozen-policy adaptation for the paper-aligned PIM residual. The base +# checkpoint must be the verified Atomic-5 GRU Stage-2 iter-5k DCP. + +set -u + +TOML_FILE="examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva_pim.toml" + +: "${ROBOCASA365_ROOT:?Set ROBOCASA365_ROOT to the Atomic-5 RoboCasa365 dataset}" +: "${BASE_CHECKPOINT_PATH:?Set BASE_CHECKPOINT_PATH to the verified GRU Stage-2 iter-5k DCP}" +: "${ZEVA_TASK_CONTEXT_BANK:?Set ZEVA_TASK_CONTEXT_BANK to the static task-context bank}" +: "${ZEVA_CTE_FEATURE_CACHE:?Set ZEVA_CTE_FEATURE_CACHE to the CTE feature-cache directory}" +: "${QWEN_VLM_PATH:?Set QWEN_VLM_PATH to Qwen3-VL-8B-Instruct}" +: "${WAN_VAE_PATH:?Set WAN_VAE_PATH to the Wan2.2 VAE checkpoint}" + +# Accept the earlier artifact name as a compatibility alias. +ZEVA_PIM_TRAINING_BANK="${ZEVA_PIM_TRAINING_BANK:-}" +: "${ZEVA_PIM_TRAINING_BANK:?Build the PIM training bank first}" + +export ROBOCASA365_ROOT BASE_CHECKPOINT_PATH ZEVA_TASK_CONTEXT_BANK ZEVA_CTE_FEATURE_CACHE +export ZEVA_PIM_TRAINING_BANK QWEN_VLM_PATH WAN_VAE_PATH +DATASET_PATH="$ROBOCASA365_ROOT" +EXTRA_DATASET_CHECK=' +[[ -f "$ZEVA_TASK_CONTEXT_BANK" ]] || { echo "ERROR: missing $ZEVA_TASK_CONTEXT_BANK" >&2; exit 1; } +[[ -d "$ZEVA_CTE_FEATURE_CACHE" ]] || { echo "ERROR: missing $ZEVA_CTE_FEATURE_CACHE" >&2; exit 1; } +[[ -f "$ZEVA_PIM_TRAINING_BANK" ]] || { echo "ERROR: missing $ZEVA_PIM_TRAINING_BANK" >&2; exit 1; } +[[ -d "$QWEN_VLM_PATH" ]] || { echo "ERROR: missing $QWEN_VLM_PATH" >&2; exit 1; } +' + +TAIL_OVERRIDES=( + ${EXTRA_TAIL_OVERRIDES:-} +) + +source "$(dirname "${BASH_SOURCE[0]}")/_sft_launcher_common.sh" diff --git a/releases/bridge-native-v3/code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva.toml b/releases/bridge-native-v3/code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva.toml new file mode 100644 index 0000000000000000000000000000000000000000..17e2b3bd9cb31a7fe6fcf752dca2f03af895e955 --- /dev/null +++ b/releases/bridge-native-v3/code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva.toml @@ -0,0 +1,46 @@ +# Effect-v3 Zeva — RoboCasa Atomic-5. Requires the baseline environment +# plus ZEVA_TASK_CONTEXT_BANK and ZEVA_CTE_FEATURE_CACHE from the delivered CTE. + +[job] +task = "vfm" +experiment = "action_policy_robocasa365_atomic5_zeva" +project = "zeva" +group = "zeva_robocasa_atomic5" +name = "zeva_robocasa_atomic5_smoke" +wandb_mode = "disabled" + +[model] +precision = "bfloat16" + +[model.parallelism] +data_parallel_shard_degree = 8 +data_parallel_replicate_degree = 1 + +[model.activation_checkpointing] +mode = "full" +save_ops_regex = ["fmha"] + +[model.tokenizer] +vae_path = "${oc.env:WAN_VAE_PATH}" + +[optimizer] +lr = 2.0e-4 + +[scheduler] +cycle_lengths = [100000] + +[dataloader_train] +max_samples_per_batch = 16 + +[trainer] +max_iter = 20 +logging_iter = 1 +grad_accum_iter = 1 + +[trainer.callbacks.compile_tokenizer] +enabled = true +warmup_resolutions = ["480"] + +[checkpoint] +load_path = "${oc.env:BASE_CHECKPOINT_PATH}" +save_iter = 20 diff --git a/releases/bridge-native-v3/code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva_pim.toml b/releases/bridge-native-v3/code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva_pim.toml new file mode 100644 index 0000000000000000000000000000000000000000..9ea0aab3e119d7df1d5c3e59a74b2d22ac779ac3 --- /dev/null +++ b/releases/bridge-native-v3/code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva_pim.toml @@ -0,0 +1,46 @@ +# Frozen-policy PIM adapter. BASE_CHECKPOINT_PATH must be the verified GRU +# Stage2 iter-5k DCP; only the Causal Prompt encoder, projector, and gate are optimized. + +[job] +task = "vfm" +experiment = "action_policy_robocasa365_atomic5_zeva_pim" +project = "zeva" +group = "pim_adapter_robocasa_atomic5" +name = "pim_adapter_robocasa_atomic5_smoke" +wandb_mode = "disabled" + +[model] +precision = "bfloat16" + +[model.parallelism] +data_parallel_shard_degree = 8 +data_parallel_replicate_degree = 1 + +[model.activation_checkpointing] +mode = "full" +save_ops_regex = ["fmha"] + +[model.tokenizer] +vae_path = "${oc.env:WAN_VAE_PATH}" + +[optimizer] +lr = 5.0e-05 + +[scheduler] +cycle_lengths = [500] + +[dataloader_train] +max_samples_per_batch = 8 + +[trainer] +max_iter = 500 +logging_iter = 1 +grad_accum_iter = 1 + +[trainer.callbacks.compile_tokenizer] +enabled = true +warmup_resolutions = ["480"] + +[checkpoint] +load_path = "${oc.env:BASE_CHECKPOINT_PATH}" +save_iter = 100 diff --git a/releases/bridge-native-v3/code/experiment_manifests/eval_zeva_robocasa365_pim_formal32.py b/releases/bridge-native-v3/code/experiment_manifests/eval_zeva_robocasa365_pim_formal32.py new file mode 100644 index 0000000000000000000000000000000000000000..a2d40913e029fea38fe305e87377768fd7ca9ba0 --- /dev/null +++ b/releases/bridge-native-v3/code/experiment_manifests/eval_zeva_robocasa365_pim_formal32.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python3 +"""Closed-loop RoboCasa365 evaluation client for the Cosmos3 atomic5 policy.""" + +from __future__ import annotations + +import argparse +import faulthandler +import json +import os +import time +from collections import deque +from pathlib import Path + +import cv2 +import gymnasium as gym +import numpy as np +from openpi_client.websocket_client_policy import WebsocketClientPolicy + +import robocasa # noqa: F401 +# Gymnasium registration for the Panda-Omron adapter resides in this module +# rather than in RoboCasa's package initializer. +import robocasa.wrappers.gym_wrapper # noqa: F401 +from robocasa.utils.env_utils import convert_action + + +# Native MuJoCo/EGL failures otherwise exit with SIGABRT and no actionable +# Python context. This has no effect on rollout numerics or the protocol. +faulthandler.enable(all_threads=True) + + +TASK_PROMPTS = { + "OpenStandMixerHead": "Open the stand mixer head.", + "TurnOnElectricKettle": "Press down the lever to turn on the electric kettle.", + "CloseToasterOvenDoor": "Close the toaster oven door.", + "TurnOnMicrowave": "Press the start button on the microwave.", + "CoffeeSetupMug": "Pick the mug from the counter and place it under the coffee machine dispenser.", +} + + +def _obs_value(obs: dict, *keys: str) -> np.ndarray: + for key in keys: + if key in obs: + return np.asarray(obs[key]) + raise KeyError(f"Missing observation; tried {keys}. Available: {sorted(obs)}") + + +def prepare_policy_observation(obs: dict, prompt: str) -> tuple[dict, np.ndarray]: + left = _obs_value(obs, "video.robot0_agentview_left", "robot0_agentview_left_image") + wrist = _obs_value(obs, "video.robot0_eye_in_hand", "robot0_eye_in_hand_image") + if left.shape != wrist.shape or left.ndim != 3 or left.shape[-1] != 3: + raise ValueError(f"Expected matching RGB views, got left={left.shape}, wrist={wrist.shape}") + image = np.concatenate([left, wrist], axis=1).astype(np.uint8, copy=False) + + if "state.end_effector_position_relative" in obs: + proprio = np.concatenate( + [ + np.asarray(obs["state.end_effector_position_relative"], dtype=np.float32), + np.asarray(obs["state.end_effector_rotation_relative"], dtype=np.float32), + np.asarray(obs["state.gripper_qpos"], dtype=np.float32), + ] + ) + else: + proprio = np.concatenate( + [ + np.asarray(obs["robot0_base_to_eef_pos"], dtype=np.float32), + np.asarray(obs["robot0_base_to_eef_quat"], dtype=np.float32), + np.asarray(obs["robot0_gripper_qpos"], dtype=np.float32), + ] + ) + if proprio.shape != (9,): + raise ValueError(f"Expected arm-only 9D proprio, got {proprio.shape}") + return { + "prompt": prompt, + "observation/image": image, + "observation/proprio": proprio, + }, left + + +def env_step(env, arm_action: np.ndarray): + arm_action = np.asarray(arm_action, dtype=np.float32) + if arm_action.shape != (7,) or not np.isfinite(arm_action).all(): + raise ValueError(f"Invalid arm7 action: shape={arm_action.shape}, finite={np.isfinite(arm_action).all()}") + raw = np.zeros(12, dtype=np.float32) + raw[:7] = np.clip(arm_action, -1.0, 1.0) + result = env.step(convert_action(raw)) + if len(result) == 5: + obs, reward, terminated, truncated, info = result + done = bool(terminated or truncated) + else: + obs, reward, done, info = result + success = bool(info.get("success", False) or reward > 0) + return obs, success, done + + +def save_video(frames: list[np.ndarray], path: Path, fps: int = 20) -> None: + if not frames: + return + path.parent.mkdir(parents=True, exist_ok=True) + height, width = frames[0].shape[:2] + writer = cv2.VideoWriter( + str(path), cv2.VideoWriter_fourcc(*"mp4v"), fps, (width, height) + ) + if not writer.isOpened(): + raise RuntimeError(f"Could not open video writer for {path}") + try: + for frame in frames: + if frame.shape[:2] != (height, width): + raise ValueError(f"Inconsistent video frame shape {frame.shape}") + writer.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) + finally: + writer.release() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--task", choices=sorted(TASK_PROMPTS), required=True) + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, required=True) + parser.add_argument("--episodes", type=int, default=10) + parser.add_argument("--seed", type=int, default=195) + parser.add_argument("--max-steps", type=int, default=300) + parser.add_argument("--open-loop-steps", type=int, default=10) + parser.add_argument( + "--pim-formal32", + action="store_true", + help=( + "Send the PIM lifecycle fields while preserving the released " + "32-control formal evaluation protocol." + ), + ) + parser.add_argument( + "--expected-pim-conditioning", + choices=("on", "off"), + default="on", + help="Require PIM injection to be active or shadow-gated while retaining PIM lifecycle fields.", + ) + parser.add_argument("--split", default="target") + parser.add_argument("--output-dir", type=Path, required=True) + parser.add_argument( + "--render-gpu-device-id", + type=int, + default=-1, + help="MuJoCo EGL device index visible to this evaluator (-1: automatic).", + ) + parser.add_argument("--no-video", action="store_true") + parser.add_argument( + "--inference-seed-prefix-json", + type=Path, + help=( + "Optional JSON array of exact policy seeds to replay before " + "returning to the server's untouched RNG stream. This is only " + "for infrastructure recovery after a native renderer abort." + ), + ) + args = parser.parse_args() + if args.pim_formal32 and args.open_loop_steps != 32: + raise ValueError("--pim-formal32 requires --open-loop-steps=32") + + os.environ.setdefault("MUJOCO_GL", "egl") + os.environ.setdefault("PYOPENGL_PLATFORM", "egl") + args.output_dir.mkdir(parents=True, exist_ok=True) + client = WebsocketClientPolicy(args.host, args.port) + replay_seed_prefix = ( + [int(value) for value in json.loads(args.inference_seed_prefix_json.read_text())] + if args.inference_seed_prefix_json is not None + else [] + ) + replay_seed_index = 0 + results = [] + + for episode_idx in range(args.episodes): + episode_seed = args.seed + episode_idx + env = gym.make( + f"robocasa/{args.task}", + split=args.split, + seed=episode_seed, + camera_widths=256, + camera_heights=256, + enable_render=True, + render_gpu_device_id=args.render_gpu_device_id, + robots="PandaOmron", + randomize_cameras=False, + translucent_robot=False, + ) + # Match the official RoboCasa365 RLDX harness: the seed is supplied to + # gym.make(), whose constructor performs an initial reset, and rollout + # then calls reset() without rewinding the environment RNG a second time. + reset = env.reset() + obs = reset[0] if isinstance(reset, tuple) else reset + frames: list[np.ndarray] = [] + action_queue: deque[np.ndarray] = deque() + # The CTE is defined at Wan's four-control cadence. Retain only + # observations at raw offsets 0,4,8,... and the *executed* arm7 + # controls between them. The policy server derives a first effect + # only after four such transitions (16 executed controls). + initial_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + cte_boundary_images: list[np.ndarray] = [initial_policy_obs["observation/image"].copy()] + cte_transitions: list[np.ndarray] = [] + pending_transition_actions: list[np.ndarray] = [] + actions_since_replan: list[np.ndarray] = [] + pim_query_info: list[dict] = [] + query_times = [] + success = False + done = False + + steps = 0 + while steps < args.max_steps and not success and not done: + policy_obs, left_frame = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + policy_obs["cte_boundary_images"] = np.stack(cte_boundary_images, axis=0) + policy_obs["cte_transition_actions"] = ( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ) + policy_obs["cte_reset"] = steps == 0 + if not args.no_video: + frames.append(left_frame.copy()) + if not action_queue: + requested_inference_seed = None + if replay_seed_index < len(replay_seed_prefix): + requested_inference_seed = replay_seed_prefix[replay_seed_index] + if requested_inference_seed < 0 or requested_inference_seed >= 2**32: + raise ValueError("Recovery inference seed must be in uint32 range") + policy_obs["inference_seed"] = requested_inference_seed + replay_seed_index += 1 + if args.pim_formal32: + policy_obs.update( + { + "pim_session_id": f"formal32:{args.task}:{episode_seed}", + "pim_task_cluster": args.task, + "pim_environment_seed": episode_seed, + "pim_attempt_id": 0, + "pim_memory_reset": steps == 0, + "pim_replan_reset": False, + "pim_latent_index": steps, + "pim_replan_index": len(query_times), + "pim_executed_action": np.asarray( + actions_since_replan, dtype=np.float32 + ).reshape(-1, 7), + "pim_transition_complete": len(actions_since_replan) == 32, + } + ) + start = time.monotonic() + output = client.infer(policy_obs) + query_times.append(time.monotonic() - start) + if args.pim_formal32: + contract = output.get("zeva_contract") + if not isinstance(contract, dict): + raise ValueError("PIM server did not return zeva_contract") + observed_conditioning = bool(contract.get("pim_conditioning", False)) + expected_conditioning = args.expected_pim_conditioning == "on" + if ( + contract.get("memory_backend") != "pim" + or observed_conditioning != expected_conditioning + ): + raise ValueError( + "PIM conditioning mode mismatch: " + f"expected={expected_conditioning}, contract={contract}" + ) + if requested_inference_seed is not None and int( + contract.get("inference_seed", -1) + ) != requested_inference_seed: + raise ValueError( + "Server did not honor recovery inference seed: " + f"requested={requested_inference_seed}, contract={contract}" + ) + info = output.get("pim") + if not isinstance(info, dict): + raise ValueError("PIM server did not return retrieval metadata") + pim_query_info.append(dict(info)) + actions = np.asarray(output["action"], dtype=np.float32) + if actions.ndim != 2 or actions.shape[1] != 7: + raise ValueError(f"Policy returned action shape {actions.shape}, expected [T,7]") + action_queue.extend(actions[: args.open_loop_steps]) + actions_since_replan = [] + executed_action = action_queue.popleft() + obs, success, done = env_step(env, executed_action) + actions_since_replan.append(executed_action.astype(np.float32, copy=True)) + pending_transition_actions.append(executed_action.astype(np.float32, copy=True)) + if len(pending_transition_actions) == 4: + boundary_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + cte_boundary_images.append(boundary_policy_obs["observation/image"].copy()) + cte_transitions.append(np.stack(pending_transition_actions, axis=0)) + pending_transition_actions.clear() + steps += 1 + + if args.pim_formal32: + final_policy_obs, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + final_policy_obs["cte_boundary_images"] = np.stack(cte_boundary_images, axis=0) + final_policy_obs["cte_transition_actions"] = ( + np.stack(cte_transitions, axis=0) + if cte_transitions + else np.empty((0, 4, 7), dtype=np.float32) + ) + final_policy_obs.update( + { + "pim_finalize_attempt": True, + "pim_session_id": f"formal32:{args.task}:{episode_seed}", + "pim_task_cluster": args.task, + "pim_environment_seed": episode_seed, + "pim_attempt_id": 0, + "pim_latent_index": steps, + "pim_executed_action": np.asarray( + actions_since_replan, dtype=np.float32 + ).reshape(-1, 7), + "pim_transition_complete": len(actions_since_replan) == 32, + "pim_terminal_outcome": "success" if success else "failure", + "pim_termination_reason": "success" if success else ( + "env_done" if done else "max_steps" + ), + "pim_total_steps": steps, + "pim_final_progress": 1.0 if success else 0.0, + } + ) + finalize_output = client.infer(final_policy_obs) + if not isinstance(finalize_output.get("pim_finalize"), dict): + raise ValueError("PIM server did not acknowledge attempt finalization") + + env.close() + record = { + "task": args.task, + "episode": episode_idx, + "seed": episode_seed, + "success": success, + "steps": steps, + "queries": len(query_times), + "mean_query_seconds": float(np.mean(query_times)) if query_times else None, + "pim_formal32": bool(args.pim_formal32), + "pim_entries_last": ( + int(pim_query_info[-1].get("entries_total", 0)) if pim_query_info else 0 + ), + "infrastructure_recovery_seed_prefix": replay_seed_prefix, + } + results.append(record) + with (args.output_dir / "episodes.jsonl").open("a") as file: + file.write(json.dumps(record) + "\n") + if not args.no_video: + save_video( + frames, + args.output_dir / f"ep_{episode_idx:03d}_seed_{episode_seed}_{'success' if success else 'fail'}.mp4", + ) + print(json.dumps(record), flush=True) + + summary = { + "task": args.task, + "episodes": len(results), + "successes": sum(item["success"] for item in results), + "success_rate": float(np.mean([item["success"] for item in results])), + "mean_steps": float(np.mean([item["steps"] for item in results])), + "mean_query_seconds": float( + np.mean([item["mean_query_seconds"] for item in results if item["mean_query_seconds"] is not None]) + ), + } + (args.output_dir / "summary.json").write_text(json.dumps(summary, indent=2) + "\n") + print("SUMMARY " + json.dumps(summary), flush=True) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/experiment_manifests/pim_gate_off_equivalence.py b/releases/bridge-native-v3/code/experiment_manifests/pim_gate_off_equivalence.py new file mode 100644 index 0000000000000000000000000000000000000000..6f33e8bd5f76241b04c969326adca8b41d012945 --- /dev/null +++ b/releases/bridge-native-v3/code/experiment_manifests/pim_gate_off_equivalence.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +"""Compare one identical RoboCasa observation against base and gate-off PIM servers.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +from pathlib import Path + +import gymnasium as gym +import numpy as np +from openpi_client.websocket_client_policy import WebsocketClientPolicy + +import robocasa # noqa: F401 +import robocasa.wrappers.gym_wrapper # noqa: F401 + + +TASK_PROMPTS = { + "OpenStandMixerHead": "Open the stand mixer head.", + "TurnOnElectricKettle": "Press down the lever to turn on the electric kettle.", + "CloseToasterOvenDoor": "Close the toaster oven door.", + "TurnOnMicrowave": "Press the start button on the microwave.", + "CoffeeSetupMug": "Pick the mug from the counter and place it under the coffee machine dispenser.", +} + + +def obs_value(obs: dict, *keys: str) -> np.ndarray: + for key in keys: + if key in obs: + return np.asarray(obs[key]) + raise KeyError(f"Missing observation; tried {keys}. Available: {sorted(obs)}") + + +def prepare_policy_observation(obs: dict, prompt: str) -> tuple[dict, np.ndarray]: + left = obs_value(obs, "video.robot0_agentview_left", "robot0_agentview_left_image") + wrist = obs_value(obs, "video.robot0_eye_in_hand", "robot0_eye_in_hand_image") + image = np.concatenate([left, wrist], axis=1).astype(np.uint8, copy=False) + if "state.end_effector_position_relative" in obs: + proprio = np.concatenate( + [ + np.asarray(obs["state.end_effector_position_relative"], dtype=np.float32), + np.asarray(obs["state.end_effector_rotation_relative"], dtype=np.float32), + np.asarray(obs["state.gripper_qpos"], dtype=np.float32), + ] + ) + else: + proprio = np.concatenate( + [ + np.asarray(obs["robot0_base_to_eef_pos"], dtype=np.float32), + np.asarray(obs["robot0_base_to_eef_quat"], dtype=np.float32), + np.asarray(obs["robot0_gripper_qpos"], dtype=np.float32), + ] + ) + if image.shape != (256, 512, 3) or proprio.shape != (9,): + raise ValueError(f"Unexpected observation shapes: image={image.shape}, proprio={proprio.shape}") + return { + "prompt": prompt, + "observation/image": image, + "observation/proprio": proprio, + }, left + + +def array_hash(value: np.ndarray) -> str: + return hashlib.sha256(np.ascontiguousarray(value).view(np.uint8)).hexdigest() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--base-host", default=None) + parser.add_argument("--pim-host", default=None) + parser.add_argument("--base-port", type=int, required=True) + parser.add_argument("--pim-port", type=int, required=True) + parser.add_argument("--task", default="TurnOnMicrowave", choices=sorted(TASK_PROMPTS)) + parser.add_argument("--seed", type=int, default=195) + parser.add_argument("--render-gpu-device-id", type=int, default=0) + parser.add_argument("--repeat-each", type=int, default=1) + parser.add_argument("--base-skip-pim-lifecycle", action="store_true") + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + + os.environ.setdefault("MUJOCO_GL", "egl") + os.environ.setdefault("PYOPENGL_PLATFORM", "egl") + env = gym.make( + f"robocasa/{args.task}", + split="target", + seed=args.seed, + camera_widths=256, + camera_heights=256, + enable_render=True, + render_gpu_device_id=args.render_gpu_device_id, + robots="PandaOmron", + randomize_cameras=False, + translucent_robot=False, + ) + try: + reset = env.reset() + obs = reset[0] if isinstance(reset, tuple) else reset + request, _ = prepare_policy_observation(obs, TASK_PROMPTS[args.task]) + request["cte_boundary_images"] = np.expand_dims( + request["observation/image"].copy(), axis=0 + ) + request["cte_transition_actions"] = np.empty((0, 4, 7), dtype=np.float32) + request["cte_reset"] = True + request["inference_seed"] = 0 + request.update( + { + "pim_session_id": f"gateoff-equivalence:{args.task}:{args.seed}", + "pim_task_cluster": args.task, + "pim_environment_seed": args.seed, + "pim_attempt_id": 0, + "pim_memory_reset": True, + "pim_replan_reset": False, + "pim_latent_index": 0, + "pim_replan_index": 0, + "pim_executed_action": np.empty((0, 7), dtype=np.float32), + "pim_transition_complete": False, + } + ) + + base_host = args.base_host or args.host + pim_host = args.pim_host or args.host + base_request = dict(request) + pim_request = dict(request) + if args.base_skip_pim_lifecycle: + base_request["pim_diagnostic_skip_lifecycle"] = True + pim_request["pim_diagnostic_skip_lifecycle"] = False + if args.repeat_each < 1: + raise ValueError("--repeat-each must be positive") + base_client = WebsocketClientPolicy(base_host, args.base_port) + pim_client = WebsocketClientPolicy(pim_host, args.pim_port) + base_outputs = [base_client.infer(base_request) for _ in range(args.repeat_each)] + pim_outputs = [pim_client.infer(pim_request) for _ in range(args.repeat_each)] + base_runs = [np.asarray(value["action"], dtype=np.float32) for value in base_outputs] + pim_runs = [np.asarray(value["action"], dtype=np.float32) for value in pim_outputs] + base = base_runs[0] + pim = pim_runs[0] + finally: + env.close() + + if base.shape != (32, 7) or pim.shape != (32, 7): + raise ValueError(f"Unexpected action shapes: base={base.shape}, pim={pim.shape}") + delta = np.abs(base - pim) + base_repeat_delta = max( + (float(np.abs(base - value).max()) for value in base_runs[1:]), default=0.0 + ) + pim_repeat_delta = max( + (float(np.abs(pim - value).max()) for value in pim_runs[1:]), default=0.0 + ) + feature_comparison = {} + base_features = base_outputs[0].get("cte_features", {}) + pim_features = pim_outputs[0].get("cte_features", {}) + for name in sorted(set(base_features) & set(pim_features)): + base_value = np.asarray(base_features[name]) + pim_value = np.asarray(pim_features[name]) + if base_value.shape != pim_value.shape or base_value.dtype == np.bool_: + feature_comparison[name] = { + "base_shape": list(base_value.shape), + "pim_shape": list(pim_value.shape), + "exact_equal": bool(np.array_equal(base_value, pim_value)), + } + continue + feature_delta = np.abs(base_value.astype(np.float32) - pim_value.astype(np.float32)) + feature_comparison[name] = { + "shape": list(base_value.shape), + "exact_equal": bool(np.array_equal(base_value, pim_value)), + "max_abs_delta": float(feature_delta.max(initial=0.0)), + "mean_abs_delta": float(feature_delta.mean()) if feature_delta.size else 0.0, + } + report = { + "format": "pim_gate_off_equivalence_v1", + "task": args.task, + "environment_seed": args.seed, + "inference_seed": 0, + "observation_image_sha256": array_hash(request["observation/image"]), + "observation_proprio_sha256": array_hash(request["observation/proprio"]), + "base_endpoint": f"{base_host}:{args.base_port}", + "pim_endpoint": f"{pim_host}:{args.pim_port}", + "base_skip_pim_lifecycle": args.base_skip_pim_lifecycle, + "base_zeva_contract": base_outputs[0].get("zeva_contract"), + "pim_zeva_contract": pim_outputs[0].get("zeva_contract"), + "pim_metadata_present": isinstance(pim_outputs[0].get("pim"), dict), + "base_shape": list(base.shape), + "pim_shape": list(pim.shape), + "base_sha256": array_hash(base), + "pim_sha256": array_hash(pim), + "exact_equal": bool(np.array_equal(base, pim)), + "allclose_atol_1e_6": bool(np.allclose(base, pim, rtol=0.0, atol=1e-6)), + "max_abs_delta": float(delta.max()), + "mean_abs_delta": float(delta.mean()), + "repeat_each": args.repeat_each, + "base_repeat_max_abs_delta": base_repeat_delta, + "pim_repeat_max_abs_delta": pim_repeat_delta, + "cte_feature_comparison": feature_comparison, + "finite": bool(np.isfinite(base).all() and np.isfinite(pim).all()), + } + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(report, indent=2) + "\n") + print(json.dumps(report, sort_keys=True), flush=True) + if not report["allclose_atol_1e_6"]: + raise SystemExit(1) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/experiment_manifests/verify_pim_evolve_case.py b/releases/bridge-native-v3/code/experiment_manifests/verify_pim_evolve_case.py new file mode 100644 index 0000000000000000000000000000000000000000..9c38aa521644116febc5c2188f5eec902d99be6d --- /dev/null +++ b/releases/bridge-native-v3/code/experiment_manifests/verify_pim_evolve_case.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +"""Verify one fixed-seed PIM evolve case and its empty-memory repeat.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +from pathlib import Path +from typing import Any + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def _load_attempts(root: Path) -> list[dict[str, Any]]: + path = root / "episodes.jsonl" + if not path.is_file(): + raise ValueError(f"missing {path}") + attempts = [json.loads(line) for line in path.read_text().splitlines() if line.strip()] + if not attempts: + raise ValueError(f"no attempts in {path}") + ids = [int(row["attempt_id"]) for row in attempts] + if ids != list(range(len(attempts))): + raise ValueError(f"attempt ids are not contiguous from zero: {ids}") + return attempts + + +def _replay_count(row: dict[str, Any]) -> int: + return sum( + bool(query.get("replay_applied")) + for query in row.get("pim_queries", []) + ) + + +def _validate_artifacts(root: Path, attempts: list[dict[str, Any]]) -> None: + for row in attempts: + artifact = root / str(row["artifact_npz"]) + if not artifact.is_file(): + raise ValueError(f"missing artifact {artifact}") + expected = str(row["artifact_sha256"]) + actual = _sha256(artifact) + if actual != expected: + raise ValueError(f"artifact SHA mismatch: {artifact}: {actual} != {expected}") + + +def _summarize( + root: Path, + *, + expected_task: str, + expected_seed: int, + stable_successes: int, +) -> dict[str, Any]: + attempts = _load_attempts(root) + _validate_artifacts(root, attempts) + + tasks = {str(row["task"]) for row in attempts} + seeds = {int(row["environment_seed"]) for row in attempts} + sessions = {str(row["session_id"]) for row in attempts} + if tasks != {expected_task}: + raise ValueError(f"task mismatch: {tasks} != {{{expected_task!r}}}") + if seeds != {expected_seed}: + raise ValueError(f"seed mismatch: {seeds} != {{{expected_seed}}}") + if len(sessions) != 1: + raise ValueError(f"expected one session, got {sessions}") + + successes = [bool(row["success"]) for row in attempts] + try: + first_success = successes.index(True) + except ValueError as exc: + raise ValueError("case has no successful attempt") from exc + if first_success == 0: + raise ValueError("first attempt succeeded; this does not demonstrate evolution") + + stable_end = first_success + 1 + stable_successes + if len(successes) < stable_end: + raise ValueError( + f"need {stable_successes} attempts after first success; only " + f"{len(successes) - first_success - 1} are present" + ) + if not all(successes[first_success + 1 : stable_end]): + raise ValueError("success is not stable after the first successful attempt") + + replay_counts = [_replay_count(row) for row in attempts] + if not all(count > 0 for count in replay_counts[first_success + 1 : stable_end]): + raise ValueError("a stable-success attempt did not apply PIM success replay") + + return { + "root": str(root), + "task": expected_task, + "environment_seed": expected_seed, + "attempts": len(attempts), + "sequence": "".join("S" if value else "F" for value in successes), + "first_success_attempt": first_success, + "stable_successes_required": stable_successes, + "replay_counts": replay_counts, + "artifact_sha256_verified": len(attempts), + "session_id": next(iter(sessions)), + "diffusion_seed_base": attempts[0].get("diffusion_seed_base"), + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--first", type=Path, required=True) + parser.add_argument("--repeat", type=Path, required=True) + parser.add_argument("--task", required=True) + parser.add_argument("--seed", type=int, required=True) + parser.add_argument("--stable-successes", type=int, default=3) + args = parser.parse_args() + + first = _summarize( + args.first, + expected_task=args.task, + expected_seed=args.seed, + stable_successes=args.stable_successes, + ) + repeat = _summarize( + args.repeat, + expected_task=args.task, + expected_seed=args.seed, + stable_successes=args.stable_successes, + ) + if first["sequence"] != repeat["sequence"]: + raise ValueError( + "empty-memory repeat did not reproduce the success sequence: " + f"{first['sequence']} != {repeat['sequence']}" + ) + if first["diffusion_seed_base"] != repeat["diffusion_seed_base"]: + raise ValueError("diffusion seed base differs between first and repeat runs") + + print(json.dumps({"verified": True, "first": first, "repeat": repeat}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/WIDOWX.md b/releases/bridge-native-v3/code/scripts/WIDOWX.md new file mode 100644 index 0000000000000000000000000000000000000000..fba080a076cc49344a7d18dc3ed958b79ad81146 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/WIDOWX.md @@ -0,0 +1,269 @@ +# WidowX / full-Bridge adaptation (updated 2026-09-24) + +This trains the released Zeva Stage-2 Cosmos model, selecting its action heads, +behavior injection modules and proprio encoder for fine-tuning. The Qwen/MoT +backbone, VAE, CTE and static retrieval head remain frozen. This is an initial +cross-robot adaptation, not a reproduction of a WidowX-trained release. + +The smoke root is `/opt/zhangchenyu/datasets/bridge_orig_lerobot_smoke`. +The old sampler used only 397 of its 654 metadata episodes (1,255 windows). +The new `full` sampler includes short episodes and all stride-4 start positions. +Camera `image_0`, +5 FPS, 256-pixel resolution, batch size 1. Per-window task IDs are read from +parquet. Six motion dimensions use the documented Bridge quantile constants; +gripper is -1 closed / +1 open. Proprio is Bridge's eight raw state fields plus +the repeated gripper value, matching the inference adapter's nine fields. + +`prepare_widowx_features.py` caches frozen release CTE features for every window. +The phase/effect features use only observations and actions up to that window's +start, including late-trajectory windows. Global context is retrieved from the episode's +first observation and instruction; this bank is still RoboCasa-trained. + +Use the full-IPEC command below after reserving GPUs; do not invoke the generic +smoke launcher with its historical GPU/cache defaults. Both launchers use the +existing Cosmos venv. The practical step limit is 2,147,483,647; +training continues across data epochs and does not stop after an evaluation. +The installed Cosmos source/venv are reused, with compatibility fixes scoped to +the launcher. No new model download is required. + +Run `python scripts/watch_widowx_eval.py` to watch atomic delta checkpoints. +For saved multiples of 2,000 steps, the selected GPU serves the release plus that trained delta and runs ten +complete `widowx_carrot_on_plate` episodes, seeds 0–9, in the existing SimplerEnv +environment. `--exec-horizon` controls how many predictions are executed before +replanning (1–32, default 4). It is independent of the number of denoising steps. +The causal history records every executed control and makes a CTE boundary +every four controls, including when execution horizons differ from four. XYZ commands +are denormalized once; Euler rotation increments are converted to axis-angle. +Only complete evaluations get success-rate JSON files; errors remain errors. + +Checkpoint output is `$WIDOWX_RUN_DIR/checkpoints/`. Checkpoints contain selected +parameters, optimizer, scheduler, scaler, RNG, a data contract and per-rank +CONSUMED data cursors. They require the original Stage-2 weights. All checkpoints +are retained; none are automatically deleted, even after evaluation. Writes are +atomic, existing checkpoint files cannot be overwritten, and saving fails loudly +below 2 GiB free space. This does not reserve disk space against other jobs. + +## Full IPEC run + +`bash scripts/run_ipec_full_training.sh` uses the full local IPEC Bridge export +and **`.artifacts/ipec_full_v2`** for new features and training state. The old +`.artifacts/ipec_full` run is preserved as a historical baseline. As of 2026-09-24, +the WidowX recipe and TOML both save every **10,000 optimizer steps**. Existing +checkpoints are retained; the launcher resumes the latest complete checkpoint +when explicitly started. It does not start an evaluator automatically. + +The default recipe records W&B metrics in **offline** mode. Records are stored +under `$WIDOWX_RUN_DIR/train//widowx//wandb/`. Logging begins +at the resumed checkpoint's step; previously disabled W&B history is not +reconstructed automatically. Training state remains in `checkpoints/`; W&B +logging does not replace model checkpoints. + +To send a future full-IPEC run to your own W&B account, set `WANDB_API_KEY` and +`WANDB_ENTITY` in the launching shell. Do not put the API key in this repository +or replace the shared machine's W&B login. Pass your project and a **new** run +name as Hydra overrides; the full-IPEC launcher forwards these to the trainer: + +```bash +# Example after WANDB_API_KEY and WANDB_ENTITY are exported in this shell: +CUDA_VISIBLE_DEVICES=2,4 NPROC_PER_NODE=2 WANDB_MODE=online \ + bash scripts/run_ipec_full_training.sh -- \ + job.project=YOUR_PROJECT job.name=ipec_full_v2 job.wandb_mode=online +``` + +The new run name gives W&B a fresh ID and local directory. The model still +resumes the latest delta under `$WIDOWX_RUN_DIR/checkpoints/` because that +directory is controlled by `WIDOWX_RUN_DIR`, independently of the W&B run name. +The offline history from earlier training is separate; after authenticating, +it can be previewed with `wandb sync --dry-run` and uploaded with `wandb sync` +using `--entity` and `--project` on its `offline-run-*` directory. + +The launcher defaults `WANDB_BASE_URL` to `https://api.wandb.ai`, overriding +unrelated global W&B settings on this shared account. Set `WANDB_BASE_URL` +explicitly before launching if using a self-hosted W&B server. +If online W&B initialization raises a W&B error, the local training entrypoint +retries once in offline mode with the same project, name and persisted run ID. +An offline initialization failure or an unrelated training error is not hidden. + +The full-IPEC launcher defaults to GPU 1 and one process. To use a different +reserved GPU set, supply both `CUDA_VISIBLE_DEVICES` and `NPROC_PER_NODE` in +the environment. The TOML uses `data_parallel_shard_degree = -1`, so FSDP +infers the shard count from the launched world size. Eight GPUs with one +sample per rank yield an effective batch size of eight (two GPUs: two). Check GPU processes +and availability before launching; a momentary zero utilization reading +does not mean a card is unoccupied. + +To evaluate one checkpoint on 20 carrot-on-plate episodes (seeds 0–19), with +videos and per-control action/state traces: + +```bash +WIDOWX_RUN_DIR=/home/gpu4/tianyi/Zeva/.artifacts/ipec_full WIDOWX_EVAL_GPU=1 \ + /home/gpu4/tianyi/cosmos-framework/.venv/bin/python scripts/watch_widowx_eval.py \ + --once --checkpoint /home/gpu4/tianyi/Zeva/.artifacts/ipec_full/checkpoints/step_000290000.pt \ + --episodes 20 --port 18785 --record-traces \ + --num-steps 30 --max-steps 150 --exec-horizon 8 +``` + +Choose a free GPU and port before launching. This mode exits after the requested +evaluation and never resumes training or backfills other checkpoints. Results +are written under `eval/`, MP4s under `eval/videos/step_000290000/`, and traces +under `eval/traces/step_000290000/`. It refuses to overwrite an existing completed +result for the checkpoint; use a separate `WIDOWX_RUN_DIR` for repeat evaluations. +The watcher resolves the GPU to its UUID and checks the renderer's actual GPU +before loading the policy. Rendering requests `cuda:0` within that visible set. +This installed SAPIEN version can confuse identical PCI bus numbers in different +domains: GPU 4 incorrectly renders on GPU 0 even with `cuda:0`. The preflight +rejects that mismatch instead of starting a rollout on someone else's card. +GPU 2 passed the physical-device probe; check its workload before evaluation. +`WIDOWX_RENDER_GPU` can select a separate, verified renderer GPU (defaults to +`WIDOWX_EVAL_GPU`). Both physical UUIDs are recorded in the evaluation report. +GPU 6 also collides with GPU 2 in this SAPIEN version, so this experiment uses +policy GPU 6 and renderer GPU 2 explicitly, not an unverified renderer on GPU 6. + +For a controlled sampling comparison, pass `--num-steps 30 --max-steps 150` +to the watcher. These set the policy's UniPC denoising count and the simulator's +control-step limit, respectively. `--seed-start` defaults to 0; disjoint ranges +can run in separate artifact directories and use the same per-step inference +seeds as a single sequential run. Completed reports record `inference_num_steps`. + +## Full sampling and cache provenance + +The local IPEC export has 53,192 episodes and 1,893,026 recorded steps. The old +sampler used 30,770 episodes and 99,075 windows. The new sampler uses **53,192 +episodes / 492,160 windows**, starts at 0, 4, 8, ... through the last recorded +frame, and keeps the model's 32-action / 33-image shape. Tail images repeat the +last observation and actions are padded, but separate validity masks exclude +padded action, vision and Gaussian-prior targets from their losses. The terminal +recorded action remains supervised even if its next image was not exported. +This changes loss normalization; old and new scalar losses are not directly +comparable. Full sampling does not synthesize missing language annotations or +balance task frequencies. + +The current v2 feature cache is stored beside the raw dataset at +`/home/gpu4/tianyi/TTTVLA/datasets/bridge_orig_1.0.0_lerobot_zeva_features_v2`. +Its `manifest.json` binds metadata SHA256, model-file identities and versioned +preprocessing contracts to the cache. Small model files are hashed; large shards +use path, size and modification time, so this is provenance validation, NOT a +full dataset-content integrity scan. Merely adding a fingerprint does not alter +features. This migration prepares a separate cache because old caches lack +provenance and omit late prefixes/short episodes. The old cache is not deleted. +The full launcher runs one preparation worker per selected GPU, validates every +episode's feature tensors, and starts training only after all are present. +Interrupting preparation is safe; rerun to validate and skip completed episodes. + +Do not set `WIDOWX_MAX_EPISODES` for production; it is an optional smoke-test +limit included in the checkpoint's data contract. `WIDOWX_WINDOW_MODE=legacy` +exists only for explicit historical diagnostics, not the full-IPEC launcher. + +## Resume semantics + +`WIDOWX_RESUME=auto` (default) selects the highest **saved optimizer step** in the +current checkpoint directory. This is unrelated to `trainer.max_iter`, the total +optimizer-step stopping limit, and to `--max-steps`, the evaluation episode limit. +`WIDOWX_RESUME=none` requires a new/empty checkpoint directory. An explicit +checkpoint path is also accepted; use a new output directory when branching. + +New v3 checkpoints restore the next actually consumed data window, discarding +stale prefetched batches. Exact sample-order continuity currently requires the +same data/cache contract, GPU count, seed, one worker/rank and one packed +sample/rank. It is not a promise of bitwise-identical GPU arithmetic. Old v2 +checkpoints do not contain this cursor and cannot retroactively recover it. + +Changing GPU count is rejected by default. To deliberately re-shard data, set +`WIDOWX_ALLOW_DATA_RESHARD=1`; this begins the next shuffled data epoch instead +of pretending to preserve exact sample order. `WIDOWX_ALLOW_LEGACY_RESUME=1` +is an explicit compatibility escape hatch for old/data-changed checkpoints; +it is NOT the recommended migration for the corrected full-data recipe. +Restart this corrected experiment in a new directory from released Stage-2. + +## Manual checkpoint deletion + +Nothing is pruned automatically. Check sizes/free space first: + +```bash +df -h /home/gpu4/tianyi/Zeva +ls -lh /home/gpu4/tianyi/Zeva/.artifacts/ipec_full/checkpoints/ +ls -lh /home/gpu4/tianyi/Zeva/.artifacts/ipec_full_v2/checkpoints/ +``` + +Example: explicitly select and interactively confirm deletion of ONLY an old +2,000-step checkpoint (do not run this unless you want to delete that file): + +```bash +rm -i -- /home/gpu4/tianyi/Zeva/.artifacts/ipec_full/checkpoints/step_000002000.pt +``` + +Keep the latest checkpoint, any checkpoint currently being loaded/evaluated, +and your comparison baselines. Copy to another disk before deletion if recovery +may be needed; `rm` does not use a trash bin. These deltas also depend on the +released base model: do not delete `/home/gpu4/tianyi/zeva-release/weights/stage2`. +Stopping a trainer does not force a final save; unsaved progress may be lost. + +## Frozen behavior memory + +This change does not claim to adapt the release's five-task RoboCasa memory +bank to Bridge. CTE/retrieval are frozen and precomputed; changing +`requires_grad` alone cannot train them. A proper adaptation trains the Stage-1 +CTE on Bridge, rebuilds a Bridge effect bank, adapts Stage-3 retrieval, then +rebuilds features and trains Stage-2. An ablation can measure whether the current +bank helps or harms. Making horizon 32 smaller does not fix memory-domain +mismatch, and changes to that horizon must also update behavior-PBD heads and +checkpoint shapes. Keep horizon 32 and use masked tail windows for now. + +## External-bank ablation + +`--memory-mode bank_off` does not load the external task-context bank or retrieval +head, and supplies zero global context. It keeps the CTE, within-episode phase +and effect history, and all policy weights (including learned injection biases). +The default `on` is unchanged. The client checks the server's memory-mode +metadata before running any episode. This is an inference-only ablation, not +training without memory or disabling every Zeva component. + +Run a matched bank-off/on comparison, each with 20 episodes, 30 denoising steps, +150 control steps and guidance 3, after checking GPU availability: + +```bash +WIDOWX_EVAL_GPU=6 WIDOWX_RENDER_GPU=2 OMP_NUM_THREADS=2 \ + /home/gpu4/tianyi/cosmos-framework/.venv/bin/python scripts/run_widowx_memory_ablation.py \ + --checkpoint /home/gpu4/tianyi/Zeva/.artifacts/ipec_full/checkpoints/step_000290000.pt \ + --output /home/gpu4/tianyi/Zeva/.artifacts/CHOOSE_NEW_ABLATION_DIRECTORY \ + --episodes 20 --exec-horizon 16 --port 18825 +``` + +The execution horizon is independent of the 32-action prediction horizon and +the 30-step denoising count. At 5 Hz, executing 16 actions means replanning every +3.2 seconds (four actions: 0.8 seconds). History still records all executed +controls at four-control CTE boundaries. Each mode saves videos and JSON traces +under its own `eval/`; `comparison.json` appears only after BOTH modes finish. +The controller validates checkpoint, seeds and protocol before accepting reports. +`--after /absolute/path/to/previous/comparison.json` queues a comparison without +loading a model until the preceding comparison has completed successfully. + +The 2026-09-24 runs are `.artifacts/ipec_memory_ablation_290000_20260924` (four +actions) and `.artifacts/ipec_memory_ablation_290000_h16_20260924` (16 actions, +queued after the first). The latter runs in tmux `Zeva:memory_eval16`, with +`launcher.log` in its output directory. These evaluate the old 290k baseline; +the corrected full-data pipeline is still preparing its feature cache. + +See [Bridge memory audit and implementation plan](../docs/bridge_memory_plan.md) +for the actual released bank contents, missing training/export components, +data-label requirements, and disk-space estimates. No Bridge bank has been built +or substituted as part of this diagnostic evaluation. + +CPU regressions: + +```bash +PYTHONPATH=$PWD:/home/gpu4/tianyi/cosmos-framework CUDA_VISIBLE_DEVICES='' \ + /home/gpu4/tianyi/cosmos-framework/.venv/bin/python -m unittest \ + scripts.test_widowx_full scripts.test_fp32_master_adamw scripts.test_wandb_fallback \ + scripts.test_widowx_memory -v +``` + +The actual rollout loop also has CPU-only fake-environment tests for horizons +3/4/16/32, all 150 control steps, partial final chunks, history and mode checks. +Run these with the installed SimplerEnv dependencies (no GPU context is created): + +```bash +PYTHONPATH=$PWD:/opt/benchmarks/SimplerEnv CUDA_VISIBLE_DEVICES='' \ + /home/gpu4/miniconda3/envs/simpler_env/bin/python -m unittest \ + scripts.test_widowx_execution -v +``` diff --git a/releases/bridge-native-v3/code/scripts/action_normalizer_legacy_v0.json b/releases/bridge-native-v3/code/scripts/action_normalizer_legacy_v0.json new file mode 100644 index 0000000000000000000000000000000000000000..16bb005661f20903f35c6848a800ea0ad2e87be9 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/action_normalizer_legacy_v0.json @@ -0,0 +1,18 @@ +{ + "id": "bridge_reached_delta_legacy_quantile_v0", + "kind": "per_dim_quantile_clip", + "source": "cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py", + "fitted_on_current_train_split": false, + "q01": [-0.028752606511116028, -0.041702210046350954, -0.026096698231995105, -0.08052822157740593, -0.09249736212193965, -0.20738411962985992], + "q99": [0.02830690816044803, 0.04089860741049051, 0.04018005654215808, 0.08173405691981314, 0.07760896608233431, 0.20384809583425495], + "clip_range": [-1.0, 1.0], + "gripper": { + "raw_closed": 0.0, + "raw_open": 1.0, + "threshold": 0.5, + "normalized_closed": -1.0, + "normalized_open": 1.0, + "source_label_note": "The parquet action gripper is binary; runtime maps positive SimplerEnv open command to 1 before CTE normalization. Semantic calibration in the simulator is separately audited." + }, + "notes": "These are legacy source-code constants; no claim is made that they were fitted exclusively on the current training split. Clipping is lossy, so denormalization is a decoder rule rather than an exact inverse." +} diff --git a/releases/bridge-native-v3/code/scripts/audit_ipec_base_delta_v2.py b/releases/bridge-native-v3/code/scripts/audit_ipec_base_delta_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..b3a91f79994ed43d47297d70c26a01a64d932aa8 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/audit_ipec_base_delta_v2.py @@ -0,0 +1,104 @@ +"""Read-only selective reconstruction of actual ipec_full Stage-2 checkpoints. + +Only 44 selected parameters are loaded from the 91-GB release DCP base. +No full model, GPU allocation, optimizer restore, or checkpoint mutation occurs. +""" +from __future__ import annotations + +import json +from pathlib import Path + +import torch +from torch.distributed.checkpoint import FileSystemReader, load + +from scripts.bridge_recovery_contract import sha256_file + + +BASE = Path('/home/gpu4/tianyi/zeva-release/weights/stage2') +OUTPUT = Path('.artifacts/bridge_zeva_recovery_v2/ipec_base_delta_audit.json') +CANDIDATES = ( + Path('.artifacts/ipec_full/checkpoints/step_000014000.pt'), + Path('.artifacts/ipec_full/checkpoints/step_000020000.pt'), + Path('.artifacts/ipec_full_v2/checkpoints/step_000020000.pt'), +) + + +def main(): + metadata = FileSystemReader(str(BASE / 'model')).read_metadata() + payloads = {} + for path in CANDIDATES: + if path.is_file(): + payloads[str(path)] = torch.load(path, map_location='cpu', weights_only=False) + if not payloads: + raise FileNotFoundError('No ipec_full delta checkpoints are present') + names = set().union(*(set(payload['model']) for payload in payloads.values())) + absent = sorted(names - set(metadata.state_dict_metadata)) + if absent: + raise ValueError(f'Selected delta names missing in release base: {absent}') + base = {} + for name in sorted(names): + entry = metadata.state_dict_metadata[name] + base[name] = torch.empty(tuple(entry.size), dtype=entry.properties.dtype) + # DCP's planner reads only requested keys, not all 1,696 base tensors. + load(base, checkpoint_id=str(BASE / 'model')) + + result = dict(base_path=str(BASE.resolve()), base_metadata_sha256=sha256_file(BASE / 'model/.metadata'), + base_total_keys=len(metadata.state_dict_metadata), selected_key_count=len(names), + base_model_files=[dict(path=str(path), bytes=path.stat().st_size) + for path in sorted((BASE / 'model').glob('*.distcp'))], + reconstruction_rule='base DCP loaded first; saved selected tensors are full replacement values (copy_), never added', + checkpoints={}) + for path, payload in payloads.items(): + if Path(payload['base']).resolve() != BASE.resolve(): + raise ValueError(f'Base checkpoint path mismatch: {path}') + details = [] + changed = 0 + for name, tensor in sorted(payload['model'].items()): + source = base[name] + if tuple(tensor.shape) != tuple(source.shape): + raise ValueError(f'Shape mismatch for {path}: {name}') + # This simulates the exact selected-key copy performed by the + # current server, without instantiating the 8B full model. + restored = source.clone() + restored.copy_(tensor.to(dtype=source.dtype)) + if not torch.equal(restored, tensor.to(dtype=source.dtype)): + raise AssertionError(f'Replacement reconstruction failed: {name}') + difference = tensor.float() - source.float() + different = bool(torch.any(difference != 0)) + changed += different + details.append(dict(name=name, shape=list(tensor.shape), numel=tensor.numel(), + saved_dtype=str(tensor.dtype), base_dtype=str(source.dtype), + changed_from_base=different, + mean_abs_change=float(difference.abs().mean()), + max_abs_change=float(difference.abs().max()))) + result['checkpoints'][path] = dict(format=payload.get('format'), iteration=payload.get('iteration'), + sha256=sha256_file(path), bytes=Path(path).stat().st_size, + base=payload['base'], selected_tensors=len(details), + selected_numel=sum(item['numel'] for item in details), + changed_selected_tensors=changed, + has_optimizer=bool(payload.get('optimizer')), + has_scheduler=bool(payload.get('scheduler')), + has_scaler=payload.get('grad_scaler') is not None, + rng_ranks=len(payload.get('rng', [])), + has_data_contract=payload.get('data_contract') is not None, + has_data_cursors=payload.get('data_cursors') is not None, + data_contract=payload.get('data_contract'), parameters=details) + v2_manifest = Path('/home/gpu4/tianyi/TTTVLA/datasets/bridge_orig_1.0.0_lerobot_zeva_features_v2/manifest.json') + if v2_manifest.is_file(): + feature = json.loads(v2_manifest.read_text()) + contract = feature['contract'] + result['known_feature_source_v2'] = dict(manifest_sha256=sha256_file(v2_manifest), + fingerprint=feature['fingerprint'], + cte=contract.get('cte'), + cte_frame_encoding=contract.get('cte_frame_encoding'), + bank=contract.get('bank'), + retrieval=contract.get('retrieval')) + old_manifest = Path('.artifacts/ipec_full/features/manifest.json') + result['old_ipec_full_feature_manifest_present'] = old_manifest.is_file() + OUTPUT.parent.mkdir(parents=True, exist_ok=True) + OUTPUT.write_text(json.dumps(result, indent=2, allow_nan=False) + '\n') + print(f'AUDITED selected={len(names)} base_keys={len(metadata.state_dict_metadata)} output={OUTPUT}', flush=True) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/audit_widowx_data_contract.py b/releases/bridge-native-v3/code/scripts/audit_widowx_data_contract.py new file mode 100644 index 0000000000000000000000000000000000000000..a970f9a8aa80b03f39b0e005e7eae4a0078f267c --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/audit_widowx_data_contract.py @@ -0,0 +1,133 @@ +"""Read-only, CPU audit of the current full-window WidowX data contract.""" +import argparse +from collections import Counter +from concurrent.futures import ThreadPoolExecutor +import json +from pathlib import Path + +import numpy as np +import pyarrow.parquet as pq + + +def audit(root, workers): + info = json.loads((root / 'meta/info.json').read_text()) + episodes = [json.loads(line) for line in (root / 'meta/episodes.jsonl').open()] + tasks = {row['task_index']: row['task'] for row in map(json.loads, (root / 'meta/tasks.jsonl').open())} + counts = Counter() + starts_histogram = Counter() + task_windows = Counter() + lag_sum = {lag: np.zeros(6, np.float64) for lag in (-2, -1, 0, 1, 2)} + lag_count = Counter() + per_offset_closed = np.zeros(32, np.int64) + target_tasks = { + task: {'episodes': 0, 'retained_episodes': 0, 'windows': 0, + 'closed_proprio_windows': 0, 'starts': Counter(), + 'closed_per_offset': np.zeros(32, np.int64)} + for task in ('put carrot on plate', 'take carrot off plate') + } + q01 = np.array([-0.028752606511116028, -0.041702210046350954, -0.026096698231995105, + -0.08052822157740593, -0.09249736212193965, -0.20738411962985992]) + q99 = np.array([0.02830690816044803, 0.04089860741049051, 0.04018005654215808, + 0.08173405691981314, 0.07760896608233431, 0.20384809583425495]) + clipped = np.zeros(6, np.int64) + invalid = [] + + def read(ep): + idx = ep['episode_index'] + path = root / info['data_path'].format(episode_chunk=idx // info['chunks_size'], episode_index=idx) + rows = pq.read_table(path, columns=['observation.state', 'action', 'task_index'], use_threads=False).to_pydict() + return ep, np.asarray(rows['observation.state']), np.asarray(rows['action']), np.asarray(rows['task_index']) + + with ThreadPoolExecutor(max_workers=workers) as pool: + def bounded_rows(): + for offset in range(0, len(episodes), workers * 16): + yield from pool.map(read, episodes[offset:offset + workers * 16]) + + for number, (ep, state, action, task_ids) in enumerate(bounded_rows(), 1): + idx, length = ep['episode_index'], ep['length'] + if len(action) != length or state.shape != (length, 8) or action.shape != (length, 7): + invalid.append({'episode': idx, 'reason': 'shape_or_length'}) + continue + if not np.isfinite(state).all() or not np.isfinite(action).all(): + invalid.append({'episode': idx, 'reason': 'nonfinite'}) + continue + starts = np.arange(0, max(0, length - 32), 4) + closed = action[:, 6] <= .5 + empty = np.array([not tasks[int(t)].strip() for t in task_ids]) + task_name = tasks[int(task_ids[0])] + if task_name in target_tasks: + target = target_tasks[task_name] + target['episodes'] += 1 + target['retained_episodes'] += int(len(starts) > 0) + target['windows'] += len(starts) + target['closed_proprio_windows'] += int((state[starts, 7] <= .5).sum()) + target['starts'].update(map(int, starts)) + for start in starts: + target['closed_per_offset'] += closed[start:start + 32] + counts['episodes'] += 1 + counts['frames'] += length + counts['closed_action_frames'] += int(closed.sum()) + counts['empty_instruction_frames'] += int(empty.sum()) + counts['episodes_with_empty_instruction'] += int(empty.any()) + counts['episodes_with_multiple_task_ids'] += int(len(set(task_ids.tolist())) > 1) + counts['nonbinary_gripper_action_frames'] += int(((action[:, 6] != 0) & (action[:, 6] != 1)).sum()) + counts['nonzero_state_pad_frames'] += int((state[:, 6] != 0).sum()) + clipped += ((action[:, :6] < q01) | (action[:, :6] > q99)).sum(0) + if len(starts): + counts['retained_episodes'] += 1 + counts['windows'] += len(starts) + counts['empty_instruction_windows'] += int(empty[starts].sum()) + counts['closed_proprio_windows'] += int((state[starts, 7] <= .5).sum()) + counts['windows_at_or_after_halfway'] += int((starts >= (length - 1) / 2).sum()) + counts['windows_with_completed_effect_history'] += int((starts >= 16).sum()) + counts['windows_with_full_four_effect_history'] += int((starts >= 64).sum()) + starts_histogram.update(map(int, starts)) + task_windows.update(tasks[int(task_ids[s])] for s in starts) + for s in starts: + per_offset_closed += closed[s:s + 32] + first4_ids = (starts[:, None] + np.arange(4)).ravel() + counts['first4_closed_action_presentations'] += int(closed[first4_ids].sum()) + counts['first4_action_presentations'] += len(first4_ids) + covered_end = int(starts[-1]) + 32 + counts['unique_action_frames_supervised'] += covered_end + counts['first4_unique_action_frames'] += len(first4_ids) + if 'carrot' in tasks[int(task_ids[0])].lower() and 'plate' in tasks[int(task_ids[0])].lower(): + counts['carrot_plate_retained_episodes'] += 1 + counts['carrot_plate_windows'] += len(starts) + if 'carrot' in tasks[int(task_ids[0])].lower() and 'plate' in tasks[int(task_ids[0])].lower(): + counts['carrot_plate_all_episodes'] += 1 + delta = np.diff(state[:, :6], axis=0) + for lag in lag_sum: + t = np.arange(len(delta)) + valid = (t + lag >= 0) & (t + lag < length) + error = np.abs(action[t[valid] + lag, :6] - delta[t[valid]]) + lag_sum[lag] += error.sum(0) + lag_count[lag] += len(error) + if number % 5000 == 0: + print(json.dumps({'scanned_episodes': number, 'total': len(episodes)}), flush=True) + for target in target_tasks.values(): + target['starts'] = dict(sorted(target['starts'].items())) + target['closed_action_fraction_by_prediction_offset'] = ( + target.pop('closed_per_offset') / max(1, target['windows']) + ).tolist() + return dict( + root=str(root), scope='all_episode_parquets_no_video_decode', counts=dict(counts), + starts_histogram=dict(sorted(starts_histogram.items())), + closed_action_fraction_by_prediction_offset=(per_offset_closed / counts['windows']).tolist(), + action_clipped_fraction_by_dim=(clipped / counts['frames']).tolist(), + action_vs_state_delta_mae_by_action_lag={str(k): (v / lag_count[k]).tolist() for k, v in lag_sum.items()}, + target_tasks=target_tasks, + largest_window_tasks=task_windows.most_common(20), invalid=invalid, + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--root', type=Path, required=True) + parser.add_argument('--output', type=Path, required=True) + parser.add_argument('--workers', type=int, default=4) + args = parser.parse_args() + report = audit(args.root, args.workers) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(report, indent=2, ensure_ascii=False)) + print(json.dumps(report, indent=2, ensure_ascii=False), flush=True) diff --git a/releases/bridge-native-v3/code/scripts/audit_widowx_env_contract.py b/releases/bridge-native-v3/code/scripts/audit_widowx_env_contract.py new file mode 100644 index 0000000000000000000000000000000000000000..34bc0178988aff98233170fbe0d1fb08fedcfb8e --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/audit_widowx_env_contract.py @@ -0,0 +1,56 @@ +"""Bounded environment contract checks; positive control is NOT policy success. + +No model, training checkpoint or existing process is modified. Tests gripper +signs and the success predicate separately. Dataset replay is not a success +oracle because the real demonstration and simulator layouts differ. +""" +import argparse +import json +from pathlib import Path + +import numpy as np +import simpler_env +from sapien.core import Pose + + +def check(seed): + env = simpler_env.make('widowx_carrot_on_plate') + try: + env.reset(seed=seed) + u = env.unwrapped + result = {'seed':seed, 'initial_success':bool(u.evaluate()['success'])} + for grip, name in ((-1.,'closed'), (1.,'open')): + for _ in range(5): + env.step(np.array([0,0,0,0,0,0,grip],np.float32)) + result[name+'_closedness'] = float(u.agent.get_gripper_closedness()) + result['gripper_sign_ok'] = result['closed_closedness'] > result['open_closedness']+0.5 + # Place the source manually on the plate to test the predicate and + # contact plumbing, not the policy or an oracle trajectory. + src,tgt = u.episode_source_obj,u.episode_target_obj + result['positive_control'] = [] + for dz in (0.025,0.04,0.06): + src.set_pose(Pose(np.asarray(tgt.pose.p)+[0,0,dz],src.pose.q)) + src.set_velocity(np.zeros(3)); src.set_angular_velocity(np.zeros(3)) + seen = False + for _ in range(5): + _,_,terminated,truncated,info = env.step(np.array([0,0,0,0,0,0,1],np.float32)) + seen |= bool(info['success']) + if terminated or truncated: + break + result['positive_control'].append({'dz':dz,'success':seen}) + if seen: + break + result['success_predicate_positive_control'] = any(x['success'] for x in result['positive_control']) + return result + finally: + env.close() + + +if __name__ == '__main__': + p=argparse.ArgumentParser() + p.add_argument('--output',type=Path,required=True) + args=p.parse_args() + report={'is_policy_evaluation':False,'checks':[check(seed) for seed in range(3)]} + args.output.parent.mkdir(parents=True,exist_ok=True) + args.output.write_text(json.dumps(report,indent=2)) + print(json.dumps(report,indent=2),flush=True) diff --git a/releases/bridge-native-v3/code/scripts/audit_widowx_overfit.py b/releases/bridge-native-v3/code/scripts/audit_widowx_overfit.py new file mode 100644 index 0000000000000000000000000000000000000000..4b710366d923a5ed0dda6d5d9b6f206fbbdff6b6 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/audit_widowx_overfit.py @@ -0,0 +1,177 @@ +"""Isolated, bounded single-window optimizer ablation; never writes main checkpoints. + +Both branches reload the same delta and start fresh Adam states. This is a +memorization/precision diagnostic, not a resume of the production optimizer or +a held-out policy benchmark. FP32 masters are explicit copies of selected +parameters; forward/backward remain BF16 in both branches. +""" +import argparse +import copy +import dataclasses +import inspect +import json +import os +from pathlib import Path + +import numpy as np +import torch + +ROOT = Path(__file__).resolve().parents[1] + + +def local(tensor): + return tensor.to_local() if hasattr(tensor, "to_local") else tensor + + +def main(args): + from scripts.widowx_policy_server import WidowXService + from cosmos_framework.scripts.action_policy_server_robocasa365_zeva import ( + RobolabServerArgs, _build_data_batch_from_sample, + ) + from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import WidowXBridgeV3Dataset + from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline + import cosmos_framework.model.generator.omni_mot_model as model_module + + torch.set_num_threads(2) + args.output = args.output.resolve() + args.checkpoint = args.checkpoint.resolve() + # Read before model initialization, since production retention may prune + # rotating checkpoints. Prefer an immutable audit snapshot at invocation. + payload = torch.load(args.checkpoint, map_location='cpu', weights_only=False) + args.output.mkdir(parents=True, exist_ok=False) + release = Path('/home/gpu4/tianyi/zeva-release/weights') + os.chdir('/home/gpu4/tianyi/cosmos-framework') + original_loss = model_module.compute_flow_matching_loss + if 'sample_weights' not in inspect.signature(original_loss).parameters: + def compat(*a, sample_weights=None, **kw): + if sample_weights is not None: + raise ValueError('sample weights unsupported by installed helper') + return original_loss(*a, **kw) + model_module.compute_flow_matching_loss = compat + service = WidowXService(RobolabServerArgs( + checkpoint_path=str(release/'stage2'), allow_dcp_checkpoint=True, + output_dir=args.output/'model_logs', + experiment='action_policy_robocasa365_atomic5_zeva', + experiment_overrides=[ + 'model.config.tokenizer.vae_path='+os.environ['WAN_VAE_PATH'], + 'model.config.vlm_config.tokenizer.pretrained_model_name='+os.environ['QWEN_VLM_PATH'], + 'model.config.compile.enabled=False', + ], + task_context_bank=release/'stage1/train_memory_effect_v3.pt', + cte_checkpoint=release/'stage1/zeva_cte.pt', + static_task_context_checkpoint=release/'stage3/best.pt', + domain_name='bridge_orig_lerobot', resolution='256', + image_height=256, image_width=256, conditioning_fps=5, action_dim=7, use_state=False)) + model = service.model + named = dict(model.named_parameters()) + model.requires_grad_(False) + selected = {name: named[name] for name in payload['model']} + with torch.no_grad(): + for name, p in selected.items(): + local(p).copy_(payload['model'][name]) + p.requires_grad_(True) + ds = WidowXBridgeV3Dataset('/opt/zhangchenyu/datasets/bridge_orig_lerobot_smoke', + feature_cache=str(ROOT/'.artifacts/widowx/features')) + raw = ds[ds.windows.index((306, 0))] + transform = ActionTransformPipeline(tokenizer_config=model.config.vlm_config.tokenizer, + cfg_dropout_rate=0.0, max_action_dim=64, + format_prompt_as_json=True) + transformed = transform(copy.deepcopy(raw), '256') + if isinstance(transformed['ai_caption'], dict): + transformed['ai_caption'] = json.dumps(transformed['ai_caption']) + request = {'prompt': raw['ai_caption'], 'observation/image': ds._frames[306][0], + 'observation/proprio': raw['proprio'].numpy(), + 'cte_boundary_images': ds._frames[306][:1], + 'cte_transition_actions': np.empty((0,4,7), np.float32)} + target = raw['action'].numpy() + # Same LR groups, betas, weight decay and clip threshold as production. + master = {n: torch.nn.Parameter(local(p).detach().float().clone()) for n,p in selected.items()} if args.mode == 'fp32_master' else None + groups = [] + for name, p in selected.items(): + lr = 5e-5 if any(k in name for k in ('action2llm', 'llm2action', 'action_modality_embed')) else 1e-5 + groups.append({'params': [master[name] if master else p], 'lr': lr}) + opt = torch.optim.AdamW(groups, lr=1e-5, betas=(0.9, 0.99), eps=1e-8, weight_decay=0.05, fused=True) + metrics = [] + + def evaluate(step): + model.eval() + service.cfg = dataclasses.replace(service.cfg, num_steps=16, guidance=1.0) + for seed in (0, 1, 2): + prediction = np.asarray(service.infer(dict(request, inference_seed=seed))['action']) + err = np.abs(prediction-target) + item = dict(step=step, mode=args.mode, seed=seed, mae=float(err.mean()), + arm_mae=float(err[:,:6].mean()), gripper_mae=float(err[:,6].mean()), + gripper_accuracy=float(((prediction[:,6]>0)==(target[:,6]>0)).mean())) + metrics.append(item) + print('EVAL '+json.dumps(item), flush=True) + (args.output/'metrics.json').write_text(json.dumps(metrics, indent=2)) + + evaluate(0) + # Inference initialization globally disables autograd; restore it for the + # isolated training probe. Merely calling model.train() is not sufficient. + torch.set_grad_enabled(True) + torch.manual_seed(42) + torch.cuda.manual_seed_all(42) + with (args.output/'loss.jsonl').open('w') as log: + for step in range(1, args.steps+1): + model.train() + model.zero_grad(set_to_none=True) + opt.zero_grad(set_to_none=True) + batch = _build_data_batch_from_sample(copy.deepcopy(transformed)) + output, loss = model.training_step(batch, step) + if not torch.isfinite(loss): + raise RuntimeError('non-finite audit loss') + loss.backward() + norm_sq = sum(local(p.grad).float().square().sum() for p in selected.values() if p.grad is not None) + norm = norm_sq.sqrt() + clip = min(1.0, 1.0/(float(norm)+1e-6)) + for name,p in selected.items(): + if p.grad is not None: + p.grad.mul_(clip) + if master is not None: + master[name].grad = local(p.grad).detach().float() + before = {n:local(p).detach().clone() for n,p in selected.items()} if step == 1 else {} + opt.step() + if master is not None: + with torch.no_grad(): + for name,p in selected.items(): + local(p).copy_(master[name]) + item = dict(step=step, loss=float(loss.detach()), gradient_norm=float(norm)) + item.update({k:float(v.detach()) for k,v in output.items() + if isinstance(v,torch.Tensor) and v.numel()==1 and ('loss' in k or 'nll' in k)}) + log.write(json.dumps(item)+'\n'); log.flush() + if step == 1: + changes = [] + for name,p in selected.items(): + old, new, grad = before[name], local(p).detach(), local(p.grad) if p.grad is not None else None + if 'action2llm' in name or 'llm2action' in name: + old, new = old[7], new[7] + grad = grad[7] if grad is not None else None + active = grad != 0 if grad is not None else torch.zeros_like(old,dtype=torch.bool) + changes.append(dict(name=name, dtype=str(p.dtype), active_elements=int(active.sum()), + active_unchanged=float((old[active]==new[active]).float().mean()) if active.any() else None, + mean_change=float((old.float()-new.float()).abs().mean()))) + (args.output/'first_update.json').write_text(json.dumps(changes,indent=2)) + del before + if step == 1 or step % 25 == 0: + print('TRAIN '+json.dumps(item),flush=True) + del output, loss, batch + if step == args.steps: + evaluate(step) + # Diagnostic delta only; optimizer states are deliberately not advertised + # as resumable production states. + torch.save(dict(format='zeva_widowx_audit_delta', iteration=payload['iteration'], + audit_steps=args.steps, mode=args.mode, + model={n:local(p).detach().cpu() for n,p in selected.items()}), args.output/'delta.pt') + print('AUDIT_COMPLETE',args.output,flush=True) + if torch.distributed.is_initialized(): + torch.distributed.destroy_process_group() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--mode', choices=('bf16','fp32_master'),required=True) + parser.add_argument('--checkpoint',type=Path,required=True) + parser.add_argument('--output',type=Path,required=True) + parser.add_argument('--steps',type=int,default=300) + main(parser.parse_args()) diff --git a/releases/bridge-native-v3/code/scripts/audit_widowx_runtime.py b/releases/bridge-native-v3/code/scripts/audit_widowx_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..9723aff7ac17187d4a11f5a1fac469acbf6336c8 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/audit_widowx_runtime.py @@ -0,0 +1,126 @@ +"""Bounded, isolated diagnostics; never changes or restarts the training job.""" +import argparse +import dataclasses +import json +import os +from pathlib import Path +import subprocess +import time +import urllib.request + +ROOT = Path(__file__).resolve().parents[1] +COSMOS = Path('/home/gpu4/tianyi/cosmos-framework') +PYTHON = '/home/gpu4/tianyi/cosmos-framework/.venv/bin/python' +SIM = '/home/gpu4/miniconda3/envs/simpler_env/bin/python' + + +def closed_loop(args): + # Run foreground under this bounded parent; always reap our own server. + with (args.output / 'server.log').open('w') as log: + server = subprocess.Popen([PYTHON, str(ROOT/'scripts/widowx_policy_server.py'), + '--delta', str(args.checkpoint), '--port', str(args.port)], + stdout=log, stderr=subprocess.STDOUT, cwd=COSMOS) + try: + deadline = time.monotonic() + 240 + while True: + if server.poll() is not None: + raise RuntimeError(f'server exited {server.returncode}') + try: + with urllib.request.urlopen(f'http://127.0.0.1:{args.port}/healthz', timeout=2) as r: + if r.status == 200: + break + except OSError: + pass + if time.monotonic() >= deadline: + raise TimeoutError('server not ready') + time.sleep(2) + env = dict(os.environ, PYTHONPATH='/opt/benchmarks/SimplerEnv', + MS2_ASSET_DIR='/opt/benchmarks/SimplerEnv/ManiSkill2_real2sim/data', + VK_ICD_FILENAMES='/etc/vulkan/icd.d/nvidia_icd.json') + for convention in ('bridge_tool', 'legacy_tcp'): + destination = args.output / convention + destination.mkdir(exist_ok=True) + with (destination/'episodes.log').open('w') as elog: + subprocess.run([SIM, str(ROOT/'scripts/eval_widowx_simpler.py'), + '--port', str(args.port), '--checkpoint', str(args.checkpoint), + '--output', str(destination/'results.json'), '--episodes', '10', + '--proprio-convention', convention, + '--video-dir', str(destination/'videos'), + '--trace-dir', str(destination/'traces')], + env=env, stdout=elog, stderr=subprocess.STDOUT, check=True, timeout=600, + cwd=COSMOS) + report=json.loads((destination/'results.json').read_text()) + print(convention, report['success_rate'], flush=True) + finally: + server.terminate() + try: + server.wait(timeout=20) + except subprocess.TimeoutExpired: + server.kill() + server.wait() + + +def offline(args): + import numpy as np + import torch + from scripts.widowx_policy_server import WidowXService + from cosmos_framework.scripts.action_policy_server_robocasa365_zeva import RobolabServerArgs + from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import WidowXBridgeV3Dataset, normalize_actions + torch.set_num_threads(2) + release=Path('/home/gpu4/tianyi/zeva-release/weights') + os.chdir(COSMOS) + service=WidowXService(RobolabServerArgs( + checkpoint_path=str(release/'stage2'), allow_dcp_checkpoint=True, + experiment='action_policy_robocasa365_atomic5_zeva', + experiment_overrides=['model.config.tokenizer.vae_path='+os.environ['WAN_VAE_PATH'], + 'model.config.vlm_config.tokenizer.pretrained_model_name='+os.environ['QWEN_VLM_PATH']], + task_context_bank=release/'stage1/train_memory_effect_v3.pt', + cte_checkpoint=release/'stage1/zeva_cte.pt', static_task_context_checkpoint=release/'stage3/best.pt', + domain_name='bridge_orig_lerobot', image_height=256, image_width=256, + resolution='256', conditioning_fps=5, action_dim=7, use_state=False)) + dataset=WidowXBridgeV3Dataset('/opt/zhangchenyu/datasets/bridge_orig_lerobot_smoke', + feature_cache=str(ROOT/'.artifacts/widowx/features')) + indices=[0, dataset.windows.index((306,0)), len(dataset)-1, + next(i for i,(_,s) in enumerate(dataset.windows) if s>=16)] + named=dict(service.model.named_parameters()) + metrics=[] + for label, checkpoint in [('step2',ROOT/'.artifacts/widowx/checkpoints/step_000000002.pt'), + ('trained',args.checkpoint)]: + payload=torch.load(checkpoint,map_location='cpu',weights_only=False) + with torch.no_grad(): + for name,value in payload['model'].items(): + p=named[name]; (p.to_local() if hasattr(p,'to_local') else p).copy_(value) + for i in indices: + sample=dataset[i]; ep,start=dataset.windows[i] + frames=dataset._frames[ep]; rows=dataset._rows[ep] + request={'prompt':sample['ai_caption'], 'observation/image':frames[start], + 'observation/proprio':sample['proprio'].numpy(), + 'cte_boundary_images':frames[:start+1:4], + 'cte_transition_actions':normalize_actions(rows['action'][:start]).reshape(-1,4,7), + 'inference_seed':0} + for steps,guidance in ((4,3.0),(16,1.0)) if label=='trained' else ((4,3.0),): + service.cfg=dataclasses.replace(service.cfg,num_steps=steps,guidance=guidance) + result=service.infer(request) + prediction=np.asarray(result['action'],np.float32) + target=sample['action'].numpy() + error=np.abs(prediction-target) + item=dict(checkpoint=label,iteration=payload['iteration'],episode=ep,start=start, + steps=steps,guidance=guidance,mae=float(error.mean()), + first4_mae=float(error[:4].mean()),per_dim_mae=error.mean(0).tolist(), + gripper_accuracy=float(np.mean((prediction[:,6]>0)==(target[:,6]>0))), + out_of_range_fraction=float(np.mean(np.abs(prediction)>1))) + metrics.append(item) + np.savez(args.output/f'{label}_ep{ep}_start{start}_steps{steps}.npz', + prediction=prediction,target=target,proprio=sample['proprio'].numpy()) + print(json.dumps(item),flush=True) + (args.output/'metrics.json').write_text(json.dumps(metrics,indent=2)) + + +if __name__=='__main__': + parser=argparse.ArgumentParser() + parser.add_argument('--mode',choices=('closed_loop','offline'),required=True) + parser.add_argument('--checkpoint',type=Path,required=True) + parser.add_argument('--output',type=Path,required=True) + parser.add_argument('--port',type=int,default=18766) + args=parser.parse_args(); args.output.mkdir(parents=True,exist_ok=True) + globals()[args.mode](args) diff --git a/releases/bridge-native-v3/code/scripts/bridge_cte_data.py b/releases/bridge-native-v3/code/scripts/bridge_cte_data.py new file mode 100644 index 0000000000000000000000000000000000000000..5cfaeb873e9c20eea8272103e043c73a0eda87b6 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_cte_data.py @@ -0,0 +1,178 @@ +"""Whole-episode, strictly causal Bridge data for standalone CTE Stage 1.""" +from __future__ import annotations + +import json +import math +import re +from collections import defaultdict +from pathlib import Path + +import av +import numpy as np +import pyarrow.parquet as pq +import torch +from torch.utils.data import Dataset, Sampler + +from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import normalize_actions + + +def canonical_instruction(text: str) -> str: + # Conservative equality only: do NOT merge directions, objects, or synonyms. + return re.sub(r"\s+", " ", text.strip().lower()).rstrip(" .") + + +def load_metadata(root: str | Path, seed: int = 42, val_fraction: float = 0.02): + root = Path(root) + info = json.loads((root / "meta/info.json").read_text()) + episodes = [json.loads(line) for line in (root / "meta/episodes.jsonl").read_text().splitlines()] + tasks = [json.loads(line) for line in (root / "meta/tasks.jsonl").read_text().splitlines()] + if info["robot_type"] != "widowx" or info["fps"] != 5: + raise ValueError("This contract requires WidowX Bridge at 5 Hz") + if info["features"]["action"]["shape"] != [7]: + raise ValueError("Expected seven-dimensional Bridge actions") + if len({e["episode_index"] for e in episodes}) != len(episodes): + raise ValueError("Duplicate episode IDs") + if any(e["length"] < 1 for e in episodes): + raise ValueError("Empty episode") + known = sorted({canonical_instruction(t["task"]) for t in tasks} - {""}) + labels = {text: index for index, text in enumerate(known)} + for ep in episodes: + texts = {canonical_instruction(t) for t in ep["tasks"]} + # Ambiguous multi-instruction episodes do not receive a semantic label. + ep["semantic_id"] = labels.get(next(iter(texts)), -1) if len(texts) == 1 else -1 + order = np.random.default_rng(seed).permutation(len(episodes)) + nval = max(1, round(len(episodes) * val_fraction)) + if not 0 < nval < len(episodes): + raise ValueError("Need nonempty training and validation splits") + val_indices = set(order[:nval].tolist()) + train = [e for i, e in enumerate(episodes) if i not in val_indices] + val = [e for i, e in enumerate(episodes) if i in val_indices] + return info, train, val + + +class BridgeCTEDataset(Dataset): + def __init__(self, root, info, episodes): + self.root, self.info, self.episodes = Path(root), info, episodes + tasks = [json.loads(line) for line in (self.root / "meta/tasks.jsonl").read_text().splitlines()] + self.task_text = {int(t["task_index"]): canonical_instruction(t["task"]) for t in tasks} + + def __len__(self): + return len(self.episodes) + + def __getitem__(self, index): + ep = self.episodes[index] + eid, length = int(ep["episode_index"]), int(ep["length"]) + fmt = dict(episode_index=eid, episode_chunk=eid // self.info.get("chunks_size", 1000), + video_key="observation.images.image_0") + table = pq.read_table(self.root / self.info["data_path"].format(**fmt), + columns=["action", "frame_index", "episode_index", "task_index"]) + actions = np.asarray(table["action"].to_pylist(), dtype=np.float32) + if actions.shape != (length, 7) or not np.isfinite(actions).all(): + raise ValueError(f"Invalid actions in episode {eid}") + if not np.array_equal(table["frame_index"].to_numpy(), np.arange(length)): + raise ValueError(f"Nonconsecutive frame indices in episode {eid}") + if not (table["episode_index"].to_numpy() == eid).all(): + raise ValueError(f"Episode metadata mismatch: {eid}") + row_tasks = {self.task_text[int(t)] for t in np.unique(table["task_index"].to_numpy())} + if row_tasks != {canonical_instruction(t) for t in ep["tasks"]}: + raise ValueError(f"Instruction metadata mismatch: {eid}") + if ((actions[:, 6] < 0) | (actions[:, 6] > 1)).any(): + raise ValueError(f"Gripper is not in the expected [0,1] convention: {eid}") + frames = [] + count = 0 + with av.open(str(self.root / self.info["video_path"].format(**fmt))) as container: + container.streams.video[0].thread_count = 1 + for i, frame in enumerate(container.decode(video=0)): + count += 1 + if i % 4 == 0: + image = frame.to_ndarray(format="rgb24") + if image.shape != (256, 256, 3): + raise ValueError(f"Unexpected image shape: {eid} {image.shape}") + frames.append(image) + if count != length: + raise ValueError(f"Video/action alignment mismatch: {eid} {count} != {length}") + # Boundary b+1 is observed only after actions [4b:4b+4]. No terminal + # action or incomplete final group is an observed visual transition. + ntransitions = len(frames) - 1 + actions = normalize_actions(actions[:4 * ntransitions]).reshape(ntransitions, 4, 7) + return dict(frames=torch.from_numpy(np.stack(frames)).permute(0, 3, 1, 2).contiguous(), + actions=torch.from_numpy(actions), episode_id=eid, semantic_id=ep["semantic_id"]) + + +def collate_episodes(samples): + # Padding to >=5 keeps all effect heads in the graph, including short + # episodes. Masks, not padding values, decide which losses are supervised. + steps = max(5, max(len(s["frames"]) for s in samples)) + batch = len(samples) + valid = torch.zeros(batch, steps, dtype=torch.bool) + actions = torch.zeros(batch, steps - 1, 4, 7) + transition_valid = torch.zeros(batch, steps - 1, 4, dtype=torch.bool) + for i, sample in enumerate(samples): + count = len(sample["frames"]) + valid[i, :count] = True + actions[i, :count-1] = sample["actions"] + transition_valid[i, :count-1] = True + return dict(frames=torch.cat([s["frames"] for s in samples]), valid=valid, + actions=actions, transition_valid=transition_valid, + episode_ids=torch.tensor([s["episode_id"] for s in samples]), + semantic_ids=torch.tensor([s["semantic_id"] for s in samples])) + + +class PairedEpisodeSampler(Sampler): + """One exhaustive shuffled anchor pass plus a same-task partner per anchor. + + No episode is dropped or length-truncated. Unknown/singleton anchors get a + random extra episode, NOT a fake same-task positive. The loss also excludes + duplicate episode IDs. Epoch/cursor reconstruction is independent of loader + prefetch, so restarting at a saved consumed-batch cursor is exact. + """ + def __init__(self, episodes, batch_size, world_size=1, rank=0, seed=42, epoch=0, start_batch=0): + if batch_size < 2 or batch_size % 2: + raise ValueError("Per-rank batch size must be positive and even") + self.episodes = episodes + self.batch_size, self.world_size, self.rank = batch_size, world_size, rank + self.seed, self.epoch, self.start_batch = seed, epoch, start_batch + self.anchors_per_batch = batch_size * world_size // 2 + self.total_batches = math.ceil(len(episodes) / self.anchors_per_batch) + self.groups = defaultdict(list) + for i, ep in enumerate(episodes): + if ep["semantic_id"] >= 0: + self.groups[ep["semantic_id"]].append(i) + + def __len__(self): + return self.total_batches - self.start_batch + + def __iter__(self): + rng = np.random.default_rng(self.seed + self.epoch) + anchors = rng.permutation(len(self.episodes)) + anchors = np.resize(anchors, self.total_batches * self.anchors_per_batch) + pairs = [] + for anchor in anchors: + candidates = self.groups.get(self.episodes[anchor]["semantic_id"], []) + if len(candidates) > 1: + partner = anchor + while partner == anchor: + partner = candidates[int(rng.integers(len(candidates)))] + else: + partner = int(rng.integers(len(self.episodes))) + pairs.extend((int(anchor), int(partner))) + array = np.asarray(pairs).reshape(self.total_batches, self.world_size, self.batch_size) + for b in range(self.start_batch, self.total_batches): + yield array[b, self.rank].tolist() + + +class ValidationSampler(Sampler): + """Deterministic paired validation; includes all held-out anchors. + + Partners are also exclusively held out. The small last-batch wrap is + explicit in metadata; validation metrics are sampled-batch diagnostics, + not claimed to be a uniformly weighted dataset score. + """ + def __init__(self, episodes, batch_size, world_size, rank, seed): + self.inner = PairedEpisodeSampler(episodes, batch_size, world_size, rank, seed) + + def __len__(self): + return len(self.inner) + + def __iter__(self): + return iter(self.inner) diff --git a/releases/bridge-native-v3/code/scripts/bridge_cte_loss.py b/releases/bridge-native-v3/code/scripts/bridge_cte_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..c09cb6f3651d9782cde141f0d73858066969d92c --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_cte_loss.py @@ -0,0 +1,67 @@ +"""Bridge semantic masking + cross-rank task loss around release effect-v3.""" +from __future__ import annotations + +import torch +import torch.distributed as dist +from torch.nn import functional as F + +from cosmos_framework.model.zeva.cte_losses import CTELossConfig, causal_transition_encoder_loss + + +def gather(tensor, differentiable=False): + if not dist.is_initialized(): + return tensor + if differentiable and torch.is_grad_enabled(): + from torch.distributed.nn.functional import all_gather + return torch.cat(all_gather(tensor)) + result = [torch.empty_like(tensor) for _ in range(dist.get_world_size())] + dist.all_gather(result, tensor.contiguous()) + return torch.cat(result) + + +def task_loss(retrieval, valid, semantic_ids, episode_ids, temperature=0.1): + weights = valid.unsqueeze(-1).float() + z = F.normalize((retrieval.float() * weights).sum(1) / weights.sum(1).clamp_min(1), dim=-1) + z = gather(z, differentiable=True) + ids, episodes = gather(semantic_ids), gather(episode_ids) + known = ids >= 0 + different = episodes[:, None] != episodes[None, :] + candidates = known[:, None] & known[None, :] & different + positives = candidates & ids[:, None].eq(ids[None, :]) + usable = positives.any(1) + if not usable.any(): + # Keep the gather in the autograd graph on every rank, even for an + # all-unknown batch; otherwise distributed backward can deadlock. + return z.sum() * 0, usable.sum().float(), known.sum().float() + logits = z @ z.T / temperature + logits = logits[usable].masked_fill(~candidates[usable], -torch.inf) + logp = logits - torch.logsumexp(logits, dim=1, keepdim=True) + positive = positives[usable] + loss = -(logp.masked_fill(~positive, 0).sum(1) / positive.sum(1)).mean() + return loss, usable.sum().float(), known.sum().float() + + +def bridge_cte_loss(outputs, actions, valid, semantic_ids, episode_ids, cfg=None): + cfg = cfg or CTELossConfig() + # All representation/loss arithmetic is FP32, even with a BF16 forward. + out = {k: v.float() if v.is_floating_point() else v for k, v in outputs.items()} + # Disable only the original unmasked local task objective. Keep the + # released effect-v3 objective unchanged (MSE remains diagnostic). + unique = torch.arange(actions.shape[0], device=actions.device) + result = causal_transition_encoder_loss(out, actions.float(), valid, unique, cfg) + task, positive_anchors, known = task_loss(out["retrieval"], valid, semantic_ids, episode_ids, cfg.temperature) + result["total"] = result["total"] + cfg.task_weight * task + result["loss_task"] = task + result["task_positive_anchors"] = positive_anchors + result["task_known_episodes"] = known + with torch.no_grad(): + mask = out["effect_complete"] + denom = mask.sum().clamp_min(1) + result["effect_zero_mse"] = (out["effect_delta_target"].square().mean(-1) * mask).sum() / denom + result["effect_post_mse"] = ((out["effect_outcome_post"] - out["effect_delta_target"]).square().mean(-1) * mask).sum() / denom + code = out["effect_post_raw"][mask] + result["effect_code_std"] = code.std(0, correction=0).mean() if len(code) > 1 else denom.float() * 0 + result["valid_transitions"] = out["transition_complete"].sum().float() + result["valid_effects"] = mask.sum().float() + result["real_boundaries"] = valid.sum().float() + return result diff --git a/releases/bridge-native-v3/code/scripts/bridge_handoff.py b/releases/bridge-native-v3/code/scripts/bridge_handoff.py new file mode 100644 index 0000000000000000000000000000000000000000..565bd226d1cbba9fe308a01353a776d0f4d72c6d --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_handoff.py @@ -0,0 +1,445 @@ +"""Build, verify and publish an explicit, immutable Bridge research handoff. + +No implicit uploads, no GPU allocation, no training and no checkpoint deletion. +The release records readiness honestly; memory validation is not a Stage2 gate. +""" +from __future__ import annotations + +import argparse +import hashlib +import json +from pathlib import Path, PurePosixPath +import re +import shutil +import subprocess +import sys + + +BASE_REPO = "nvidia/Cosmos3-Nano" +BASE_REVISION = "e59a53c25979a090fa8706c9acc0c254a6e89b92" +FRAMEWORK_REVISION = "ee58e41467f33c49ddde08b4d0ef4923876a95ac" +DATA_REPO = "IPEC-COMMUNITY/bridge_orig_lerobot" +DATA_REVISION = "0e9d76d07e9df3ea3eba257b2520d4913833fad2" +CTE_SOURCE_SHA256 = "5c94378ea87b875dd709d46cf7941cdb5ca33584df071fef254311c6bbab912e" +BANK_SHA256 = "bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb" +VAE_SHA256 = "20eb789667fa5e60e7516bf509512f6cb61f01b0aa0695eadaea930c13892b36" +RELEASE_PREFIX = "releases/bridge-native-v2" +FORMAT = "zeva_bridge_handoff_v1" +EXPORT_FORMAT = "bridge_cte_inference_export_v1" +MISSING_TRAINING_COMPONENTS = [ + "fixed-base HF tensor loader and pre-optimizer domain7 audit integration", + "native10 dataset, masking and WAM training integration", + "Bridge frozen-understanding readout retrieval head training", + "query-prefix causal cache and runtime shape trace integration", + "generation/action/ZeVA optimizer and frozen/domain-row monitoring", + "native10 policy server and measured reached7 environment acceptance", + "50/500-step gates, sharded resumable checkpoint and continuous launcher", +] + + +def sha256_file(path): + digest = hashlib.sha256() + with Path(path).open("rb") as stream: + for chunk in iter(lambda: stream.read(4 * 1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def canonical_sha(value): + return hashlib.sha256(json.dumps(value, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + + +def read_json(path): + return json.loads(Path(path).read_text()) + + +def write_json(path, value): + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("x") as stream: + json.dump(value, stream, ensure_ascii=False, indent=2) + stream.write("\n") + + +def safe_relative(name): + if not isinstance(name, str) or not name or "\\" in name or "\x00" in name: + raise ValueError("Expected a safe POSIX relative path") + path = PurePosixPath(name) + if path.is_absolute() or any(part in (".", "..", "") for part in name.split("/")): + raise ValueError(f"Unsafe artifact path: {name!r}") + return path + + +def checked_path(root, name): + path = Path(root) / safe_relative(name) + if not path.resolve().is_relative_to(Path(root).resolve()): + raise ValueError("Artifact escapes bundle root") + if any(part.is_symlink() for part in [path, *path.parents] if part != Path(root).parent): + raise ValueError("Symlinks are not allowed in release artifacts") + return path + + +def check_publishable_text(path): + value = Path(path).read_text() + # Scan values, not merely environment-variable names used by legitimate code. + patterns = [r"\bhf_[A-Za-z0-9]{20,}\b", r"\bsk-[A-Za-z0-9_-]{24,}\b", + r"-----BEGIN (?:RSA |OPENSSH |EC )?PRIVATE KEY-----", + r"(?im)^\s*(?:export\s+)?WANDB_API_KEY\s*=\s*[\"']?[a-f0-9]{40}\b"] + if any(re.search(pattern, value) for pattern in patterns): + raise ValueError(f"Possible credential in {Path(path).name}; refusing publication") + + +def tensor_manifest(state): + import torch + result = {} + for name, tensor in sorted(state.items()): + if not isinstance(tensor, torch.Tensor): + raise TypeError(f"Non-tensor CTE state entry: {name}") + value = tensor.detach().cpu().contiguous() + result[name] = dict(shape=list(value.shape), dtype=str(value.dtype), + sha256=hashlib.sha256(value.reshape(-1).view(torch.uint8).numpy().tobytes()).hexdigest()) + return result + + +def export_cte(source, destination, identity): + import torch + # Local, previously produced and hash-pinned source checkpoint is trusted. + if sha256_file(source) != CTE_SOURCE_SHA256 or identity["cte_checkpoint_sha256"] != CTE_SOURCE_SHA256: + raise ValueError("CTE is not the bank's pinned 30k source") + original = torch.load(source, map_location="cpu", weights_only=False) + if original["format"] != "bridge_cte_stage1_v1" or original["step"] != 30000: + raise ValueError("Not the selected Bridge CTE") + if original["model_config"] != identity["model_config"]: + # Stored checkpoint tuples and JSON lists are canonically equivalent. + if canonical_sha(original["model_config"]) != canonical_sha(identity["model_config"]): + raise ValueError("CTE model configuration differs from bank") + if canonical_sha(original["contract"]) != original["contract_fingerprint"]: + raise ValueError("CTE source contract fingerprint is invalid") + tensors = tensor_manifest(original["model"]) + payload = dict(format=EXPORT_FORMAT, source_checkpoint_sha256=CTE_SOURCE_SHA256, + source_contract_fingerprint=original["contract_fingerprint"], + source_step=30000, model_config=original["model_config"], + model=original["model"], model_tensor_manifest=tensors, + model_tensor_sha256=canonical_sha(tensors), inference_only=True) + destination = Path(destination) + destination.parent.mkdir(parents=True, exist_ok=True) + with destination.open("xb") as stream: + torch.save(payload, stream) + restored = torch.load(destination, map_location="cpu", weights_only=True) + if tensor_manifest(restored["model"]) != tensors: + raise AssertionError("CTE export changed model tensor values") + return dict(file="memory/cte_30000_inference.pt", source_checkpoint_sha256=CTE_SOURCE_SHA256, + export_sha256=sha256_file(destination), model_tensor_sha256=canonical_sha(tensors), + model_tensor_count=len(tensors), exact_model_tensor_roundtrip=True, + optimizer_exported=False, rng_exported=False, source_checkpoint_unchanged=True) + + +def collect_code(root): + root = Path(root) + names = subprocess.check_output(["git", "ls-files", "--cached", "--others", "--exclude-standard", "-z"], cwd=root).decode().split("\0") + result = [] + code_dirs = {"cosmos_framework", "scripts", "configs", "docs", "examples", "experiment_manifests"} + top_files = {"README.md", "LICENSE", "ATTRIBUTIONS.md", "NOTICE", "zeva_bridge_recovery_agent_plan_v2.md"} + suffixes = {".py", ".json", ".toml", ".md", ".sh", ".yaml", ".yml"} + for name in sorted(set(names) - {""}): + path = safe_relative(name) + if name not in top_files and not (path.parts[0] in code_dirs and path.suffix in suffixes): + continue + if any(part.startswith(".") or part in {"__pycache__", "wandb", "outputs", "checkpoints"} for part in path.parts): + continue + source = checked_path(root, name) + if not source.is_file() or source.stat().st_size > 4 * 1024**2: + raise ValueError(f"Unexpected source file: {name}") + check_publishable_text(source) + result.append(name) + return result + + +def copy_one(source, output, name): + target = checked_path(output, name) + if Path(source).is_symlink() or target.exists(): + raise ValueError(f"Refusing symlink or overwrite: {name}") + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(source, target) + + +def build(args): + root, output, bank_root = args.project_root.resolve(), args.output.resolve(), args.bank.resolve() + if output.exists(): + raise FileExistsError("Use a new output directory; handoff bundles are immutable") + if subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=args.framework).decode().strip() != FRAMEWORK_REVISION: + raise ValueError("Wrong upstream framework revision") + manifest = read_json(bank_root / "manifest.json") + source_contract = read_json(bank_root / "contract.json") + identity = source_contract["contract"]["identity"] + if canonical_sha(source_contract["contract"]) != source_contract["fingerprint"]: + raise ValueError("Static bank contract was changed") + if source_contract["fingerprint"] != manifest["fingerprint"] or sha256_file(bank_root / "static_bank.pt") != BANK_SHA256: + raise ValueError("Wrong static bank") + for name, expected in manifest["artifact_sha256"].items(): + if sha256_file(checked_path(bank_root, name)) != expected: + raise ValueError(f"Bank source artifact changed: {name}") + if canonical_sha(read_json(args.split)) != identity["split_sha256"]: + raise ValueError("Stage1 split mismatch") + code_names = collect_code(root) + output.mkdir(parents=True) + for name in code_names: + copy_one(root / name, output, "code/" + name) + for name in sorted(set(manifest["artifact_sha256"]) | {"manifest.json"}): + copy_one(checked_path(bank_root, name), output, "memory/static_bank_3000/" + name) + copy_one(args.split, output, "memory/stage1_split.json") + copy_one(root / "scripts/action_normalizer_legacy_v0.json", output, "memory/cte_legacy_normalizer.json") + if sha256_file(output / "memory/cte_legacy_normalizer.json") != identity["normalizer_sha256"]: + raise ValueError("Legacy normalizer mismatch") + native_stats = args.framework / "cosmos_framework/data/generator/action/normalizer_stats/bridge_orig_lerobot_stats.json" + upstream_stats = subprocess.check_output(["git", "show", FRAMEWORK_REVISION + ":" + str(native_stats.relative_to(args.framework))], cwd=args.framework) + if hashlib.sha256(upstream_stats).hexdigest() != sha256_file(native_stats): + raise ValueError("Native normalizer differs from pinned NVIDIA code") + copy_one(native_stats, output, "memory/policy_native10_normalizer.json") + old_pilot = read_json(args.pilot)["contract"]["episode_ids"] + write_json(output / "memory/pilot_split.json", dict(train=old_pilot["train"], development=old_pilot["development"], + note="Stage2 development only: all these episodes belong to the original CTE train split")) + cte = export_cte(args.cte, output / "memory/cte_30000_inference.pt", identity) + copy_one(root / "docs/bridge_native_handoff.md", output, "README.md") + files = {} + for path in sorted(output.rglob("*")): + if path.is_file(): + files[path.relative_to(output).as_posix()] = dict(sha256=sha256_file(path), bytes=path.stat().st_size) + release = dict(format=FORMAT, release_prefix=RELEASE_PREFIX, files=files, + base=dict(repo=BASE_REPO, revision=BASE_REVISION), framework_revision=FRAMEWORK_REVISION, + dataset=dict(repo=DATA_REPO, revision=DATA_REVISION, metadata_sha256=identity["dataset_metadata_sha256"]), + vae=dict(repo="Wan-AI/Wan2.2-TI2V-5B", revision=args.vae_revision, + filename="Wan2.2_VAE.pth", sha256=VAE_SHA256), + cte=cte, bank=dict(file="memory/static_bank_3000/static_bank.pt", sha256=BANK_SHA256, + fingerprint=manifest["fingerprint"], entries=3000), + training_ready=False, runtime_shape_trace="NOT_RUN", retrieval_head="NOT_TRAINED", + gate_50="NOT_RUN", gate_500="NOT_RUN", continuous="NOT_STARTED", + missing_training_components=MISSING_TRAINING_COMPONENTS, + source_git_commit=subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=root).decode().strip(), + source_tree_identity="file hashes include intentional uncommitted overlay changes", + all_old_local_checkpoints_preserved=True) + write_json(output / "handoff_manifest.json", release) + result = verify(output, deep=True) + print(json.dumps(dict(bundle=str(output), files=len(files), total_bytes=sum(x["bytes"] for x in files.values()), **result), indent=2)) + + +def verify(bundle, *, deep=False, dataset=None, vae=None, require_training_ready=False): + bundle = Path(bundle).resolve() + release = read_json(bundle / "handoff_manifest.json") + if release["format"] != FORMAT or release["base"] != dict(repo=BASE_REPO, revision=BASE_REVISION): + raise ValueError("Not the pinned native Bridge handoff") + if release["framework_revision"] != FRAMEWORK_REVISION: + raise ValueError("Upstream revision mismatch") + for name, record in release["files"].items(): + path = checked_path(bundle, name) + if not path.is_file() or path.stat().st_size != record["bytes"] or sha256_file(path) != record["sha256"]: + raise ValueError(f"File integrity failure: {name}") + bank_root = bundle / "memory/static_bank_3000" + bank_manifest = read_json(bank_root / "manifest.json") + contract = read_json(bank_root / "contract.json") + identity = contract["contract"]["identity"] + if canonical_sha(contract["contract"]) != contract["fingerprint"] or contract["fingerprint"] != release["bank"]["fingerprint"]: + raise ValueError("Bank fingerprint mismatch") + for name, expected in bank_manifest["artifact_sha256"].items(): + if sha256_file(checked_path(bank_root, name)) != expected: + raise ValueError(f"Original bank artifact mismatch: {name}") + if sha256_file(bank_root / "static_bank.pt") != BANK_SHA256 or identity["cte_checkpoint_sha256"] != CTE_SOURCE_SHA256: + raise ValueError("Bank/source CTE association mismatch") + if canonical_sha(read_json(bundle / "memory/stage1_split.json")) != identity["split_sha256"]: + raise ValueError("Original split changed") + if sha256_file(bundle / "memory/cte_legacy_normalizer.json") != identity["normalizer_sha256"]: + raise ValueError("Normalizer association mismatch") + if release["dataset"]["metadata_sha256"] != identity["dataset_metadata_sha256"] or release["vae"]["sha256"] != identity["vae_sha256"]: + raise ValueError("Portable data/VAE binding differs from original provenance") + selection, partitions = read_json(bank_root / "selection.json"), read_json(bank_root / "partitions.json") + support = {e["episode_id"] for e in selection["episodes"]} + pilot = read_json(bundle / "memory/pilot_split.json") + query = set(partitions["train_query_candidate_episode_ids"]) + validation = set(partitions["validation_episode_ids"]) + if len(support) != 3000 or support & (query | validation | set(pilot["train"]) | set(pilot["development"])): + raise ValueError("Support/query contamination or wrong support count") + if len(pilot["train"]) != 32 or len(pilot["development"]) != 8 or set(pilot["train"]) & set(pilot["development"]): + raise ValueError("Incorrect 32/8 pilot split") + result = dict(memory_integrity="PASS", cte_tensor_load="NOT_RUN", dataset_metadata="NOT_CHECKED", + vae_integrity="NOT_CHECKED", training_ready=release["training_ready"], + gate_50=release["gate_50"], gate_500=release["gate_500"]) + if deep: + import torch + exported = torch.load(bundle / release["cte"]["file"], map_location="cpu", weights_only=True) + if exported["format"] != EXPORT_FORMAT or any(k in exported for k in ("optimizer", "rng_states", "training_args")): + raise ValueError("CTE export contains forbidden training state") + if exported["source_checkpoint_sha256"] != CTE_SOURCE_SHA256: + raise ValueError("CTE export has another origin") + if (exported["source_step"] != 30000 or not exported["inference_only"] + or canonical_sha(exported["model_config"]) != canonical_sha(identity["model_config"]) + or exported["source_contract_fingerprint"] != identity["cte_training_contract_fingerprint"]): + raise ValueError("CTE export semantics do not match bank provenance") + if sha256_file(bundle / release["cte"]["file"]) != release["cte"]["export_sha256"]: + raise ValueError("CTE export file binding changed") + actual = tensor_manifest(exported["model"]) + if actual != exported["model_tensor_manifest"] or canonical_sha(actual) != release["cte"]["model_tensor_sha256"]: + raise ValueError("CTE tensor identity mismatch") + sys.path.insert(0, str(bundle / "code")) + from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig + model = CausalTransitionEncoder(CausalTransitionEncoderConfig(**exported["model_config"])) + model.load_state_dict(exported["model"], strict=True) + model.eval().requires_grad_(False) + bank = torch.load(bank_root / "static_bank.pt", map_location="cpu", weights_only=True) + keys = torch.stack([entry["retrieval_key"] for entry in bank["entries"]]) + values = torch.stack([entry["behavior_value"] for entry in bank["entries"]]) + if keys.shape != (3000, 128) or values.shape != (3000, 256) or not torch.isfinite(keys).all() or not torch.isfinite(values).all(): + raise ValueError("Invalid bank tensors") + if bank["fingerprint"] != contract["fingerprint"]: + raise ValueError("Bank tensor fingerprint mismatch") + torch.testing.assert_close(keys.norm(dim=-1), torch.ones(3000), atol=1e-6, rtol=0) + if [e["episode_id"] for e in bank["entries"]] != [e["episode_id"] for e in selection["episodes"]]: + raise ValueError("Bank rows do not match support selection") + result.update(cte_tensor_load="PASS", cte_tensors=len(actual), bank_key_shape=list(keys.shape), bank_value_shape=list(values.shape)) + if dataset is not None: + for name, expected in release["dataset"]["metadata_sha256"].items(): + if sha256_file(checked_path(Path(dataset) / "meta", name)) != expected: + raise ValueError(f"Dataset metadata differs from CTE source: {name}") + result["dataset_metadata"] = "PASS" + if vae is not None: + if sha256_file(vae) != VAE_SHA256: + raise ValueError("Wan VAE differs from CTE training source") + result["vae_integrity"] = "PASS" + if require_training_ready and not release["training_ready"]: + raise RuntimeError("NOT TRAINING READY: native Stage2 GPU acceptance has not passed; inspect the manifest and do not run legacy pilot") + return result + + +def verify_remote_files(bundle, repo_info, *, prefix=RELEASE_PREFIX): + """Verify committed content, including files the Hub may silently ignore.""" + bundle = Path(bundle) + release = read_json(bundle / "handoff_manifest.json") + remote = {entry.rfilename: entry for entry in repo_info.siblings} + names = set(release["files"]) | {"handoff_manifest.json"} + for name in sorted(names): + key = prefix + "/" + name + entry = remote.get(key) + if entry is None: + raise ValueError(f"Published file is missing: {key}") + path = checked_path(bundle, name) + if entry.size != path.stat().st_size: + raise ValueError(f"Published file size differs: {key}") + if entry.lfs is not None: + if entry.lfs.sha256 != sha256_file(path): + raise ValueError(f"Published LFS hash differs: {key}") + else: + content = path.read_bytes() + git_hash = hashlib.sha1(b"blob " + str(len(content)).encode() + b"\0" + content).hexdigest() + if entry.blob_id != git_hash: + raise ValueError(f"Published Git blob differs: {key}") + return len(names) + + +def publish(args): + from huggingface_hub import HfApi, CommitOperationAdd + verify(args.bundle, deep=True) + api = HfApi() + user = api.whoami()["name"] + if args.repo != "DanTim05/DynaTTT" or user != "DanTim05": + raise PermissionError("Publication is restricted to the requested repo and its owner credential") + info = api.repo_info(args.repo, repo_type="space", files_metadata=True) + release = read_json(args.bundle / "handoff_manifest.json") + prefix = release.get("release_prefix", RELEASE_PREFIX) + relative = safe_relative(prefix) + if len(relative.parts) != 2 or relative.parts[0] != "releases": + raise ValueError("Publication requires an explicit releases/ prefix") + if any(s.rfilename.startswith(prefix + "/") for s in info.siblings): + raise FileExistsError("Release prefix already exists; do not overwrite a published handoff") + operations = [] + for name in sorted(set(release["files"]) | {"handoff_manifest.json"}): + source = checked_path(args.bundle, name) + if source.suffix in {".py", ".sh", ".md", ".json", ".toml", ".yaml", ".yml"}: + check_publishable_text(source) + operations.append(CommitOperationAdd(path_in_repo=prefix + "/" + name, path_or_fileobj=str(source))) + # This explicit, scanned allowlist includes the authorized CTE/bank weights. + # An existing remote '*.pt' gitignore silently drops them even from create_commit. + # Override ignore evaluation only for these operations; never edit remote .gitignore. + api.preupload_lfs_files(args.repo, additions=operations, repo_type="space", + revision=info.sha, free_memory=False, gitignore_content="") + message = ("Add Bridge native Stage2 training source; GPU validation NOT_RUN" if release.get("native_entrypoint") + else "Add verified Bridge CTE30k and 3000-entry bank handoff; native training NOT READY") + commit = api.create_commit(args.repo, repo_type="space", operations=operations, parent_commit=info.sha, + commit_message=message) + committed = api.repo_info(args.repo, repo_type="space", revision=commit.oid, files_metadata=True) + verified_count = verify_remote_files(args.bundle, committed, prefix=prefix) + committed_blobs = {entry.rfilename: entry.blob_id for entry in committed.siblings} + if any(committed_blobs.get(entry.rfilename) != entry.blob_id for entry in info.siblings): + raise RuntimeError("Publication changed a pre-existing Space file; inspect the commit") + receipt = dict(repo=args.repo, repo_type="space", revision=commit.oid, parent=info.sha, + prefix=prefix, url=commit.commit_url, files_verified=verified_count, + preexisting_files_unchanged=len(info.siblings), + training_ready=False, removed_files=0) + if args.receipt: + write_json(args.receipt, receipt) + print(json.dumps(receipt, indent=2)) + + +def download(args): + from huggingface_hub import snapshot_download, hf_hub_download + bundle = Path(args.bundle).resolve() + verify(bundle) + manifest = read_json(bundle / "handoff_manifest.json") + # Downloads are explicit opt-ins. No base/data duplication in the release. + if not any((args.base, args.dataset, args.vae)): + raise ValueError("Select --base, --dataset and/or --vae") + for enabled, entry, local_name, repo_type in ( + (args.base, manifest["base"], "models/Cosmos3-Nano", "model"), + (args.dataset, manifest["dataset"], "datasets/bridge_orig_lerobot", "dataset"), + ): + if enabled: + snapshot_download(entry["repo"], revision=entry["revision"], repo_type=repo_type, + local_dir=args.destination / local_name, max_workers=args.max_workers) + vae_path = None + if args.vae: + entry = manifest["vae"] + vae_path = hf_hub_download(entry["repo"], entry["filename"], revision=entry["revision"], + local_dir=args.destination / "models/wan22_vae") + print(json.dumps(verify(bundle, dataset=args.destination / "datasets/bridge_orig_lerobot" if args.dataset else None, + vae=vae_path), indent=2)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest="command", required=True) + p = sub.add_parser("build") + p.add_argument("--project-root", type=Path, default=Path(__file__).resolve().parents[1]) + for name in ("output", "framework", "cte", "bank", "split", "pilot"): + p.add_argument("--" + name, type=Path, required=True) + p.add_argument("--vae-revision", required=True) + p = sub.add_parser("verify") + p.add_argument("--bundle", type=Path, required=True) + p.add_argument("--deep", action="store_true") + p.add_argument("--dataset", type=Path) + p.add_argument("--vae", type=Path) + p.add_argument("--require-training-ready", action="store_true") + p = sub.add_parser("publish") + p.add_argument("--bundle", type=Path, required=True) + p.add_argument("--repo", default="DanTim05/DynaTTT") + p.add_argument("--receipt", type=Path) + p = sub.add_parser("download") + p.add_argument("--bundle", type=Path, required=True) + p.add_argument("--destination", type=Path, required=True) + for name in ("base", "dataset", "vae"): + p.add_argument("--" + name, action="store_true") + p.add_argument("--max-workers", type=int, default=8) + args = parser.parse_args() + try: + if args.command == "build": + build(args) + elif args.command == "publish": + publish(args) + elif args.command == "download": + download(args) + else: + print(json.dumps(verify(args.bundle, deep=args.deep, dataset=args.dataset, vae=args.vae, + require_training_ready=args.require_training_ready), indent=2)) + except (ValueError, RuntimeError, OSError) as exc: + parser.exit(2, f"{type(exc).__name__}: {exc}\n") + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/bridge_native_contract.py b/releases/bridge-native-v3/code/scripts/bridge_native_contract.py new file mode 100644 index 0000000000000000000000000000000000000000..e1cef3035767a0d340819b778311afa95ea69d92 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_native_contract.py @@ -0,0 +1,177 @@ +"""Native WidowX contracts. No training, checkpoint loading, or global grad changes. + +Policy labels are derived from raw adjacent poses, NEVER from reached7 vectors. +The coordinate transforms and rotation implementation are NVIDIA's pinned code. +""" +from __future__ import annotations + +from dataclasses import asdict, dataclass +import json + +import numpy as np +import torch + + +@dataclass(frozen=True) +class BridgeDimensions: + policy_action_dim: int = 10 + cte_action_dim: int = 7 + proprio_dim: int = 10 + policy_horizon: int = 32 + policy_gripper_index: int = 9 + cte_gripper_index: int = 6 + global_dim: int = 256 + phase_dim: int = 128 + effect_dim: int = 128 + effect_history_length: int = 4 + domain_id: int = 7 + + def validate(self): + if asdict(self) != asdict(BridgeDimensions()): + raise ValueError("Bridge native v1 dimensions are fixed, not interchangeable") + + +DIMENSIONS = BridgeDimensions() + + +def _finite_last(value, width, name): + a = np.asarray(value, dtype=np.float32) + if a.ndim < 1 or a.shape[-1] != width or not np.isfinite(a).all(): + raise ValueError(f"{name} requires finite [...,{width}], got {a.shape}") + return a + + +def get_policy_gripper(action10): + if action10.shape[-1] != DIMENSIONS.policy_action_dim: + raise ValueError("Policy gripper requires native10") + return action10[..., DIMENSIONS.policy_gripper_index] + + +def get_cte_gripper(action7): + if action7.shape[-1] != DIMENSIONS.cte_action_dim: + raise ValueError("CTE gripper requires reached7") + return action7[..., DIMENSIONS.cte_gripper_index] + + +def _upstream(): + from cosmos_framework.data.generator.action.datasets import bridge_orig_lerobot_dataset as bridge + from cosmos_framework.data.generator.action import pose_utils + return bridge, pose_utils + + +def raw_states_to_native_poses(raw_states): + states = _finite_last(raw_states, 8, "IPEC observation.state") + if states.ndim != 2: + raise ValueError("Expected a single episode's states [T,8]") + bridge, pose = _upstream() + result = pose.build_abs_pose_from_components(states[:, :3], states[:, 3:6], "euler_xyz") + result[:, :3, :3] = result[:, :3, :3] @ bridge._DEFAULT_ROTATION.astype(result.dtype) + result = result @ bridge._TCP_TO_FLANGE.astype(result.dtype) + result[:, :3, :3] = result[:, :3, :3] @ bridge._BRIDGE_TO_OPENCV.astype(result.dtype) + return result + + +def policy_native_actions(raw_states, recorded_gripper): + """[T+1,8] measured states and [T] recorded gripper -> [T,10].""" + poses = raw_states_to_native_poses(raw_states) + gripper = np.asarray(recorded_gripper, dtype=np.float32) + if len(poses) < 2 or gripper.shape != (len(poses) - 1,): + raise ValueError("Need exactly one gripper label per adjacent state pair") + if not np.isfinite(gripper).all() or np.any((gripper < 0) | (gripper > 1)): + raise ValueError("Recorded policy gripper must be in [0,1]") + _, pose = _upstream() + motion = pose.pose_abs_to_rel(poses, rotation_format="rot6d", pose_convention="backward_framewise") + return np.concatenate((motion, gripper[:, None]), axis=-1).astype(np.float32) + + +def proprio_native10(raw_state): + state = _finite_last(raw_state, 8, "current IPEC observation.state") + if state.ndim != 1: + raise ValueError("Expected one current state [8]") + _, pose = _upstream() + absolute = raw_states_to_native_poses(state[None])[0] + rotation = pose.convert_rotation(absolute[:3, :3], "matrix", "rot6d") + return np.concatenate((absolute[:3, 3], rotation, state[7:8])).astype(np.float32) + + +def native_quantiles(): + bridge, _ = _upstream() + raw = json.loads(bridge._NORMALIZER_PATH.read_text()) + q01 = _finite_last(raw["q01"], 10, "native10 q01") + q99 = _finite_last(raw["q99"], 10, "native10 q99") + if np.any(q99 <= q01): + raise ValueError("Degenerate native action normalization") + return q01, q99 + + +def normalize_policy_native10(raw): + action = _finite_last(raw, 10, "policy_native_action") + q01, q99 = native_quantiles() + # Exactly NVIDIA quantile normalization: NO legacy clipping. + return 2 * (action - q01) / (q99 - q01) - 1 + + +def denormalize_policy_native10(normalized): + action = _finite_last(normalized, 10, "policy_action_normalized") + q01, q99 = native_quantiles() + return (action + 1) * 0.5 * (q99 - q01) + q01 + + +def resolve_model_action_dim(network): + """Require agreement between constructed modules and runtime configuration.""" + observed = { + "config.action_dim": int(network.config.action_dim), + "network.action_dim": int(network.action_dim), + "action2llm.input_size": int(network.action2llm.input_size), + "llm2action.output_size": int(network.llm2action.output_size), + } + if len(set(observed.values())) != 1 or next(iter(observed.values())) != 64: + raise ValueError(f"Unexpected Cosmos model action width: {observed}") + return next(iter(observed.values())) + + +def pad_policy_action(normalized, model_action_dim): + if model_action_dim != 64: + raise ValueError("Native v1 expects runtime-verified model width 64") + if normalized.ndim != 3 or tuple(normalized.shape[-2:]) != (32, 10): + raise ValueError("policy_action_normalized must be [B,32,10]") + if not torch.isfinite(normalized).all(): + raise ValueError("Nonfinite policy action") + output = normalized.new_zeros((*normalized.shape[:-1], model_action_dim)) + output[..., :DIMENSIONS.policy_action_dim] = normalized + valid_channels = torch.arange(model_action_dim, device=normalized.device) < DIMENSIONS.policy_action_dim + return output, valid_channels + + +def controller_command(native_action, measured_tcp_at_base, previous_controller_target): + """Native10 -> Simpler ee_align2/use_target command, including target lag. + + Input poses refer to ee_gripper_link. Return base-frame translation plus + axis-angle rotation and discrete gripper. This does NOT compute reached7; + reached7 must be recomputed after env.step from measured states. + """ + from scipy.spatial.transform import Rotation + action = _finite_last(native_action, 10, "denormalized native10") + if action.shape != (10,): + raise ValueError("Decode one native action at a time") + for transform in (measured_tcp_at_base, previous_controller_target): + if np.shape(transform) != (4, 4) or not np.isfinite(transform).all(): + raise ValueError("Controller decoder requires two finite homogeneous poses") + bridge, pose = _upstream() + current = np.asarray(measured_tcp_at_base, dtype=np.float64) + previous = np.asarray(previous_controller_target, dtype=np.float64) + cv = np.eye(4) + cv[:3, :3] = bridge._BRIDGE_TO_OPENCV + flange = np.asarray(bridge._TCP_TO_FLANGE, dtype=np.float64) + native_current = current @ flange @ cv + if np.linalg.norm(action[3:6]) < 1e-8 or np.linalg.norm(np.cross(action[3:6], action[6:9])) < 1e-8: + raise ValueError("Degenerate rot6d output cannot specify a controller rotation") + relative = np.eye(4) + relative[:3, 3] = action[:3] + relative[:3, :3] = pose.convert_rotation(action[3:9], "rot6d", "matrix", normalize_matrix=True) + target_tcp = native_current @ relative @ np.linalg.inv(cv) @ np.linalg.inv(flange) + pivot = np.eye(4) + pivot[:3, 3] = current[:3, 3] + correction = np.linalg.inv(pivot) @ target_tcp @ np.linalg.inv(previous) @ pivot + return np.r_[correction[:3, 3], Rotation.from_matrix(correction[:3, :3]).as_rotvec(), + 1.0 if get_policy_gripper(action) > 0.5 else -1.0].astype(np.float32) diff --git a/releases/bridge-native-v3/code/scripts/bridge_recovery_contract.py b/releases/bridge-native-v3/code/scripts/bridge_recovery_contract.py new file mode 100644 index 0000000000000000000000000000000000000000..6ae17cea28d547e9ebdc8ad842415659a759a83c --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_recovery_contract.py @@ -0,0 +1,155 @@ +"""Versioned Bridge reached-delta and single-frame CTE inference contract. + +This module is deliberately independent of the policy and static retrieval +image paths. Stage-1's FrozenFrameEncoder uses the same pixel transformation. +""" +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +import numpy as np +import torch + + +ROOT = Path(__file__).resolve().parents[1] +NORMALIZER_FILE = ROOT / "scripts/action_normalizer_legacy_v0.json" +ACTION_CONTRACT_ID = "bridge_reached_delta_legacy_quantile_v0" +CTE_PREPROCESS_ID = "bridge_cte_image0_rgb_singleframe_256_bf16_wan22_v1" +POLICY_PREPROCESS_ID = "widowx_policy_transform_rgb_256_v1" +STATIC_RETRIEVAL_PREPROCESS_ID = "release_static_rgb_bilinear_480x832_wan_v1" +STAGE1_FORMAT = "bridge_cte_stage1_v1" +TRAINING_FRAME_ENCODING = "single_frame_rgb_native256x256_wan22_bf16_v1" + + +def sha256_file(path: str | Path) -> str: + digest = hashlib.sha256() + with Path(path).open("rb") as stream: + for chunk in iter(lambda: stream.read(4 * 1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def sha256_json(data) -> str: + return hashlib.sha256(json.dumps(data, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + + +def legacy_normalizer() -> dict: + spec = json.loads(NORMALIZER_FILE.read_text()) + if spec["id"] != ACTION_CONTRACT_ID: + raise ValueError("Wrong Bridge action normalizer version") + return spec + + +def reached_delta_raw(before_pose, after_pose, executed_gripper_command) -> np.ndarray: + """Use observed Bridge-style XYZ/Euler state change, not desired control. + + `before_pose` and `after_pose` use the same base-frame and tool-frame + convention as Bridge state[:6]. Gripper follows the actual discrete open + command; taking a gripper-state difference would be a different target. + """ + before = np.asarray(before_pose, dtype=np.float32) + after = np.asarray(after_pose, dtype=np.float32) + command = float(executed_gripper_command) + if before.shape != (6,) or after.shape != (6,) or not np.isfinite(before).all() or not np.isfinite(after).all(): + raise ValueError("Need finite measured Bridge-style six-dimensional before/after poses") + if not np.isfinite(command) or command == 0: + raise ValueError("Need a nonzero executed gripper open/close command") + return np.r_[after - before, 1.0 if command > 0 else 0.0].astype(np.float32) + + +def normalize_reached_delta(raw) -> np.ndarray: + spec = legacy_normalizer() + value = np.asarray(raw, dtype=np.float32) + if value.shape[-1:] != (7,) or not np.isfinite(value).all(): + raise ValueError("Need finite reached-delta action with seven channels") + lower = np.asarray(spec["q01"], dtype=np.float32) + upper = np.asarray(spec["q99"], dtype=np.float32) + result = value.copy() + result[..., :6] = np.clip(2 * (result[..., :6] - lower) / (upper - lower) - 1, -1, 1) + result[..., 6] = np.where(result[..., 6] > spec["gripper"]["threshold"], 1., -1.) + return result + + +def cte_pixels(rgb, device) -> torch.Tensor: + """Offline/online common RGB uint8 -> BF16 [-1,1] transformation.""" + image = np.asarray(rgb) + if image.shape != (256, 256, 3) or image.dtype != np.uint8: + raise ValueError("Bridge CTE requires raw RGB uint8 [256,256,3] before any policy resize") + return torch.from_numpy(np.ascontiguousarray(image)).to(device=device, dtype=torch.bfloat16).permute(2, 0, 1).unsqueeze(0).div(127.5).sub(1) + + +@torch.no_grad() +def encode_cte_single_frame(encode, rgb, device) -> torch.Tensor: + latent = encode(cte_pixels(rgb, device).unsqueeze(2)) + if latent.shape != (1, 48, 1, 16, 16): + raise ValueError(f"Unexpected Bridge CTE Wan latent shape {tuple(latent.shape)}") + if not torch.isfinite(latent).all(): + raise FloatingPointError("Nonfinite Bridge CTE latent") + return latent[0, :, 0].float().contiguous() + + +def cte_identity(checkpoint: dict, checkpoint_path: str | Path | None = None, split_path: str | Path | None = None) -> dict: + if checkpoint.get("format") != STAGE1_FORMAT: + raise ValueError("Checkpoint is not an IPEC Bridge Stage-1 CTE") + contract = checkpoint.get("contract") or {} + if checkpoint.get("contract_fingerprint") != sha256_json(contract): + raise ValueError("Stage-1 CTE contract fingerprint does not match its contents") + if contract.get("frame_encoding") != TRAINING_FRAME_ENCODING or contract.get("action_contract") != "bridge_q01_q99_xyzrpy_clipped_gripper_open_positive_v1": + raise ValueError("Stage-1 checkpoint has a different visual/action contract") + if contract.get("cte_initialization") != "random_no_release_weights": + raise ValueError("CTE source identity is incomplete") + model_config = checkpoint.get("model_config") or {} + if model_config.get("action_dim") != 7 or model_config.get("image_channels") != 48: + raise ValueError("Unexpected Bridge CTE dimensions") + normalizer = legacy_normalizer() + result = dict(version="bridge_recovery_identity_v2", stage1_format=STAGE1_FORMAT, + cte_preprocess_id=CTE_PREPROCESS_ID, policy_preprocess_id=POLICY_PREPROCESS_ID, + static_retrieval_preprocess_id=STATIC_RETRIEVAL_PREPROCESS_ID, + action_contract_id=ACTION_CONTRACT_ID, normalizer_sha256=sha256_file(NORMALIZER_FILE), + normalizer_source=normalizer["source"], cte_training_contract_sha256=sha256_json(contract), + cte_training_contract_fingerprint=checkpoint.get("contract_fingerprint"), + vae_sha256=contract.get("vae_sha256"), fps=contract.get("fps"), + boundary_stride=contract.get("boundary_stride"), effect_raw_controls=contract.get("effect_raw_controls"), + dataset=contract.get("dataset"), dataset_metadata_sha256=contract.get("metadata"), + source_code_sha256=contract.get("code_sha256"), model_config=model_config, + checkpoint_step=checkpoint.get("step")) + if checkpoint_path is not None: + result["cte_checkpoint_sha256"] = sha256_file(checkpoint_path) + result["cte_checkpoint_path"] = str(Path(checkpoint_path).resolve()) + if split_path is not None: + split = json.loads(Path(split_path).read_text()) + result["split_sha256"] = sha256_json(split) + result["train_episodes"] = len(split["train"]) + result["validation_episodes"] = len(split["validation"]) + return result + + +def bridge_feature_source(identity: dict) -> dict: + """Version a *potential* small Bridge feature producer, not a built cache. + + Materialized episode files must separately carry this exact fingerprint and + be generated from causal prefixes. This does not certify old release files. + """ + required = ("cte_checkpoint_sha256", "normalizer_sha256", "split_sha256", "vae_sha256", + "cte_preprocess_id", "policy_preprocess_id", "static_retrieval_preprocess_id", + "action_contract_id") + if any(not identity.get(key) for key in required): + raise ValueError("A Bridge feature source needs exact CTE, split, VAE and normalizer identities") + contract = dict(version="bridge_causal_prefix_feature_source_v1", identity=identity, + boundary_stride=4, effect_available_after_completed_controls=16, + outputs={"behavior_global": [256], "behavior_phase": [128], + "behavior_effect": [4, 128], "behavior_effect_valid": [4]}, + static_context="release retrieval path retained but must be separately bound to an adapted Stage-2 policy") + return dict(contract=contract, fingerprint=sha256_json(contract), + materialized_cache=False) + + +def require_matching_stage2(stage2_binding: dict, identity: dict) -> None: + """Fail closed: matching tensor dimensions do not prove feature semantics.""" + required = ("cte_checkpoint_sha256", "normalizer_sha256", "cte_preprocess_id", + "policy_preprocess_id", "static_retrieval_preprocess_id", "action_contract_id", + "split_sha256", "vae_sha256") + if any(stage2_binding.get(key) != identity.get(key) for key in required): + raise ValueError("Stage-2 feature producer does not match this Bridge CTE; a new Stage-2 pilot/binding is required") diff --git a/releases/bridge-native-v3/code/scripts/bridge_stage2_checkpoint.py b/releases/bridge-native-v3/code/scripts/bridge_stage2_checkpoint.py new file mode 100644 index 0000000000000000000000000000000000000000..693e4f069e76eb0cd597fa5418db7fff08fe1e48 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_stage2_checkpoint.py @@ -0,0 +1,87 @@ +"""New pilot: base -> old replacement values -> new behavior receiver weights.""" +from __future__ import annotations + +import json +import os +from pathlib import Path + +import torch +import torch.distributed as dist + +from scripts.widowx_checkpoint import WidowXDeltaCheckpointer +from scripts.bridge_recovery_contract import sha256_file + + +@torch.no_grad() +def copy_full(parameter, value): + if hasattr(parameter, 'device_mesh'): + from torch.distributed.tensor import DTensor, Replicate + full = DTensor.from_local(value.to(parameter.device, parameter.dtype), parameter.device_mesh, + [Replicate()] * len(parameter.placements), run_check=False) + parameter.to_local().copy_(full.redistribute(parameter.device_mesh, parameter.placements).to_local()) + else: + parameter.copy_(value.to(parameter.device, parameter.dtype)) + + +class BridgePilotCheckpointer(WidowXDeltaCheckpointer): + def load(self, model, optimizer=None, scheduler=None, grad_scaler=None): + iteration = super().load(model, optimizer, scheduler, grad_scaler) + if iteration: + return iteration + path = Path(os.environ['BRIDGE_STAGE2_WARMSTART']) + payload = torch.load(path, map_location='cpu', weights_only=False) + if Path(payload['base']).resolve() != Path(os.environ['BASE_CHECKPOINT_PATH']).resolve(): + raise ValueError('Old warm-start uses a different policy base') + named = dict(model.named_parameters()) + expected = {name for name, param in named.items() if param.requires_grad} + if set(payload['model']) != expected: + raise ValueError(f'Warm-start selected keys differ: {set(payload["model"]) ^ expected}') + for name, value in payload['model'].items(): + if tuple(value.shape) != tuple(named[name].shape): + raise ValueError(f'Warm-start shape mismatch: {name}') + copy_full(named[name], value) + # These receivers depended on the old CTE/global coordinate system. + # Reset all behavior-related parameters; preserve action/proprio heads. + from cosmos_framework.model.zeva.policy_injection import PolicyInjectionPrior, CausalPromptPolicyAdapter + with torch.random.fork_rng(devices=[]): + torch.manual_seed(20260924) + pbd = PolicyInjectionPrior(model.net.behavior_pbd.cfg) + pbd.init_weights() + adapter = CausalPromptPolicyAdapter(action_dim=7, hidden_dim=model.net.behavior_adapter.prior_to_action_embedding.out_features) + adapter.init_weights() + global_projector = torch.nn.Linear(256, model.net.behavior_global_projector.out_features) + torch.nn.init.xavier_uniform_(global_projector.weight) + torch.nn.init.zeros_(global_projector.bias) + reset = [] + for prefix, module in (('net.behavior_pbd', pbd), ('net.behavior_adapter', adapter), + ('net.behavior_global_projector', global_projector)): + for suffix, value in module.named_parameters(): + name = f'{prefix}.{suffix}' + copy_full(named[name], value) + reset.append(name) + if not dist.is_initialized() or dist.get_rank() == 0: + evidence = dict(warmstart=str(path.resolve()), warmstart_sha256=sha256_file(path), + source_iteration=payload['iteration'], pilot_iteration=0, + replacement_keys=sorted(expected), reset_keys=reset, + preserved_keys=sorted(expected-set(reset)), + old_optimizer_restored=False, old_sampler_restored=False) + (self._directory().parent / 'warmstart.json').write_text(json.dumps(evidence, indent=2)+'\n') + print(f'BRIDGE_PILOT_WARMSTART preserved={len(expected)-len(reset)} reset={len(reset)}', flush=True) + return 0 + + def save(self, model, optimizer, scheduler, grad_scaler, iteration): + super().save(model, optimizer, scheduler, grad_scaler, iteration) + path = self._directory() / f'step_{iteration:09d}.pt' + payload = torch.load(path, map_location='cpu', weights_only=False) + named = dict(model.named_parameters()) + for name, value in payload['model'].items(): + parameter = named[name] + full = parameter.full_tensor() if hasattr(parameter, 'full_tensor') else parameter + if not torch.equal(full.detach().cpu(), value): + raise AssertionError(f'Checkpoint roundtrip differs: {name}') + if not dist.is_initialized() or dist.get_rank() == 0: + (path.parent / f'step_{iteration:09d}.verified.json').write_text(json.dumps(dict( + step=iteration, selected_tensor_count=len(payload['model']), + checkpoint_sha256=sha256_file(path), exact_model_roundtrip=True, + optimizer_state_present=bool(payload['optimizer'].get('state')), + data_cursors=payload['data_cursors']), indent=2)+'\n') diff --git a/releases/bridge-native-v3/code/scripts/bridge_stage2_config.py b/releases/bridge-native-v3/code/scripts/bridge_stage2_config.py new file mode 100644 index 0000000000000000000000000000000000000000..45520a70b9c62a566af7dc27c76a864c58f63e82 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_stage2_config.py @@ -0,0 +1,44 @@ +"""Bounded Stage2 adaptation using the new independent-support bundle.""" +import copy + + +def register(): + from hydra.core.config_store import ConfigStore + from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_droid_nano import action_policy_droid_nano + from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva import action_policy_robocasa365_atomic5_zeva + from cosmos_framework.utils.lazy_config import LazyCall as L + from scripts.bridge_stage2_data import get_bridge_pilot_dataset + from scripts.bridge_stage2_checkpoint import BridgePilotCheckpointer + from scripts.bridge_stage2_monitor import BridgePilotMonitor + c = copy.deepcopy(action_policy_robocasa365_atomic5_zeva) + c.dataloader_train = copy.deepcopy(action_policy_droid_nano.dataloader_train) + c.dataloader_train._target_ = 'scripts.widowx_data_resume.make_packing_loader' + c.dataloader_train.max_samples_per_batch = 1 + dl = c.dataloader_train.dataloader + dl.batch_size = 1 + dl.num_workers = 1 + dl.in_order = True + dl.datasets = dict(bridge_pilot=dict(ratio=1, dataset=L(get_bridge_pilot_dataset)( + bundle='${oc.env:BRIDGE_STAGE2_BUNDLE}', tokenizer_config='${model.config.vlm_config.tokenizer}', + max_action_dim=64, resolution='256'))) + c.optimizer.keys_to_select = ['action2llm', 'llm2action', 'action_modality_embed', + 'proprio_projector', 'behavior_adapter', 'behavior_global_projector', 'behavior_pbd'] + c.optimizer.lr = 1e-5 + c.optimizer.optimizer_type = 'FusedAdam' + c.scheduler.cycle_lengths = [500] + c.scheduler.f_start = [1.0] + c.scheduler.f_max = [1.0] + c.scheduler.f_min = [1.0] + c.trainer.max_iter = 50 + c.trainer.grad_accum_iter = 1 + c.trainer.callbacks = dict(bridge_pilot=L(BridgePilotMonitor)()) + c.checkpoint.type = L(BridgePilotCheckpointer)() + c.checkpoint.save_iter = 50 + c.model.config.compile.enabled = False + c.model.config.ema.enabled = False + c.model.config.parallelism.data_parallel_shard_degree = -1 + c.model.config.parallelism.data_parallel_replicate_degree = 1 + # Explicit fitting protocol: all samples present their real, possibly BOS, + # history. A future robustness run can reintroduce prior dropout. + c.model.config.behavior_stage2.prior_dropout_rate = 0.0 + ConfigStore.instance().store(group='experiment', package='_global_', name='bridge_stage2_pilot_v2', node=c) diff --git a/releases/bridge-native-v3/code/scripts/bridge_stage2_data.py b/releases/bridge-native-v3/code/scripts/bridge_stage2_data.py new file mode 100644 index 0000000000000000000000000000000000000000..fd8fc7c0784a01cd50215b18645ba3d0d5641bfd --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_stage2_data.py @@ -0,0 +1,82 @@ +"""Strict small-bundle dataset; legacy full-run cache contracts are untouched.""" +from __future__ import annotations + +import json +from pathlib import Path + +import numpy as np + +from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import WidowXBridgeV3Dataset +from scripts.bridge_recovery_contract import NORMALIZER_FILE, normalize_reached_delta, sha256_file, sha256_json + + +def read_bundle(path): + path = Path(path) + manifest = json.loads((path / 'manifest.json').read_text()) + if manifest['fingerprint'] != sha256_json(manifest['contract']): + raise ValueError('Bridge pilot manifest fingerprint mismatch') + if manifest['contract']['global_mode'] != 'support_task_prototype_train_only': + raise ValueError('Unexpected static context provider') + if manifest['contract'].get('retrieval_head') is not None: + raise ValueError('The pilot must not reuse a RoboCasa retrieval head') + identity = manifest['contract']['identity'] + if identity['static_retrieval_preprocess_id'] != 'support_cte_singleframe256_task_prototype_train_only_v1': + raise ValueError('Wrong support-context preprocess identity') + root = Path(identity['dataset']) + for name, expected in identity['dataset_metadata_sha256'].items(): + if sha256_file(root / 'meta' / name) != expected: + raise ValueError(f'Dataset metadata changed: {name}') + if sha256_file(NORMALIZER_FILE) != identity['normalizer_sha256']: + raise ValueError('Legacy normalizer identity changed') + # Protect against edits to the legacy policy normalizer while keeping the + # separately named reached-delta normalizer/cache contract unchanged. + from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import normalize_actions + rng = np.random.default_rng(19) + raw = rng.normal(0, .1, (32, 7)).astype(np.float32) + raw[:, 6] = np.linspace(0, 1, len(raw)) + if not np.array_equal(normalize_actions(raw), normalize_reached_delta(raw)): + raise ValueError('Policy labels no longer use the cache legacy normalizer') + if sha256_file(path / 'static_bank.pt') != manifest['contract']['bank_sha256']: + raise ValueError('Static bank hash mismatch') + groups = manifest['contract']['episode_ids'] + cte_path = Path(identity['cte_checkpoint_path']) + split = json.loads((cte_path.parent.parent / 'split.json').read_text()) + if sha256_json(split) != identity['split_sha256']: + raise ValueError('Stage1 source split changed') + if not set(sum(groups.values(), [])) <= set(split['train']): + raise ValueError('Pilot episodes must come from the original Stage1 train split') + if len(set(sum(groups.values(), []))) != sum(map(len, groups.values())): + raise ValueError('Support/query/development contamination') + return manifest + + +class BridgePilotDataset(WidowXBridgeV3Dataset): + def __init__(self, bundle, partition='train'): + self.bundle = Path(bundle) + manifest = read_bundle(self.bundle) + if partition not in ('train', 'development'): + raise ValueError('Support episodes cannot be used as policy query data') + contract = manifest['contract'] + super().__init__(root=contract['identity']['dataset'], window_mode='full') + selected = set(contract['episode_ids'][partition]) + self.episodes = [ep for ep in self.episodes if ep['episode_index'] in selected] + if len(self.episodes) != len(selected): + raise ValueError('Missing selected episodes') + self.windows = [(ep['episode_index'], start) for ep in self.episodes + for start in ([0] + list(range(16, int(ep['length'])-7, 4)))] + self.feature_cache = self.bundle / 'features' / partition + self.feature_fingerprint = manifest['fingerprint'] + for ep in self.episodes: + path = self.feature_cache / f'episode_{ep["episode_index"]:06d}.pt' + if sha256_file(path) != manifest['feature_file_sha256'][str(path.relative_to(self.bundle))]: + raise ValueError(f'Feature file changed: {path}') + + +def get_bridge_pilot_dataset(bundle, tokenizer_config=None, max_action_dim=64, resolution='256'): + from cosmos_framework.data.generator.action.datasets.action_sft_dataset import ActionSFTDataset + from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline + from scripts.widowx_data_resume import WidowXIterableDataset + raw = BridgePilotDataset(bundle) + transform = ActionTransformPipeline(tokenizer_config=tokenizer_config, max_action_dim=max_action_dim, + format_prompt_as_json=True) + return WidowXIterableDataset(ActionSFTDataset(raw, transform, resolution)) diff --git a/releases/bridge-native-v3/code/scripts/bridge_stage2_monitor.py b/releases/bridge-native-v3/code/scripts/bridge_stage2_monitor.py new file mode 100644 index 0000000000000000000000000000000000000000..b3bb0ce3698dc06efc18062dbeb1426965b28e60 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_stage2_monitor.py @@ -0,0 +1,296 @@ +"""Pilot-only diagnostics: real input gradients, frozen weights and reload probes.""" +from __future__ import annotations + +import copy +import hashlib +import json +import os +from pathlib import Path +import random +import time + +import numpy as np +import torch +import torch.distributed as dist + +from cosmos_framework.utils.callback import Callback +from cosmos_framework.utils import misc +from scripts.bridge_recovery_contract import sha256_file +from scripts.widowx_masked_loss import _MASKS, batch_vectors + + +GROUPS = ('action2llm', 'llm2action', 'action_modality_embed', 'proprio_projector', + 'behavior_adapter', 'behavior_global_projector', 'behavior_pbd') +MEMORY_RECEIVERS = ('behavior_pbd.phase_query', 'behavior_pbd.effect_project', + 'behavior_pbd.effect_attention', 'behavior_pbd.global_to_anchors') + + +def local(value): + return value.to_local() if hasattr(value, 'to_local') else value + + +def group(name): + return next((key for key in GROUPS if key in name), None) + + +def frozen_digest(model): + """Exact deterministic samples of every frozen tensor, plus gradient check.""" + digest = hashlib.sha256() + for name, param in model.named_parameters(): + if param.requires_grad: + continue + if param.grad is not None: + raise AssertionError(f'Frozen parameter has a gradient: {name}') + value = local(param).detach().reshape(-1) + if value.numel(): + count = min(32, value.numel()) + positions = (torch.arange(count, device=value.device, dtype=torch.long) + * (value.numel()-1) // max(1, count-1)) + digest.update(name.encode()) + digest.update(value[positions].float().cpu().numpy().tobytes()) + return digest.hexdigest() + + +def install_diagnostics(): + from cosmos_framework.model.generator.omni_mot_model import OmniMoTModel + original = OmniMoTModel._compute_losses + + def compute(self, out_net, data_batch_packed, gen_data_noised, *args, **kwargs): + total, metrics = original(self, out_net, data_batch_packed, gen_data_noised, *args, **kwargs) + masks = _MASKS.get() + predictions, truths, errors, switch_errors, switches, correct = [], [], [], [], [], [] + with torch.no_grad(): + for i, pred in enumerate(out_net.get('preds_action', [])): + if masks is None: + raise AssertionError('Pilot action diagnostics require real tail masks') + valid = masks['action'][i].to(pred.device, dtype=torch.bool).reshape(-1) + true = (gen_data_noised.epsilon_action[i]-gen_data_noised.vt_target_action[i]).float()[:, :7] + clean = (gen_data_noised.xt_tokens_action[i].float() + - gen_data_noised.sigmas_action[i].float()*pred.float())[:, :7] + if clean.shape[0] != valid.numel(): + raise AssertionError('Pilot action time axis differs from tail masks') + err = (clean-true).abs() + event = torch.zeros(len(true), device=true.device, dtype=torch.bool) + event[1:] = (true[1:, 6] > 0) != (true[:-1, 6] > 0) + event &= valid + predictions.append(clean[valid].cpu()) + truths.append(true[valid].cpu()) + errors.append(err[valid]) + switch_errors.append(err[event, 6].sum()) + switches.append(event.sum()) + correct.append(((clean[:, 6]>0) == (true[:, 6]>0))[event].sum()) + if errors: + axis = torch.cat(errors).mean(0) + for i in range(7): + metrics[f'pilot_x0_mae_{i}'] = axis[i] + count = torch.stack(switches).sum() + metrics['pilot_gripper_switch_count'] = count.float() + metrics['pilot_gripper_switch_abs_sum'] = torch.stack(switch_errors).sum() + metrics['pilot_gripper_switch_correct'] = torch.stack(correct).sum().float() + self._pilot_prediction = torch.cat(predictions) + self._pilot_truth = torch.cat(truths) + return total, metrics + + OmniMoTModel._compute_losses = compute + + +class BridgePilotMonitor(Callback): + def on_train_start(self, model, iteration=0): + self.directory = Path(os.environ['WIDOWX_RUN_DIR']) + self.directory.mkdir(parents=True, exist_ok=True) + self.rank = dist.get_rank() if dist.is_initialized() else 0 + self.world = dist.get_world_size() if dist.is_initialized() else 1 + self.start_time = time.monotonic() + self.initial = {name: local(param).detach().cpu().clone() for name, param in model.named_parameters() if param.requires_grad} + if any(group(name) is None for name in self.initial): + raise AssertionError('Backbone parameter unexpectedly trainable') + self.frozen = frozen_digest(model) + self.nonzero_groups = set() + self.nonzero_memory_receivers = set() + self.grads = {} + self.bit_count = 0 + self.sample_count = 0 + self.fixture_path = self.directory / f'probe_fixture_rank{self.rank}.pt' + self.fixture = torch.load(self.fixture_path, map_location='cpu', weights_only=False) if self.fixture_path.exists() else None + self.probes = [] + probe_dir = Path(os.environ['BRIDGE_STAGE2_BUNDLE']) / 'probes_v1' + probe_manifest = json.loads((probe_dir / 'manifest.json').read_text()) + from scripts.bridge_stage2_data import read_bundle + bundle = read_bundle(os.environ['BRIDGE_STAGE2_BUNDLE']) + if probe_manifest['feature_fingerprint'] != bundle['fingerprint'] or probe_manifest['world_size'] != self.world: + raise ValueError('Fixed probe bundle/topology mismatch') + for record in probe_manifest['records']: + if record['rank'] == self.rank: + path = probe_dir / record['file'] + if sha256_file(path) != record['sha256']: + raise ValueError(f'Fixed probe changed: {path}') + self.probes.append((record, torch.load(path, map_location='cpu', weights_only=False))) + if not self.rank: + spec = dict(trainable=[dict(name=name, shape=list(value.shape), local_numel=value.numel()) + for name,value in self.initial.items()], + global_trainable_numel=sum(p.numel() for p in model.parameters() if p.requires_grad), + global_frozen_numel=sum(p.numel() for p in model.parameters() if not p.requires_grad), + frozen_parameter_probe_sha256=self.frozen, + precision='bf16 with fp32 optimizer master', prior_dropout=0., + backbone_frozen=True, cte_loaded_in_policy=False) + (self.directory / f'parameters_at_{iteration}.json').write_text(json.dumps(spec, indent=2)+'\n') + if self.fixture is not None: + result = self.probe(model, iteration, 'reload') + reference_path = self.directory / f'probe_end_{iteration}_rank{self.rank}.pt' + if reference_path.exists(): + reference = torch.load(reference_path, weights_only=True) + error = float((reference-result['prediction']).abs().max()) + repeat = self.probe(model, iteration, 'reload_repeat') + repeat_error = float((result['prediction']-repeat['prediction']).abs().max()) + if not self.rank: + (self.directory / f'reload_diagnostic_{iteration}.json').write_text(json.dumps(dict( + step=iteration, cross_process_max_abs=error, + same_process_repeat_max_abs=repeat_error), indent=2)+'\n') + if error > 1e-5: + raise AssertionError(f'Full policy reload prediction mismatch: {error}; same-process repeat: {repeat_error}') + if not self.rank: + (self.directory / f'reload_{iteration}.json').write_text(json.dumps(dict( + step=iteration, full_forward_max_abs=error, passed=True), indent=2)+'\n') + self.fixed_bit_probes(model, iteration, 'reload' if iteration else 'start') + + def probe(self, model, iteration, tag, fixture=None, label=None): + py_state, np_state = random.getstate(), np.random.get_state() + old_cursor = getattr(model, '_widowx_data_cursor', None) + was_training = model.training + try: + model.eval() + with torch.random.fork_rng(devices=[torch.cuda.current_device()]), torch.no_grad(): + torch.manual_seed(7300+self.rank) + torch.cuda.manual_seed(7300+self.rank) + random.seed(7300+self.rank) + np.random.seed(7300+self.rank) + batch = misc.to(copy.deepcopy(self.fixture if fixture is None else fixture), device='cuda') + output, loss = model.training_step(batch, 0) + result = dict(step=iteration, tag=tag, loss=float(loss), + action_loss=float(output['flow_matching_loss_action']), + x0_mae=[float(output[f'pilot_x0_mae_{i}']) for i in range(7)], + gripper_switch_count=float(output['pilot_gripper_switch_count']), + gripper_switch_abs_sum=float(output['pilot_gripper_switch_abs_sum']), + gripper_switch_correct=float(output['pilot_gripper_switch_correct']), + prediction=model._pilot_prediction.clone()) + prefix = f'probe_{tag}_{iteration}_rank{self.rank}' if label is None else f'probe_{label}_{tag}_{iteration}_rank{self.rank}' + torch.save(result['prediction'], self.directory / f'{prefix}.pt') + (self.directory / f'{prefix}.json').write_text(json.dumps( + {k:v for k,v in result.items() if k!='prediction'}, indent=2)+'\n') + print(f'PILOT_FIXED_PROBE rank={self.rank} step={iteration} tag={tag} label={label} action_loss={result["action_loss"]:.6f}', flush=True) + return result + finally: + model.train(was_training) + model._widowx_data_cursor = old_cursor + random.setstate(py_state) + np.random.set_state(np_state) + + def fixed_bit_probes(self, model, iteration, tag): + for record, fixture in self.probes: + label = Path(record['file']).stem.rsplit('_rank', 1)[0] + result = self.probe(model, iteration, tag, fixture=fixture, label=label) + if tag == 'reload': + reference_path = self.directory / f'probe_{label}_end_{iteration}_rank{self.rank}.pt' + if not reference_path.exists(): + raise FileNotFoundError(f'Missing previous full-policy BIT probe: {reference_path}') + reference = torch.load(reference_path, weights_only=True) + error = float((reference-result['prediction']).abs().max()) + if error > 1e-5: + raise AssertionError(f'BIT probe reload mismatch {label}: {error}') + (self.directory / f'reload_{label}_{iteration}_rank{self.rank}.json').write_text( + json.dumps(dict(max_abs=error, passed=True), indent=2)+'\n') + + def on_training_step_start(self, model, data, iteration=0): + if time.monotonic()-self.start_time > 90*60: + raise TimeoutError('Pilot reached its 90-minute training wallclock limit') + if self.fixture is None: + self.fixture = copy.deepcopy(data) + torch.save(self.fixture, self.fixture_path) + self.probe(model, iteration, 'start') + masks = batch_vectors(data['behavior_effect_valid']) + self.current_bit_nonempty = any(bool(mask.any()) for mask in masks) + self.bit_count += sum(bool(mask.any()) for mask in masks) + self.sample_count += len(masks) + + def on_before_backward(self, model, loss, iteration=0): + if not torch.is_grad_enabled() or not loss.requires_grad or not torch.isfinite(loss): + raise AssertionError('Training lost autograd or produced a nonfinite loss') + + def on_after_backward(self, model, iteration=0): + values = torch.zeros(len(GROUPS), dtype=torch.float64, device='cuda') + memory_values = torch.zeros(len(MEMORY_RECEIVERS), dtype=torch.float64, device='cuda') + for name, param in model.named_parameters(): + if not param.requires_grad: + if param.grad is not None: + raise AssertionError(f'Frozen tensor received gradient: {name}') + continue + if param.grad is not None: + gradient = local(param.grad).detach().float() + if not torch.isfinite(gradient).all(): + raise FloatingPointError(f'Nonfinite gradient: {name}') + values[GROUPS.index(group(name))] += gradient.double().square().sum() + if self.current_bit_nonempty: + for i, receiver in enumerate(MEMORY_RECEIVERS): + if receiver in name: + memory_values[i] += gradient.double().square().sum() + if dist.is_initialized(): + dist.all_reduce(values) + dist.all_reduce(memory_values) + self.grads = {key: float(values[i].sqrt()) for i,key in enumerate(GROUPS)} + self.nonzero_groups.update(key for key,value in self.grads.items() if value>0) + self.nonzero_memory_receivers.update(key for i,key in enumerate(MEMORY_RECEIVERS) if memory_values[i]>0) + + def on_training_step_end(self, model, data_batch, output_batch, loss, iteration=0): + if iteration <= 5 or iteration % 10 == 0: + keys = ['flow_matching_loss_action', 'flow_matching_loss_vision', 'behavior_prior_nll'] + [f'pilot_x0_mae_{i}' for i in range(7)] + ['pilot_gripper_switch_count', 'pilot_gripper_switch_abs_sum', 'pilot_gripper_switch_correct'] + values = torch.tensor([float(output_batch[key]) for key in keys], device='cuda', dtype=torch.float64) + if dist.is_initialized(): + dist.all_reduce(values) + values /= self.world + counts = torch.tensor([self.bit_count, self.sample_count], device='cuda', dtype=torch.float64) + if dist.is_initialized(): + dist.all_reduce(counts) + record = dict(step=iteration, elapsed_seconds=time.monotonic()-self.start_time, + metrics=dict(zip(keys, values.cpu().tolist())), gradient_norms=self.grads, + bit_nonempty_fraction=float(counts[0]/counts[1]), samples_seen=int(counts[1])) + if not self.rank: + with (self.directory / 'pilot_metrics.jsonl').open('a') as stream: + stream.write(json.dumps(record)+'\n') + print('BRIDGE_PILOT_METRIC '+json.dumps(record), flush=True) + + def on_train_end(self, model, iteration=0): + if frozen_digest(model) != self.frozen: + raise AssertionError('Frozen parameter probe changed during pilot') + missing = set(GROUPS)-self.nonzero_groups + if missing: + raise AssertionError(f'Selected input groups never received gradients: {missing}') + missing = set(MEMORY_RECEIVERS)-self.nonzero_memory_receivers + if missing: + raise AssertionError(f'Memory receivers had no gradient on nonempty BIT batches: {missing}') + counts = torch.tensor([self.bit_count, self.sample_count], device='cuda', dtype=torch.float64) + if dist.is_initialized(): + dist.all_reduce(counts) + bit_fraction = float(counts[0]/counts[1]) + if bit_fraction < .70: + raise AssertionError(f'Too many empty BIT batches: nonempty fraction={bit_fraction}') + updates = torch.zeros(len(GROUPS), device='cuda', dtype=torch.float64) + for name,param in model.named_parameters(): + if name in self.initial: + delta = local(param).detach().float()-self.initial[name].to(param.device).float() + updates[GROUPS.index(group(name))] += delta.double().square().sum() + if dist.is_initialized(): + dist.all_reduce(updates) + if bool((updates <= 0).any()): + raise AssertionError('A selected module group never changed') + self.probe(model, iteration, 'end') + self.fixed_bit_probes(model, iteration, 'end') + if not self.rank: + result = dict(step=iteration, finite_gradients=True, all_selected_groups_received_gradient=True, + update_l2={key:float(updates[i].sqrt()) for i,key in enumerate(GROUPS)}, + frozen_parameter_probe_unchanged=True, elapsed_seconds=time.monotonic()-self.start_time, + bit_nonempty_fraction=bit_fraction, + memory_receivers_received_gradient=sorted(self.nonzero_memory_receivers), + passed=True) + (self.directory / f'engineering_{iteration}.json').write_text(json.dumps(result,indent=2)+'\n') + from scripts.report_bridge_stage2_pilot import write_report + write_report() diff --git a/releases/bridge-native-v3/code/scripts/bridge_stage2_pilot.toml b/releases/bridge-native-v3/code/scripts/bridge_stage2_pilot.toml new file mode 100644 index 0000000000000000000000000000000000000000..487f5ee7b772728d46d8b51aa9a4161c1d4b79b3 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_stage2_pilot.toml @@ -0,0 +1,26 @@ +[job] +task = "vfm" +experiment = "bridge_stage2_pilot_v2" +project = "Zeva" +group = "bridge_recovery_v2" +name = "support_train_only_pilot" +wandb_mode = "offline" +[model] +precision = "bfloat16" +[model.parallelism] +data_parallel_shard_degree = -1 +data_parallel_replicate_degree = 1 +[model.activation_checkpointing] +mode = "full" +[model.tokenizer] +vae_path = "${oc.env:WAN_VAE_PATH}" +[optimizer] +lr = 1e-5 +[dataloader_train] +max_samples_per_batch = 1 +[trainer] +max_iter = 50 +logging_iter = 10 +[checkpoint] +load_path = "${oc.env:BASE_CHECKPOINT_PATH}" +save_iter = 50 diff --git a/releases/bridge-native-v3/code/scripts/bridge_stage2_probes.py b/releases/bridge-native-v3/code/scripts/bridge_stage2_probes.py new file mode 100644 index 0000000000000000000000000000000000000000..1e99893f9f05fd0163a52a19dbccb9dc01abfbb5 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/bridge_stage2_probes.py @@ -0,0 +1,82 @@ +"""Fixed train/development BIT probes, built with the actual policy transform. + +These are single-noise, teacher-forced denoising probes, not rollout success +rates or full diffusion-solver action predictions. Development episodes were +seen by Stage1, but never by Stage2 updates or the support bank. +""" +from __future__ import annotations + +import argparse +from collections import deque +import json +from pathlib import Path + +import torch + +from scripts.bridge_cte_data import canonical_instruction +from scripts.bridge_recovery_contract import sha256_file +from scripts.bridge_stage2_data import BridgePilotDataset, read_bundle + + +def pack_sample(sample): + """Use the same collate/split/pack methods as the training loader.""" + from cosmos_framework.data.generator.joint_dataloader import JointDataLoader, custom_collate_fn + loader = object.__new__(JointDataLoader) + loader.buffers = [deque()] + loader.dataloaders = [iter([custom_collate_fn([sample])])] + packed = {} + loader._update_output_batch(packed, loader._get_next_sample(0)) + packed['_num_samples'] = 1 + return packed + + +def main(): + from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline + from omegaconf import OmegaConf + + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--bundle', type=Path, default=Path('.artifacts/bridge_stage2_pilot_v2')) + args = parser.parse_args() + torch.set_num_threads(2) + bundle = read_bundle(args.bundle) + directory = args.bundle / 'probes_v1' + if directory.exists(): + raise FileExistsError('Fixed probe fixtures are immutable') + config = OmegaConf.load(args.bundle / 'train/runtime/Zeva/bridge_recovery_v2/support_train_only_pilot/config.yaml') + transform = ActionTransformPipeline(tokenizer_config=config.model.config.vlm_config.tokenizer, + max_action_dim=64, format_prompt_as_json=True) + directory.mkdir() + records = [] + for partition in ('train', 'development'): + dataset = BridgePilotDataset(args.bundle, partition) + for task_index, task in enumerate(bundle['contract']['task_names']): + eligible = [ep for ep in dataset.episodes if canonical_instruction(ep['tasks'][0]) == task] + for rank, episode in enumerate(eligible[:2]): + eid = episode['episode_index'] + # A completed effect is available at boundary 16, with at + # least 17 real action labels for all chosen episodes. + index = dataset.windows.index((eid, 16)) + raw = dataset[index] + valid = raw['widowx_action_valid'] + gripper = raw['action'][valid, 6] > 0 + switch_count = int((gripper[1:] != gripper[:-1]).sum()) + if not raw['behavior_effect_valid'].any(): + raise AssertionError('A BIT probe cannot have an empty effect history') + packed = pack_sample(transform(raw, '256')) + name = f'{partition}_task{task_index}_rank{rank}.pt' + torch.save(packed, directory / name) + records.append(dict(file=name, rank=rank, partition=partition, task=task, + episode_id=eid, start=16, real_action_rows=int(valid.sum()), + gripper_switches=switch_count, bit_nonempty=True, + sha256=sha256_file(directory / name))) + manifest = dict(version='bridge_fixed_denoising_probes_v1', + feature_fingerprint=bundle['fingerprint'], world_size=2, + source_sha256=sha256_file(__file__), + protocol='fixed per-rank RNG; same 7D valid rows; single-noise teacher-forced x0 error', + records=records) + (directory / 'manifest.json').write_text(json.dumps(manifest, indent=2)+'\n') + print(json.dumps(manifest, indent=2), flush=True) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/build_bridge_static_bank.py b/releases/bridge-native-v3/code/scripts/build_bridge_static_bank.py new file mode 100644 index 0000000000000000000000000000000000000000..ea891a456d2ff2f029096eb8d3329af289e504fc --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/build_bridge_static_bank.py @@ -0,0 +1,386 @@ +"""Export a bounded, independent Bridge support bank; no training or query cache. + +The per-trajectory entry schema follows Zeva's released RoboCasa bank. The +temporal pooling rule below is explicitly Bridge-versioned: the original +RoboCasa bank-export script is not included in the release available here. +""" +from __future__ import annotations + +import argparse +from collections import Counter +from datetime import datetime, timezone +import fcntl +import json +import os +from pathlib import Path +import subprocess +import time + +import numpy as np +import torch +from torch.nn import functional as F +from torch.utils.data import DataLoader + +from scripts.bridge_cte_data import BridgeCTEDataset, canonical_instruction, load_metadata +from scripts.bridge_recovery_contract import ROOT, cte_identity, sha256_file, sha256_json +from scripts.train_bridge_cte import FrozenFrameEncoder, atomic_json, model_digest +from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig +from cosmos_framework.model.zeva.static_task_context_retrieval import retrieve_static_task_context + + +FORMAT = 'bridge_per_trajectory_static_bank_v1' +PROVIDER = 'support_cte_singleframe256_per_trajectory_temporal_mean_v1' + + +def choose_support(episodes, excluded_ids, count, seed): + """Uniform episode sampling, not task balancing or sampling with replacement.""" + if count < 1: + raise ValueError('Support count must be positive') + eligible = [e for e in episodes if e['episode_index'] not in excluded_ids + and e['length'] >= 17 and len(e['tasks']) == 1 + and canonical_instruction(e['tasks'][0])] + if len({e['episode_index'] for e in eligible}) != len(eligible): + raise ValueError('Duplicate eligible episode IDs') + if len(eligible) < count: + raise ValueError(f'Only {len(eligible)} eligible episodes, need {count}') + order = np.random.default_rng(seed).permutation(len(eligible))[:count] + return [eligible[int(i)] for i in order], len(eligible) + + +def pool_trajectory(retrieval, state, valid): + """Mean over observed boundaries only, then normalize the 128-D key.""" + if retrieval.ndim != 2 or state.ndim != 2 or valid.shape != retrieval.shape[:1]: + raise ValueError('Expected unbatched time x channel tensors and time mask') + if retrieval.shape != (len(valid), 128) or state.shape != (len(valid), 256): + raise ValueError('Expected key dim 128 and value dim 256') + if valid.dtype != torch.bool or not bool(valid.any()): + raise ValueError('Need at least one valid boundary') + key = retrieval[valid].float().mean(0) + value = state[valid].float().mean(0) + if not torch.isfinite(key).all() or not torch.isfinite(value).all() or key.norm() < 1e-8: + raise ValueError('Invalid pooled feature') + return F.normalize(key, dim=0).cpu().contiguous(), value.cpu().contiguous() + + +def atomic_save(path, payload): + temporary = path.with_name(path.name + f'.{os.getpid()}.tmp') + torch.save(payload, temporary) + temporary.replace(path) + + +def immutable_json(path, payload): + if path.exists(): + # JSON turns checkpoint tuples (e.g. effect_target_grid) into lists. + # Compare the canonical serialized content, not Python container types. + if sha256_json(json.loads(path.read_text())) != sha256_json(payload): + raise ValueError(f'Immutable plan differs: {path}; choose a new output directory') + else: + atomic_json(path, payload) + + +def check_gpu(gpu, own_pid=None): + """Never signal other processes; stop our own work if the GPU is taken.""" + uuid, free = subprocess.check_output( + ['nvidia-smi', '-i', str(gpu), '--query-gpu=uuid,memory.free', '--format=csv,noheader,nounits'], + text=True).strip().split(',') + processes = subprocess.check_output( + ['nvidia-smi', '--query-compute-apps=gpu_uuid,pid', '--format=csv,noheader,nounits'], text=True) + others = [int(line.split(',')[1]) for line in processes.splitlines() + if line.split(',')[0].strip() == uuid.strip() + and int(line.split(',')[1]) != own_pid] + if others or (own_pid is None and int(free.strip()) < 16000): + raise RuntimeError(f'GPU {gpu} is not free; other PIDs={others}, free MiB={free.strip()}') + return uuid.strip() + + +def worker_init(_): + torch.set_num_threads(1) + import pyarrow as pa + pa.set_cpu_count(1) + pa.set_io_thread_count(1) + + +def prepare_plan(args, checkpoint): + split_path = args.checkpoint.parent.parent / 'split.json' + split = json.loads(split_path.read_text()) + identity = cte_identity(checkpoint, args.checkpoint, split_path) + identity['static_retrieval_preprocess_id'] = PROVIDER + root = Path(identity['dataset']) + for name, expected in identity['dataset_metadata_sha256'].items(): + if sha256_file(root / 'meta' / name) != expected: + raise ValueError(f'Dataset metadata changed: {name}') + for name, expected in identity['source_code_sha256'].items(): + if sha256_file(ROOT / name) != expected: + raise ValueError(f'Stage1 source changed: {name}') + if sha256_file(checkpoint['contract']['vae_path']) != identity['vae_sha256']: + raise ValueError('VAE source weights changed') + info, train, val = load_metadata(root, checkpoint['contract']['seed'], checkpoint['contract']['val_fraction']) + if [e['episode_index'] for e in train] != split['train'] or [e['episode_index'] for e in val] != split['validation']: + raise ValueError('Original Stage1 split changed') + excluded, exclusions = set(), [] + for path in args.exclude_manifest: + manifest = json.loads(path.read_text()) + if manifest['contract']['identity']['dataset'] != str(root): + raise ValueError(f'Exclusion manifest uses another dataset: {path}') + groups = manifest['contract']['episode_ids'] + ids = set(sum(groups.values(), [])) + excluded.update(ids) + exclusions.append(dict(path=str(path.resolve()), sha256=sha256_file(path), episode_ids=sorted(ids))) + selected, eligible_count = choose_support(train, excluded, args.count, args.seed) + all_metadata = [json.loads(line) for line in (root / 'meta/episodes.jsonl').read_text().splitlines()] + source_indices = {e['episode_index']: index for index, e in enumerate(all_metadata)} + records = [] + for ep in selected: + eid = ep['episode_index'] + fmt = dict(episode_index=eid, episode_chunk=eid // info.get('chunks_size', 1000), + video_key='observation.images.image_0') + records.append(dict(episode_id=eid, source_index=source_indices[eid], raw_length=ep['length'], + instruction=ep['tasks'][0], canonical_instruction=canonical_instruction(ep['tasks'][0]), + parquet=info['data_path'].format(**fmt), video=info['video_path'].format(**fmt))) + selection = dict(version='bridge_independent_support_selection_v1', seed=args.seed, count=args.count, + strategy='uniform_without_replacement_from_original_stage1_train', + filters='one nonempty canonical instruction; raw_length >= 17; exclude all pilot partitions', + eligible_count=eligible_count, exclusions=exclusions, episodes=records) + support_ids = {e['episode_id'] for e in records} + if support_ids & (set(split['validation']) | excluded): + raise AssertionError('Support/query or support/validation overlap') + partitions = dict(version='bridge_static_support_query_partition_v1', + support_episode_ids=sorted(support_ids), + train_query_candidate_episode_ids=[i for i in split['train'] if i not in support_ids], + validation_episode_ids=split['validation'], + requirement='Future query loaders must exclude support IDs, even if query features are causal.', + development_note='Existing pilot development remains held out by its own manifest.') + contract = dict(version=FORMAT, identity=identity, selection_sha256=sha256_json(selection), + partitions_sha256=sha256_json(partitions), + key_pooling='L2_normalize(mean_t(CTE.retrieval.float32[valid_t]))', + value_pooling='mean_t(CTE.causal_interaction_state.float32[valid_t])', + task_pooling=False, complete_support_trajectories=True, + query_future_used=False, retrieval_head=None, + retrieval_head_status='Bridge policy-readout Q head not trained; RoboCasa head forbidden', + original_export_equivalence='Per-trajectory schema only; original time-pooling exporter unavailable', + default_retrieval=dict(top_k=5, temperature=.07), + frame_microbatch=args.microbatch, episode_batch_size=1, + numerics=dict(torch=str(torch.__version__), cuda=torch.version.cuda, + cudnn=torch.backends.cudnn.version(), cudnn_benchmark=True, + cudnn_deterministic=False, cudnn_allow_tf32=torch.backends.cudnn.allow_tf32, + matmul_allow_tf32=torch.backends.cuda.matmul.allow_tf32, + vae_dtype='bfloat16', cte_autocast='bfloat16', pooled_storage='float32', + note='Zeva defaults; autotuned live re-encoding is not guaranteed bitwise identical'), + producer_source_sha256={str(p.relative_to(ROOT)): sha256_file(p) for p in + (Path(__file__).resolve(), ROOT / 'scripts/bridge_recovery_contract.py')}) + fingerprint = sha256_json(contract) + immutable_json(args.output / 'selection.json', selection) + immutable_json(args.output / 'partitions.json', partitions) + immutable_json(args.output / 'contract.json', dict(contract=contract, fingerprint=fingerprint)) + return info, selected, records, contract, fingerprint + + +def validate_bank(bank, selection, partitions): + entries = bank['entries'] + ids = [e['episode_id'] for e in entries] + if ids != [e['episode_id'] for e in selection['episodes']] or len(set(ids)) != selection['count']: + raise ValueError('Wrong support count/order or duplicate episodes') + forbidden = set(partitions['validation_episode_ids']) + for excluded in selection['exclusions']: + forbidden.update(excluded['episode_ids']) + if set(ids) & forbidden or set(ids) & set(partitions['train_query_candidate_episode_ids']): + raise ValueError('Support/query overlap') + keys = torch.stack([e['retrieval_key'] for e in entries]) + values = torch.stack([e['behavior_value'] for e in entries]) + if keys.shape != (len(ids), 128) or values.shape != (len(ids), 256): + raise ValueError('Bank dimensions differ from per-trajectory schema') + if not torch.isfinite(keys).all() or not torch.isfinite(values).all(): + raise ValueError('Nonfinite bank feature') + torch.testing.assert_close(keys.norm(dim=-1), torch.ones(len(ids)), atol=1e-6, rtol=0) + if min(e['completed_effect_windows'] for e in entries) < 1: + raise ValueError('Episode without a completed effect window') + queries = torch.randn((3, 128), generator=torch.Generator().manual_seed(71)) + k = min(5, len(ids)) + result, indices, scores = retrieve_static_task_context(queries, keys, values, top_k=k, temperature=.07) + manual = (scores.div(.07).softmax(-1).unsqueeze(-1) * values[indices]).sum(1) + torch.testing.assert_close(result, manual, rtol=1e-5, atol=1e-6) + if result.shape != (3, 256) or not torch.isfinite(result).all(): + raise ValueError('Retrieval operator failed') + tasks = Counter(e['canonical_instruction'] for e in entries) + lengths = np.array([e['raw_length'] for e in entries]) + singular = torch.linalg.svdvals(keys - keys.mean(0)) + energy = singular.square() + probabilities = energy / energy.sum().clamp_min(1e-20) + effective_rank = float((-(probabilities * probabilities.clamp_min(1e-20).log()).sum()).exp()) + return dict(passed=True, entries=len(entries), distinct_canonical_instructions=len(tasks), + raw_frames=int(lengths.sum()), encoded_boundaries=sum(e['length'] for e in entries), + completed_effect_windows=sum(e['completed_effect_windows'] for e in entries), + raw_length_min=int(lengths.min()), raw_length_median=float(np.median(lengths)), + raw_length_max=int(lengths.max()), key_shape=list(keys.shape), value_shape=list(values.shape), + key_norm_max_abs_error=float((keys.norm(dim=-1)-1).abs().max()), + centered_key_effective_rank=effective_rank, + raw_feature_tensor_bytes=keys.numel()*keys.element_size()+values.numel()*values.element_size(), + support_validation_overlap=0, support_existing_pilot_overlap=0, support_query_overlap=0, + retrieval_operator_test='Synthetic Q / top-5 cosine + softmax operator only; NOT learned retrieval accuracy', + top_instructions=tasks.most_common(20), stage1_or_stage2_gradient_updates=0) + + +def verify_completed(output): + manifest = json.loads((output / 'manifest.json').read_text()) + for name, expected in manifest['artifact_sha256'].items(): + if sha256_file(output / name) != expected: + raise ValueError(f'Artifact changed: {name}') + contract = json.loads((output / 'contract.json').read_text()) + if sha256_json(contract['contract']) != contract['fingerprint'] or contract['fingerprint'] != manifest['fingerprint']: + raise ValueError('Contract fingerprint mismatch') + bank = torch.load(output / 'static_bank.pt', map_location='cpu', weights_only=True) + if bank['format'] != FORMAT or bank['fingerprint'] != contract['fingerprint']: + raise ValueError('Bank identity mismatch') + result = validate_bank(bank, json.loads((output / 'selection.json').read_text()), + json.loads((output / 'partitions.json').read_text())) + print('BANK_VERIFIED ' + json.dumps(result), flush=True) + return result + + +def build(args): + if (args.output / 'manifest.json').exists(): + verify_completed(args.output) + return + checkpoint = torch.load(args.checkpoint, map_location='cpu', weights_only=False) + info, selected, records, contract, fingerprint = prepare_plan(args, checkpoint) + print(f'PLAN count={len(selected)} fingerprint={fingerprint}', flush=True) + if args.plan_only: + return + if os.environ.get('CUDA_VISIBLE_DEVICES') != str(args.gpu): + raise ValueError('Set CUDA_VISIBLE_DEVICES to exactly --gpu before starting Python') + gpu_uuid = check_gpu(args.gpu) + torch.cuda.set_device(0) + torch.cuda.set_per_process_memory_fraction(args.memory_gib * 1024**3 / torch.cuda.get_device_properties(0).total_memory) + torch.backends.cudnn.benchmark = True + torch.backends.cudnn.deterministic = False + torch.manual_seed(args.seed) + shard_dir = args.output / 'shards' + shard_dir.mkdir(exist_ok=True) + entries = [] + for shard in sorted(shard_dir.glob('part_*.pt')): + payload = torch.load(shard, map_location='cpu', weights_only=True) + if payload['fingerprint'] != fingerprint or payload['start'] != len(entries): + raise ValueError(f'Invalid resume shard: {shard}') + entries.extend(payload['entries']) + if [e['episode_id'] for e in entries] != [e['episode_id'] for e in records[:len(entries)]]: + raise ValueError('Resume IDs do not match selected episodes') + model = CausalTransitionEncoder(CausalTransitionEncoderConfig(**checkpoint['model_config'])).to('cuda:0').eval() + model.load_state_dict(checkpoint['model'], strict=True) + model.requires_grad_(False) + initial_model_digest = model_digest(model) + encoder = FrozenFrameEncoder(checkpoint['contract']['vae_path'], torch.device('cuda:0'), microbatch=args.microbatch) + encoder.vae.model.eval() + if any(p.requires_grad for p in model.parameters()) or any(p.requires_grad for p in encoder.vae.model.parameters()): + raise AssertionError('CTE and VAE must both be frozen') + source = Path(contract['identity']['dataset']) + dataset = BridgeCTEDataset(source, info, selected[len(entries):]) + loader_args = dict(batch_size=None, num_workers=args.workers, pin_memory=True, + generator=torch.Generator().manual_seed(args.seed), worker_init_fn=worker_init) + if args.workers: + loader_args.update(multiprocessing_context='spawn', prefetch_factor=2) + loader = DataLoader(dataset, **loader_args) + start_time, resumed = time.monotonic(), len(entries) + pending, shard_start = [], len(entries) + for item in loader: + index = len(entries) + record = records[index] + if item['episode_id'] != record['episode_id']: + raise AssertionError('Loader order differs from immutable selection') + count = len(item['frames']) + with torch.no_grad(): + latents = encoder(dict(frames=item['frames'], valid=torch.ones(1, count, dtype=torch.bool))) + valid = torch.ones(1, count, device='cuda:0', dtype=torch.bool) + with torch.autocast('cuda', dtype=torch.bfloat16): + output = model(latents, item['actions'].to('cuda:0').unsqueeze(0), valid) + key, value = pool_trajectory(output['retrieval'][0], output['causal_interaction_state'][0], valid[0]) + completed = int(output['effect_complete'].sum()) + if count != (record['raw_length']-1)//4+1 or completed != (record['raw_length']-1)//16: + raise AssertionError('Boundary/effect window alignment failed') + entry = dict(record, length=count, retrieval_key=key, behavior_value=value, + completed_effect_windows=completed, + source_sha256={name: sha256_file(source / record[name]) for name in ('parquet', 'video')}) + entries.append(entry) + pending.append(entry) + del output, latents + if len(pending) >= args.shard_size or len(entries) == len(records): + shard = shard_dir / f'part_{shard_start:06d}.pt' + if shard.exists(): + raise FileExistsError(shard) + atomic_save(shard, dict(fingerprint=fingerprint, start=shard_start, entries=pending)) + pending, shard_start = [], len(entries) + check_gpu(args.gpu, own_pid=os.getpid()) + if len(entries) % 10 == 0 or len(entries) == resumed+1 or len(entries) == len(records): + elapsed = time.monotonic()-start_time + rate = (len(entries)-resumed)/max(elapsed, 1e-6) + progress = dict(status='encoding', encoded=len(entries), total=len(records), + safely_saved=shard_start, elapsed_this_run_seconds=elapsed, + episodes_per_second=rate, eta_seconds=(len(records)-len(entries))/rate, + gpu=args.gpu, gpu_uuid=gpu_uuid, pid=os.getpid(), + max_allocated_gib=torch.cuda.max_memory_allocated()/1024**3, + max_reserved_gib=torch.cuda.max_memory_reserved()/1024**3) + atomic_json(args.output / 'progress.json', progress) + print('PROGRESS ' + json.dumps(progress), flush=True) + if model_digest(model) != initial_model_digest: + raise AssertionError('Frozen CTE was modified') + bank = dict(format=FORMAT, fingerprint=fingerprint, schema_version='per_trajectory_key128_value256_v1', + action_space=contract['identity']['action_contract_id'], visual_input=contract['identity']['cte_preprocess_id'], + cte_checkpoint_sha256=contract['identity']['cte_checkpoint_sha256'], entries=entries, + support_episode_ids=[e['episode_id'] for e in entries], retrieval_head=None, + key_pooling=contract['key_pooling'], value_pooling=contract['value_pooling']) + selection = json.loads((args.output / 'selection.json').read_text()) + partitions = json.loads((args.output / 'partitions.json').read_text()) + diagnostics = validate_bank(bank, selection, partitions) + atomic_save(args.output / 'static_bank.pt', bank) + reloaded = torch.load(args.output / 'static_bank.pt', map_location='cpu', weights_only=True) + for before, after in zip(entries, reloaded['entries'], strict=True): + for name in ('retrieval_key', 'behavior_value'): + torch.testing.assert_close(before[name], after[name], rtol=0, atol=0) + diagnostics['exact_saved_feature_roundtrip'] = True + atomic_json(args.output / 'diagnostics.json', diagnostics) + files = [args.output / name for name in ('static_bank.pt', 'selection.json', 'partitions.json', 'contract.json', 'diagnostics.json')] + files.extend(sorted(shard_dir.glob('part_*.pt'))) + manifest = dict(format=FORMAT, fingerprint=fingerprint, completed_at=datetime.now(timezone.utc).isoformat(), + artifact_sha256={str(p.relative_to(args.output)): sha256_file(p) for p in files}, + bank_bytes=(args.output / 'static_bank.pt').stat().st_size, + stage1_frozen=True, vae_frozen=True, gradient_updates=0, + gpu=args.gpu, gpu_uuid=gpu_uuid, gpu_name=torch.cuda.get_device_name(0), + elapsed_this_run_seconds=time.monotonic()-start_time, resumed_entries=resumed, + diagnostics=diagnostics, + consumer_status='Not wired into existing pilot; new Bridge Q head or explicitly labelled train-only selector required') + atomic_json(args.output / 'manifest.json', manifest) + atomic_json(args.output / 'progress.json', dict(status='complete', encoded=len(entries), total=len(records), + fingerprint=fingerprint)) + verify_completed(args.output) + print(f'BANK_COMPLETE {args.output.resolve()}', flush=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output', type=Path, default=Path('.artifacts/bridge_static_bank_3000_cte30k_v1')) + parser.add_argument('--checkpoint', type=Path, default=Path('.artifacts/bridge_cte_stage1_20260924/checkpoints/cte_step_000030000.pt')) + parser.add_argument('--exclude-manifest', type=Path, action='append', default=None) + parser.add_argument('--count', type=int, default=3000) + parser.add_argument('--seed', type=int, default=20260925) + parser.add_argument('--gpu', type=int, default=7) + parser.add_argument('--memory-gib', type=float, default=12.) + parser.add_argument('--microbatch', type=int, default=4) + parser.add_argument('--workers', type=int, default=2) + parser.add_argument('--shard-size', type=int, default=50) + parser.add_argument('--plan-only', action='store_true') + parser.add_argument('--verify-only', action='store_true') + args = parser.parse_args() + if args.microbatch < 1 or args.shard_size < 1 or args.workers < 0 or args.memory_gib <= 0: + parser.error('Invalid batch / worker / memory settings') + args.exclude_manifest = args.exclude_manifest or [Path('.artifacts/bridge_stage2_pilot_v2/manifest.json')] + torch.set_num_threads(2) + if args.verify_only: + verify_completed(args.output) + return + args.output.mkdir(parents=True, exist_ok=True) + with (args.output / 'build.lock').open('a') as lock: + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + build(args) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/check_bridge_cte_golden_v2.py b/releases/bridge-native-v3/code/scripts/check_bridge_cte_golden_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..73023adbd5a80f004446275116c5f061f24f67d7 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/check_bridge_cte_golden_v2.py @@ -0,0 +1,140 @@ +"""One-GPU, real-frame golden test of Bridge CTE offline/online Wan paths.""" +from __future__ import annotations + +import argparse +import json +import os +from pathlib import Path +import subprocess + +import numpy as np +import torch + +from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig +from scripts.bridge_cte_data import BridgeCTEDataset, load_metadata +from scripts.bridge_recovery_contract import encode_cte_single_frame, sha256_file +from scripts.bridge_stage2_data import read_bundle +from scripts.train_bridge_cte import FrozenFrameEncoder + + +OUTPUT = Path('.artifacts/bridge_zeva_recovery_v2/preprocess_golden.json') +RUN = Path('.artifacts/bridge_cte_stage1_20260924') +CHECKPOINT = RUN / 'checkpoints/cte_step_000020000.pt' + + +@torch.no_grad() +def encode_model(model, frames, actions): + with torch.autocast('cuda', dtype=torch.bfloat16): + return model(frames, actions, torch.ones(frames.shape[:2], dtype=torch.bool, device=frames.device)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--checkpoint', type=Path, default=CHECKPOINT) + parser.add_argument('--output', type=Path, default=OUTPUT) + parser.add_argument('--bundle', type=Path) + parser.add_argument('--episode', type=int) + args = parser.parse_args() + if (args.bundle is None) != (args.episode is None): + parser.error('--bundle and --episode must be supplied together') + if not torch.cuda.is_available(): + raise RuntimeError('This golden test needs one free GPU') + visible = os.environ.get('CUDA_VISIBLE_DEVICES', '').split(',') + if len(visible) != 1 or not visible[0].isdigit(): + raise ValueError('Select exactly one physical GPU with CUDA_VISIBLE_DEVICES') + gpu_rows = subprocess.check_output(['nvidia-smi', '--query-gpu=index,memory.used,utilization.gpu', + '--format=csv,noheader,nounits'], text=True) + rows = {int(parts[0]): (int(parts[1]), int(parts[2])) + for line in gpu_rows.splitlines() for parts in [line.split(',')]} + used, utilization = rows[int(visible[0])] + if used > 24000 or utilization > 5: + raise RuntimeError(f'Selected GPU is too busy for a shared, bounded check: {used} MiB, {utilization}%') + torch.cuda.set_device(0) + torch.cuda.set_per_process_memory_fraction(.10) + torch.set_num_threads(2) + manifest = json.loads((RUN / 'manifest.json').read_text()) + dataset_root = Path(manifest['contract']['dataset']) + info, _, validation = load_metadata(dataset_root, manifest['contract']['seed'], manifest['contract']['val_fraction']) + selected = next(ep for ep in validation if ep['length'] >= 21) + sample = BridgeCTEDataset(dataset_root, info, [selected])[0] + frames_uint8 = sample['frames'][:5] + vae = FrozenFrameEncoder(manifest['contract']['vae_path'], torch.device('cuda:0'), microbatch=4) + with torch.no_grad(): + offline = vae(dict(frames=frames_uint8, valid=torch.ones(1, len(frames_uint8), dtype=torch.bool)))[0] + vae.microbatch = 1 + offline_singleton = vae(dict(frames=frames_uint8, valid=torch.ones(1, len(frames_uint8), dtype=torch.bool)))[0] + online = torch.stack([encode_cte_single_frame( + vae.vae.encode, frame.permute(1, 2, 0).numpy(), torch.device('cuda:0')) + for frame in frames_uint8]) + latent_diff = (offline.float() - online).abs() + singleton_diff = (offline_singleton.float() - online).abs() + payload = torch.load(args.checkpoint, map_location='cpu', weights_only=False) + model = CausalTransitionEncoder(CausalTransitionEncoderConfig(**payload['model_config'])).to('cuda:0').eval() + model.load_state_dict(payload['model'], strict=True) + model.requires_grad_(False) + actions = sample['actions'][:4].to('cuda:0').unsqueeze(0) + full_offline = encode_model(model, offline.unsqueeze(0), actions) + full_online = encode_model(model, online.unsqueeze(0), actions) + prefix = encode_model(model, online[:4].unsqueeze(0), actions[:, :3]) + fields = ('phase', 'retrieval', 'effect_post', 'effect_outcome_pre', 'effect_outcome_post') + comparisons = {} + for field in fields: + offline_value = full_offline[field].float() + online_value = full_online[field].float() + comparisons[field] = dict(offline_online_max_abs=float((offline_value-online_value).abs().max()) + if offline_value.numel() else None) + if field in ('phase', 'retrieval'): + prefix_value = prefix[field].float() + comparisons[field]['prefix_full_max_abs'] = float((prefix_value-online_value[:, :4]).abs().max()) + if field == 'effect_post': + comparisons[field]['complete_window_count'] = int(full_online['effect_complete'].sum()) + comparisons[field]['prefix_complete_window_count'] = int(prefix['effect_complete'].sum()) + output = dict(episode_id=sample['episode_id'], checkpoint=str(args.checkpoint), + checkpoint_sha256=sha256_file(args.checkpoint), + frame_shape=list(frames_uint8.shape), offline_dtype=str(offline.dtype), + online_dtype=str(online.dtype), latent_shape=list(offline.shape), + latent_max_abs=float(latent_diff.max()), latent_mean_abs=float(latent_diff.mean()), + latent_exact_equal=bool(torch.equal(offline.float(), online)), + singleton_latent_max_abs=float(singleton_diff.max()), + singleton_latent_exact_equal=bool(torch.equal(offline_singleton.float(), online)), + comparisons=comparisons, + note='Same real Bridge RGB frames; CTE sees only completed transitions. The prefix has 12 controls, so no effect token; the full 16-control sequence has one.') + if args.bundle is not None: + manifest = read_bundle(args.bundle) + if manifest['contract']['identity']['cte_checkpoint_sha256'] != output['checkpoint_sha256']: + raise ValueError('Query cache was built with a different CTE') + train_ids = set(manifest['contract']['episode_ids']['train']) + if args.episode not in train_ids: + raise ValueError('Requested episode is not a train query') + query_ep = next(ep for ep in load_metadata(dataset_root, + manifest['contract']['seed'], .02)[1] if ep['episode_index'] == args.episode) + query = BridgeCTEDataset(dataset_root, info, [query_ep])[0] + vae.microbatch = 4 + with torch.no_grad(): + query_latents = vae(dict(frames=query['frames'], + valid=torch.ones(1, len(query['frames']), dtype=torch.bool)))[0] + query_result = encode_model(model, query_latents.unsqueeze(0), query['actions'].to('cuda:0').unsqueeze(0)) + cache = torch.load(args.bundle / 'features/train' / f'episode_{args.episode:06d}.pt', + map_location='cpu', weights_only=True) + if cache['fingerprint'] != manifest['fingerprint']: + raise ValueError('Cached query fingerprint differs from bundle') + phase_error = float((cache['behavior_phase']-query_result['phase'][0].float().cpu()).abs().max()) + complete = query_result['effect_post'][0, query_result['effect_complete'][0]].float().cpu() + if not 0 < len(complete) <= 4: + raise ValueError('Query probe needs one to four complete effects') + effect_error = float((cache['behavior_effect'][-1, -len(complete):] - complete).abs().max()) + if phase_error > .005 or effect_error > .005: + raise AssertionError(f'Real query feature mismatch: phase={phase_error}, effect={effect_error}') + output['cached_query_check'] = dict(episode_id=args.episode, + feature_fingerprint=manifest['fingerprint'], + phase_max_abs=phase_error, effect_post_max_abs=effect_error, + completed_effects=int(query_result['effect_complete'].sum()), passed=True) + args.output.parent.mkdir(parents=True, exist_ok=True) + if args.output.exists(): + raise FileExistsError(f'Refusing to overwrite prior golden result: {args.output}') + args.output.write_text(json.dumps(output, indent=2) + '\n') + print(json.dumps(output, indent=2), flush=True) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/check_sapien_gpu.py b/releases/bridge-native-v3/code/scripts/check_sapien_gpu.py new file mode 100644 index 0000000000000000000000000000000000000000..5e18ab78110cdc4c3a79f2a66f4ace0e8a313dc9 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/check_sapien_gpu.py @@ -0,0 +1,30 @@ +"""Fail before rollout if legacy SAPIEN maps CUDA to the wrong physical GPU.""" +import argparse +import os +import subprocess + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--expected-uuid', required=True) + args = parser.parse_args() + import sapien.core as sapien + engine = sapien.Engine() + renderer = sapien.SapienRenderer(device='cuda:0', offscreen_only=True) + engine.set_renderer(renderer) + lines = subprocess.check_output([ + 'nvidia-smi', '--query-compute-apps=gpu_uuid,pid', '--format=csv,noheader' + ], text=True).splitlines() + actual = {uuid.strip() for uuid, pid in (line.split(',') for line in lines) + if pid.strip() == str(os.getpid())} + if actual != {args.expected_uuid}: + raise RuntimeError( + f'SAPIEN physical GPU mismatch: expected {args.expected_uuid}, got {sorted(actual)}. ' + 'This legacy renderer can confuse equal PCI bus numbers in different domains. ' + 'No rollout was started; choose a verified free renderer GPU.' + ) + print(f'SAPIEN_GPU_VERIFIED uuid={args.expected_uuid}', flush=True) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/check_simpler_reached_state_v2.py b/releases/bridge-native-v3/code/scripts/check_simpler_reached_state_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..bc4a65992133a516188ab8afe10893c6b3f786d5 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/check_simpler_reached_state_v2.py @@ -0,0 +1,43 @@ +"""One reset/one neutral simulated control, with no policy or training.""" +from __future__ import annotations + +import json +from pathlib import Path + +import numpy as np +import simpler_env + +from scripts.bridge_recovery_contract import normalize_reached_delta, reached_delta_raw +from scripts.eval_widowx_simpler import proprio + + +OUTPUT = Path('.artifacts/bridge_zeva_recovery_v2/simpler_reached_state_probe.json') + + +def main(): + env = simpler_env.make('widowx_carrot_on_plate', renderer_kwargs=dict(device='cuda:0', offscreen_only=True)) + try: + obs, _ = env.reset(seed=20260924) + before = proprio(env, 'bridge_tool') + command = np.array([0, 0, 0, 0, 0, 0, 1], np.float32) + _, _, terminated, truncated, info = env.step(command) + after = proprio(env, 'bridge_tool') + raw = reached_delta_raw(before[:6], after[:6], command[6]) + output = dict(seed=20260924, task='widowx_carrot_on_plate', + robot_state_source='env.unwrapped.agent.robot.pose.inv() * env.unwrapped.tcp.pose', + proprio_convention='bridge_tool', command=command.tolist(), + before=before.tolist(), after=after.tolist(), + reached_delta_raw=raw.tolist(), + reached_delta_normalized=normalize_reached_delta(raw).tolist(), + terminated=bool(terminated), truncated=bool(truncated), + success=bool(info.get('success', False)), + note='Confirms live measured-pose access and update timing, not calibration against real Bridge tool/FK labels') + OUTPUT.parent.mkdir(parents=True, exist_ok=True) + OUTPUT.write_text(json.dumps(output, indent=2) + '\n') + print(json.dumps(output, indent=2), flush=True) + finally: + env.close() + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/diagnose_bridge_cte_v2.py b/releases/bridge-native-v3/code/scripts/diagnose_bridge_cte_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..069fd027f36fe413a00a1aef8c32c97bb7a17369 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/diagnose_bridge_cte_v2.py @@ -0,0 +1,393 @@ +"""Read-only, single-GPU fixed-protocol diagnostics for existing Bridge CTEs. + +No optimizer, gradient, new checkpoint, or full-dataset latent cache is used. +Per-episode VAE latents live only in host memory for this process. +""" +from __future__ import annotations + +import argparse +import hashlib +import json +import math +from collections import Counter, defaultdict +from pathlib import Path + +import numpy as np +import torch +from torch.nn import functional as F + +from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig +from cosmos_framework.model.zeva.cte_losses import CTELossConfig, summarize_effect_window +from scripts.bridge_cte_data import BridgeCTEDataset, load_metadata +from scripts.bridge_recovery_contract import legacy_normalizer, sha256_file, sha256_json +from scripts.train_bridge_cte import FrozenFrameEncoder + + +def atomic_json(path, payload): + path = Path(path) + temporary = path.with_name(path.name + ".tmp") + temporary.write_text(json.dumps(payload, indent=2, allow_nan=False) + "\n") + temporary.replace(path) + + +def choose_validation_episodes(val, count, seed): + if count < 128 or count > len(val): + raise ValueError("Use a fixed validation subset of at least 128 episodes") + rng = np.random.default_rng(seed) + groups = defaultdict(list) + for i, ep in enumerate(val): + if ep["semantic_id"] >= 0: + groups[ep["semantic_id"]].append(i) + paired = [group for group in groups.values() if len(group) >= 2] + rng.shuffle(paired) + chosen = [i for group in paired[: min(count // 4, len(paired))] for i in rng.choice(group, 2, replace=False)] + chosen_set = set(chosen) + lengths = np.asarray([ep["length"] for ep in val]) + thresholds = np.quantile(lengths, [0.25, 0.5, 0.75]) + while len(chosen) < count: + target_bucket = (len(chosen) - 2 * min(count // 4, len(paired))) % 4 + candidates = [i for i, ep in enumerate(val) + if i not in chosen_set and int(np.searchsorted(thresholds, ep["length"], side="left")) == target_bucket] + if not candidates: + candidates = [i for i in range(len(val)) if i not in chosen_set] + choice = int(rng.choice(candidates)) + chosen.append(choice) + chosen_set.add(choice) + return chosen + + +def fixed_recall(query, target): + query, target = F.normalize(query.float(), dim=-1), F.normalize(target.float(), dim=-1) + if len(query) < 2: + return {"recall_at_1": None, "recall_at_5": None, "nce": None, "cosine_positive_mean": None} + logits = query @ target.T + answer = torch.arange(len(query)) + rank = (logits > logits.diagonal()[:, None]).sum(1) + return dict(recall_at_1=float((rank == 0).float().mean()), + recall_at_5=float((rank < 5).float().mean()), + nce=float(F.cross_entropy(logits / .07, answer)), + cosine_positive_mean=float(logits.diagonal().mean())) + + +def distribution(values): + values = np.asarray(values, dtype=np.float64) + if not len(values): + return {"count": 0, "mean": None} + return dict(count=int(len(values)), mean=float(values.mean()), + p10=float(np.quantile(values, .1)), p50=float(np.median(values)), + p90=float(np.quantile(values, .9))) + + +def task_retrieval(rows): + items = [(row["semantic_id"], row["episode_id"], row["retrieval"]) for row in rows if row["semantic_id"] >= 0] + if len(items) < 3: + return dict(known_episodes=len(items), evaluable_queries=0) + labels = torch.tensor([item[0] for item in items]) + ids = torch.tensor([item[1] for item in items]) + features = F.normalize(torch.stack([item[2] for item in items]), dim=-1) + similarity = features @ features.T + different = ids[:, None] != ids[None, :] + positive = (labels[:, None] == labels[None, :]) & different + usable = positive.any(1) + if not usable.any(): + return dict(known_episodes=len(items), evaluable_queries=0) + similarity = similarity.masked_fill(~different, -torch.inf) + top = similarity.topk(min(5, len(items)-1), dim=1).indices + hit = positive.gather(1, top) + reference = positive.sum(1)[usable].float() / different.sum(1)[usable].float() + return dict(known_episodes=len(items), evaluable_queries=int(usable.sum()), + recall_at_1=float(hit[usable, :1].any(1).float().mean()), + recall_at_5=float(hit[usable].any(1).float().mean()), + random_recall_at_1=float(reference.mean()), + task_classes=len(set(item[0] for item in items))) + + +def phase_progression(rows): + values = [] + for row in rows: + sequence = row["phase"] + if len(sequence) < 3: + continue + direction = F.normalize(sequence[-1] - sequence[0], dim=-1) + increment = (sequence[1:] - sequence[:-1]) @ direction + values.append(float(F.relu(.01 - increment).mean())) + return distribution(values) + + +def effect_geometry(raw): + code = raw.float() + if len(code) < 2: + return dict(count=len(code), effective_rank=None) + centered = code - code.mean(0, keepdim=True) + covariance = centered.T @ centered / (len(code)-1) + eigenvalues = torch.linalg.eigvalsh(covariance).clamp_min(0) + probability = eigenvalues / eigenvalues.sum().clamp_min(1e-12) + effective = torch.exp(-(probability * probability.clamp_min(1e-12).log()).sum()) + unit = F.normalize(code, dim=-1) + cosine = (unit @ unit.T).triu(1) + samples = cosine[torch.triu(torch.ones_like(cosine, dtype=torch.bool), 1)].numpy() + std = code.std(0, correction=0) + return dict(count=len(code), component_std_mean=float(std.mean()), + component_std_min=float(std.min()), component_std_max=float(std.max()), + effective_rank=float(effective), cosine_nonself=distribution(samples)) + + +def normalized_source_audit(selected, root, info): + import pyarrow.parquet as pq + spec = legacy_normalizer() + lower, upper = np.asarray(spec["q01"], np.float32), np.asarray(spec["q99"], np.float32) + clip_counts = np.zeros(6, np.int64) + rows_count, delta_abs = 0, np.zeros(6, np.float64) + shifted_abs, g_values, switch_windows = np.zeros(6, np.float64), Counter(), 0 + by_task = defaultdict(lambda: [0, 0]) + phase_clip = np.zeros((3, 6), np.int64) + phase_rows = np.zeros(3, np.int64) + for ep in selected: + eid = ep["episode_index"] + path = Path(root) / info["data_path"].format(episode_chunk=eid//info.get("chunks_size", 1000), episode_index=eid) + table = pq.read_table(path, columns=["action", "observation.state"]) + actions = np.asarray(table["action"].to_pylist(), np.float32) + states = np.asarray(table["observation.state"].to_pylist(), np.float32) + observed = states[1:, :6] - states[:-1, :6] + valid = actions[:-1, :6] + difference = np.abs(valid - observed) + shifted = np.abs(actions[1:, :6] - observed) + delta_abs += difference.sum(0) + shifted_abs += shifted.sum(0) + rows_count += len(valid) + clipping = (valid < lower) | (valid > upper) + clip_counts += clipping.sum(0) + g_values.update(float(g) for g in actions[:, 6]) + switch_windows += int((actions[1:, 6] != actions[:-1, 6]).any()) + task = str(ep["tasks"][0] if ep["tasks"] else "") + by_task[task][0] += len(valid) + by_task[task][1] += int(clipping.any(1).sum()) + for t in range(len(valid)): + bucket = min(2, 3*t//max(len(valid), 1)) + phase_clip[bucket] += clipping[t] + phase_rows[bucket] += 1 + return dict(episodes=len(selected), comparable_rows=rows_count, + reached_delta_mae_per_axis=(delta_abs/max(rows_count, 1)).tolist(), + shifted_action_mae_per_axis=(shifted_abs/max(rows_count, 1)).tolist(), + clipping_fraction_per_axis=(clip_counts/max(rows_count, 1)).tolist(), + clipping_fraction_any=float(sum(count for count in clip_counts)/max(rows_count*6, 1)), + clipping_per_phase=(phase_clip/np.maximum(phase_rows[:, None], 1)).tolist(), + gripper_raw_counts=dict(g_values), episodes_with_gripper_switch=switch_windows, + top_tasks_by_rows=[dict(task=k, rows=v[0], any_axis_clipped_fraction=v[1]/max(v[0], 1)) + for k,v in sorted(by_task.items(), key=lambda pair:-pair[1][0])[:12]], + terminal_action_note="Final recorded action has no following state and is not checked as reached delta") + + +def collect_model_rows(model, samples, device, donors, perturb=False): + rows = [] + for index, sample in enumerate(samples): + frames = sample["latents"].to(device).unsqueeze(0) + actions = sample["actions"].to(device).unsqueeze(0) + valid = torch.ones(frames.shape[:2], dtype=torch.bool, device=device) + with torch.no_grad(), torch.autocast("cuda", dtype=torch.bfloat16): + result = model(frames, actions, valid) + output = {key: value[0].detach().float().cpu() if value.is_floating_point() else value[0].detach().cpu() + for key,value in result.items()} + row = dict(episode_id=sample["episode_id"], semantic_id=sample["semantic_id"], + actions=sample["actions"], output=output, + retrieval=F.normalize(output["retrieval"].mean(0), dim=-1), phase=output["phase"]) + if perturb: + donor = samples[donors[index]] + substitute = sample["actions"].clone() + amount = min(len(substitute), len(donor["actions"])) + substitute[:amount] = donor["actions"][:amount] + variants = {} + for name, axes in (("motion", slice(0,6)), ("gripper", slice(6,7)), ("all", slice(0,7))): + altered = actions.clone() + altered[:, :amount, :, axes] = substitute[:amount, :, axes].to(device) + with torch.no_grad(), torch.autocast("cuda", dtype=torch.bfloat16): + value = model(frames, altered, valid) + variants[name] = value["effect_outcome_pre"][0].detach().float().cpu()[output["effect_complete"]] + row["perturbed"] = variants + rows.append(row) + return rows + + +def candidate_metrics(rows, donor_summary): + cfg = CTELossConfig() + next_action_errors, vision_errors, effect_action_errors, align_errors = [], [], [], [] + task_z, task_ids, ep_ids, effect_pre, effect_post, effect_target, effect_raw = [], [], [], [], [], [], [] + phase_rows, gripper_errors = [], defaultdict(list) + perturbed = defaultdict(list) + effect_counts, transition_counts = 0, 0 + for row in rows: + out, actions = row["output"], row["actions"] + complete = out["transition_complete"] + effect_complete = out["effect_complete"] + if complete.any(): + next_action_errors.extend(F.smooth_l1_loss(out["next_action"], actions, reduction="none").mean((-1,-2))[complete].tolist()) + vision_errors.extend((out["next_vision"][:-1] - out["target_visual"][1:]).square().mean(-1)[complete].tolist()) + predicted = out["next_action"][complete].reshape(-1,7) + target = actions[complete].reshape(-1,7) + previous = torch.cat((target[:1,6],target[:-1,6])) + events = target[:,6] != previous + for name,mask in (("open",target[:,6]>0), ("closed",target[:,6]<0), ("switch",events), ("steady",~events)): + gripper_errors[f"{name}_gripper_mae"].extend((predicted[mask,6]-target[mask,6]).abs().tolist()) + gripper_errors["motion_mae"].extend((predicted[:,:6]-target[:,:6]).abs().mean(1).tolist()) + transition_counts += int(complete.sum()) + phase_rows.append(row) + task_z.append(row["retrieval"]) + task_ids.append(row["semantic_id"]) + ep_ids.append(row["episode_id"]) + if effect_complete.any(): + effect_counts += int(effect_complete.sum()) + effect_pre.append(out["effect_outcome_pre"][effect_complete]) + effect_post.append(out["effect_outcome_post"][effect_complete]) + effect_target.append(out["effect_delta_target"][effect_complete]) + effect_raw.append(out["effect_post_raw"][effect_complete]) + effect_action_errors.extend(F.smooth_l1_loss( + out["effect_action"], summarize_effect_window(out["effect_actions"].unsqueeze(0))[0], reduction="none").mean(-1)[effect_complete].tolist()) + align_errors.extend((1 - (out["effect_pre"] * out["effect_post"]).sum(-1))[effect_complete].tolist()) + for name,value in row.get("perturbed", {}).items(): + perturbed[name].append(value) + if not effect_pre: + raise ValueError("Fixed validation sample has no complete 16-control effects") + pre, post, target, raw = (torch.cat(items) for items in (effect_pre,effect_post,effect_target,effect_raw)) + retrieval = task_retrieval(phase_rows) + task_features = F.normalize(torch.stack(task_z), dim=-1) + labels, episode_ids = torch.tensor(task_ids), torch.tensor(ep_ids) + known = labels>=0 + eligible = known[:,None] & known[None,:] & episode_ids[:,None].ne(episode_ids[None,:]) + positive = eligible & labels[:,None].eq(labels[None,:]) + usable = positive.any(1) + if usable.any(): + logits = (task_features @ task_features.T / cfg.temperature)[usable].masked_fill(~eligible[usable], -torch.inf) + log_probability = logits - logits.logsumexp(1,keepdim=True) + task_loss = float(-(log_probability.masked_fill(~positive[usable],0).sum(1)/positive[usable].sum(1)).mean()) + else: + task_loss = 0. + phase_loss = phase_progression(phase_rows)["mean"] or 0. + pre_recall, post_recall = fixed_recall(pre,target), fixed_recall(post,target) + centered = raw - raw.mean(0,keepdim=True) + variance = float(F.relu(1-(centered.var(0,correction=0)+1e-4).sqrt()).mean()) + covariance = centered.T @ centered/max(len(raw)-1,1) + covariance.fill_diagonal_(0) + covariance_loss = float(covariance.square().sum()/raw.shape[-1]) + effect = (pre_recall["nce"]+post_recall["nce"])/2 + cfg.effect_action_weight*np.mean(effect_action_errors) + cfg.effect_align_weight*np.mean(align_errors) + cfg.effect_variance_weight*variance + cfg.effect_covariance_weight*covariance_loss + action, vision = float(np.mean(next_action_errors)), float(np.mean(vision_errors)) + total = action + vision + cfg.task_weight*task_loss + cfg.phase_weight*phase_loss + cfg.effect_weight*effect + changes = {} + for name,values in perturbed.items(): + query = torch.cat(values) + comparison = fixed_recall(query,target) + changes[name] = dict(**comparison, + delta_recall_at_1=comparison["recall_at_1"]-pre_recall["recall_at_1"], + delta_positive_cosine=comparison["cosine_positive_mean"]-pre_recall["cosine_positive_mean"]) + return dict(total_fixed_pool=float(total), components=dict(action=action,vision=vision,task=task_loss, + phase=phase_loss,effect=float(effect),effect_action=float(np.mean(effect_action_errors)), + effect_align=float(np.mean(align_errors)),effect_variance=variance, + effect_covariance=covariance_loss,effect_pre_mse=float((pre-target).square().mean()), + effect_post_mse=float((post-target).square().mean()), + effect_zero_mse=float(target.square().mean())), + valid_counts=dict(episodes=len(rows),transitions=transition_counts,effects=effect_counts, + task_anchors=int(usable.sum()),task_candidate_pool=int(known.sum()), + effect_candidate_pool=len(target)), + effect_pre_retrieval=pre_recall,effect_post_retrieval=post_recall, + perturbations=changes,perturbation_donor_summary=donor_summary, + effect_post_geometry=effect_geometry(raw),phase_progression=phase_progression(phase_rows), + task_retrieval=retrieval, + gripper_action_error={key:distribution(value) for key,value in gripper_errors.items()}) + + +def choose_donors(samples): + initials = F.normalize(torch.stack([s["latents"][0].float().flatten() for s in samples]),dim=-1) + similarity = initials @ initials.T + donors, matched = [], 0 + fraction = [] + for i,item in enumerate(samples): + candidates = [j for j,other in enumerate(samples) if j!=i and len(other["actions"])>=len(item["actions"])] + if not candidates: + candidates = [j for j in range(len(samples)) if j != i] + candidates.sort(key=lambda j:(samples[j]["semantic_id"]==item["semantic_id"] and item["semantic_id"]>=0, + float(similarity[i,j])), reverse=True) + selected = candidates[0] + donors.append(selected) + matched += int(item["semantic_id"]>=0 and samples[selected]["semantic_id"]==item["semantic_id"]) + fraction.append(min(1., len(samples[selected]["actions"])/max(len(item["actions"]),1))) + return donors, dict(same_task_donors=matched, total=len(samples), + mean_action_fraction_replaced=float(np.mean(fraction)), + note="When no equally long donor exists, only the donor's real prefix replaces actions; the remainder stays unchanged") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--run",type=Path,default=Path(".artifacts/bridge_cte_stage1_20260924")) + parser.add_argument("--output",type=Path,default=Path(".artifacts/bridge_zeva_recovery_v2/cte_fixed_diagnostics.json")) + parser.add_argument("--episodes",type=int,default=128) + parser.add_argument("--seed",type=int,default=20260924) + parser.add_argument("--vae-microbatch",type=int,default=4) + args=parser.parse_args() + if not torch.cuda.is_available(): + raise RuntimeError("Frozen Wan VAE diagnostics need one CUDA GPU") + torch.cuda.set_device(0) + torch.cuda.set_per_process_memory_fraction(.15) + torch.set_num_threads(2) + manifest=json.loads((args.run/"manifest.json").read_text()) + split=json.loads((args.run/"split.json").read_text()) + dataset_root=Path(manifest["contract"]["dataset"]) + info,train,val=load_metadata(dataset_root,manifest["contract"]["seed"],manifest["contract"]["val_fraction"]) + if [e["episode_index"] for e in train] != split["train"] or [e["episode_index"] for e in val] != split["validation"]: + raise ValueError("Current metadata does not reconstruct the recorded Stage-1 split") + indices=choose_validation_episodes(val,args.episodes,args.seed) + selected=[val[i] for i in indices] + args.output.parent.mkdir(parents=True,exist_ok=True) + result=dict(status="in_progress",protocol=dict(version="bridge_cte_fixed_pool_v2",seed=args.seed, + requested_episodes=args.episodes,episode_ids=[e["episode_index"] for e in selected], + selection="32 exact-task positive pairs + length-quartile fill for 128 episodes", + split_sha256=sha256_json(split),validation_episodes=len(val), + effect_candidate_pool="all complete windows in this fixed subset; not the original per-rank minibatch", + task_candidate_pool="all nonempty-instruction episodes in this fixed subset, self and duplicate episodes excluded", + perturbation="fixed same-task/nearest-start real episode donor, preserving images and all nonperturbed action axes", + no_gradient_updates=True,checkpoint_14k_exists=(args.run/"checkpoints/cte_step_000014000.pt").is_file()), + source_audit=normalized_source_audit(selected,dataset_root,info),candidates={}) + atomic_json(args.output,result) + encoder=FrozenFrameEncoder(manifest["contract"]["vae_path"],torch.device("cuda:0"),args.vae_microbatch) + ds=BridgeCTEDataset(dataset_root,info,selected) + samples=[] + for i,ep in enumerate(selected): + item=ds[i] + frames=item["frames"] + with torch.no_grad(): + latents=encoder(dict(frames=frames,valid=torch.ones(1,len(frames),dtype=torch.bool)))[0].detach().cpu() + samples.append(dict(episode_id=item["episode_id"],semantic_id=item["semantic_id"], + actions=item["actions"],latents=latents)) + if i%32==31: + print(f"PREPARED {i+1}/{len(selected)} validation episodes",flush=True) + donors,donor_summary=choose_donors(samples) + paths=[args.run/"checkpoints"/f"cte_step_{step:09d}.pt" for step in (0,10000,20000,30000,31495)] + for path in paths: + if not path.is_file(): + result["candidates"][path.name]=dict(status="absent") + atomic_json(args.output,result) + continue + payload=torch.load(path,map_location="cpu",weights_only=False) + if (payload.get("format") != "bridge_cte_stage1_v1" + or sha256_json(payload.get("contract")) != sha256_json(manifest["contract"]) + or payload.get("contract_fingerprint") != sha256_json(manifest["contract"])): + raise ValueError(f"CTE contract mismatch: {path}") + model=CausalTransitionEncoder(CausalTransitionEncoderConfig(**payload["model_config"])).to("cuda:0").eval() + model.load_state_dict(payload["model"],strict=True) + model.requires_grad_(False) + projection=payload["model"]["frozen_effect_target.projection"] + projection_sha=hashlib.sha256(projection.contiguous().numpy().tobytes()).hexdigest() + rows=collect_model_rows(model,samples,torch.device("cuda:0"),donors,perturb=True) + result["candidates"][path.name]=dict(status="complete",step=payload["step"], + path=str(path.resolve()),sha256=sha256_file(path), + frozen_visual_projection_sha256=projection_sha, + **candidate_metrics(rows,donor_summary)) + atomic_json(args.output,result) + print(f"DIAGNOSED {path.name} fixed_total={result['candidates'][path.name]['total_fixed_pool']:.6f}",flush=True) + del rows,model,payload + torch.cuda.empty_cache() + result["status"]="complete" + atomic_json(args.output,result) + print(f"DIAGNOSTICS_COMPLETE {args.output}",flush=True) + + +if __name__=="__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/diagnose_bridge_stage2_reload.py b/releases/bridge-native-v3/code/scripts/diagnose_bridge_stage2_reload.py new file mode 100644 index 0000000000000000000000000000000000000000..74ae146f0cbb5e40da79f803cd3d830ce3a092f4 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/diagnose_bridge_stage2_reload.py @@ -0,0 +1,191 @@ +"""Read-only full-model reload/forward diagnosis; exits before any gradient step. + +Writes only a fresh diagnostic directory. Never replaces pilot artifacts or +checkpoints. Uses the original base + step-50 replacement tensors and optimizer. +""" +from __future__ import annotations + +import argparse +import fcntl +import hashlib +import json +import os +from pathlib import Path +import runpy +import subprocess +import sys +import tempfile + +ROOT = Path(__file__).resolve().parents[1] +FRAMEWORK = ROOT.parent / 'cosmos-framework' +BUNDLE = ROOT / '.artifacts/bridge_stage2_pilot_v2' +SOURCE = BUNDLE / 'train' +PYTHON = FRAMEWORK / '.venv/bin/python' +sys.path.insert(0, str(ROOT)) + + +def digest_tensor(value): + value = value.detach().contiguous().cpu() + return hashlib.sha256(value.reshape(-1).view(__import__('torch').uint8).numpy().tobytes()).hexdigest() + + +def cpu_tree(value): + import torch + if torch.is_tensor(value): + return value.detach().cpu().clone() + if isinstance(value, (list, tuple)): + return [cpu_tree(v) for v in value] + if isinstance(value, dict): + return {k: cpu_tree(v) for k, v in value.items()} + return value + + +def diagnose(self, model, iteration=0): + import torch + import torch.distributed as dist + from scripts.bridge_stage2_monitor import frozen_digest, local + + self.directory = Path(os.environ['WIDOWX_RUN_DIR']) + self.rank = dist.get_rank() + self.fixture = torch.load(SOURCE / f'probe_fixture_rank{self.rank}.pt', map_location='cpu', weights_only=False) + saved = torch.load(os.environ['WIDOWX_RESUME'], map_location='cpu', weights_only=False) + assert iteration == 50 == saved['iteration'] + report = dict(rank=self.rank, iteration=iteration, gradient_steps=0, + torch_version=torch.__version__, selected_parameters={}, frozen_parameters={}, buffers={}, probes=[]) + for name, param in model.named_parameters(): + if name in saved['model']: + full = (param.full_tensor() if hasattr(param, 'full_tensor') else param).detach().cpu() + expected = saved['model'][name] + report['selected_parameters'][name] = dict(equal=torch.equal(full, expected), + max_abs=float((full.float()-expected.float()).abs().max()), sha256=digest_tensor(full)) + else: + assert not param.requires_grad, name + report['frozen_parameters'][name] = digest_tensor(local(param)) + for name, value in model.named_buffers(): + report['buffers'][name] = digest_tensor(local(value)) + report['frozen_sample_sha256'] = frozen_digest(model) + report['all_selected_exact'] = all(row['equal'] for row in report['selected_parameters'].values()) + destination = self.directory / f'diagnosis_rank{self.rank}.json' + destination.write_text(json.dumps(report, indent=2)+'\n') + print(f'DIAG_WEIGHTS rank={self.rank} exact={report["all_selected_exact"]}', flush=True) + + trace = {} + replay_latents = None + latent_index = 0 + encode = model.tokenizer_vision_gen.encode + def tapped_encode(*args, **kwargs): + nonlocal latent_index + if replay_latents is None: + value = encode(*args, **kwargs) + else: + value = replay_latents[latent_index].to(args[0].device) + latent_index += 1 + trace.setdefault('vae_latents', []).append(cpu_tree(value)) + return value + model.tokenizer_vision_gen.encode = tapped_encode + compute = model._compute_losses + def tapped_compute(out_net, data_batch_packed, gen_data_noised, *args, **kwargs): + noised = gen_data_noised + trace['noised'] = {name: cpu_tree(getattr(noised, name)) for name in ( + 'epsilon_action', 'xt_tokens_action', 'vt_target_action', 'sigmas_action', + 'epsilon_vision', 'xt_tokens_vision', 'sigmas_vision') if hasattr(noised, name)} + trace['preds_action'] = cpu_tree(out_net.get('preds_action', [])) + return compute(out_net, data_batch_packed, noised, *args, **kwargs) + model._compute_losses = tapped_compute + + configs = [('original', torch.backends.cudnn.benchmark, torch.backends.cudnn.deterministic), + ('repeat', torch.backends.cudnn.benchmark, torch.backends.cudnn.deterministic), + ('cudnn_fixed', False, True), ('cudnn_fixed_repeat', False, True), + ('cudnn_fixed_original_latents', False, True), + ('cudnn_original_fixed_latents', torch.backends.cudnn.benchmark, torch.backends.cudnn.deterministic)] + previous = os.environ.get('BRIDGE_RELOAD_REFERENCE_DIR') + if previous: + configs += [('external_original_latents', configs[0][1], configs[0][2]), + ('external_original_latents_fixed', False, True)] + cached_latents = {} + for label, benchmark, deterministic in configs: + torch.backends.cudnn.benchmark = benchmark + torch.backends.cudnn.deterministic = deterministic + trace.clear() + latent_index = 0 + replay_latents = None + if label == 'cudnn_fixed_original_latents': + replay_latents = cached_latents['original'] + elif label == 'cudnn_original_fixed_latents': + replay_latents = cached_latents['cudnn_fixed'] + elif label.startswith('external_original_latents'): + replay_latents = torch.load(Path(previous) / f'trace_original_rank{self.rank}.pt', + map_location='cpu', weights_only=False)['vae_latents'] + result = self.probe(model, iteration, label) + if label in ('original', 'cudnn_fixed'): + cached_latents[label] = trace['vae_latents'] + reference = torch.load(SOURCE / f'probe_end_50_rank{self.rank}.pt', map_location='cpu', weights_only=True) + delta = (result['prediction']-reference).abs() + report['probes'].append(dict(mode=label, cudnn_benchmark=benchmark, cudnn_deterministic=deterministic, + action_loss=result['action_loss'], vs_original_max_abs=float(delta.max()), + vs_original_mean_abs=float(delta.mean()), prediction_sha256=digest_tensor(result['prediction']))) + torch.save(trace, self.directory / f'trace_{label}_rank{self.rank}.pt') + destination.write_text(json.dumps(report, indent=2)+'\n') + print('DIAG_PROBE '+json.dumps(dict(rank=self.rank, **report['probes'][-1])), flush=True) + + # Complete all ranks before exiting, so nobody proceeds into a training loop. + dist.barrier() + if self.rank == 0: + print('DIAG_COMPLETE gradient_steps=0', flush=True) + import wandb + if wandb.run is not None: + wandb.finish() + dist.destroy_process_group() + raise SystemExit(0) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--gpus', default='0,1') + parser.add_argument('--worker', action='store_true') + parser.add_argument('--reference-dir', type=Path) + args = parser.parse_args() + if args.worker: + from scripts.bridge_stage2_monitor import BridgePilotMonitor + BridgePilotMonitor.on_train_start = diagnose + sys.argv = [str(ROOT / 'scripts/train_bridge_stage2_pilot.py'), '--sft-toml', + str(ROOT / 'scripts/bridge_stage2_pilot.toml')] + runpy.run_module('scripts.train_bridge_stage2_pilot', run_name='__main__') + return + lock = (SOURCE / 'launcher.lock').open('a') + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + selected = list(map(int, args.gpus.split(','))) + assert len(selected) == 2 and len(set(selected)) == 2 + rows = subprocess.check_output(['nvidia-smi', '--query-gpu=index,uuid,memory.free,utilization.gpu', + '--format=csv,noheader,nounits'], text=True) + actual = {int(p[0]): dict(uuid=p[1].strip(), free=int(p[2]), util=int(p[3])) + for row in rows.splitlines() for p in [row.split(',')]} + assert all(actual[i]['free'] >= 36*1024 and actual[i]['util'] <= 5 for i in selected), actual + apps = subprocess.check_output(['nvidia-smi', '--query-compute-apps=gpu_uuid,pid', '--format=csv,noheader'], text=True) + baseline = {actual[i]['uuid']: [int(r.split(',')[1]) for r in apps.splitlines() + if r.split(',')[0].strip() == actual[i]['uuid']] for i in selected} + directory = Path(tempfile.mkdtemp(prefix='reload_diagnosis_', dir=BUNDLE)) + env = dict(os.environ, PYTHONPATH=f'{ROOT}:{FRAMEWORK}', CUDA_VISIBLE_DEVICES=args.gpus, + TOKENIZERS_PARALLELISM='false', HF_HUB_OFFLINE='1', + QWEN_VLM_PATH='/home/gpu4/tianyi/models/Qwen3-VL-8B-Instruct', + WAN_VAE_PATH='/home/gpu4/tianyi/models/wan22_vae/Wan2.2_VAE.pth', + BASE_CHECKPOINT_PATH='/home/gpu4/tianyi/zeva-release/weights/stage2', + BRIDGE_STAGE2_BUNDLE=str(BUNDLE), BRIDGE_STAGE2_WARMSTART=str(ROOT / '.artifacts/ipec_full/checkpoints/step_000290000.pt'), + WIDOWX_RUN_DIR=str(directory), IMAGINAIRE_OUTPUT_ROOT=str(directory / 'runtime'), + WIDOWX_RESUME=str(SOURCE / 'checkpoints/step_000000050.pt'), + BRIDGE_PILOT_SHARED_BASELINE=json.dumps(baseline)) + if args.reference_dir: + env['BRIDGE_RELOAD_REFERENCE_DIR'] = str(args.reference_dir.resolve()) + command = ['timeout', '--signal=TERM', '--kill-after=30s', '5m', str(PYTHON), '-u', '-m', + 'torch.distributed.run', '--standalone', '--nproc-per-node=2', str(Path(__file__).resolve()), '--worker'] + (directory / 'launch.json').write_text(json.dumps(dict(command=command, gpu_ids=selected, + baseline=baseline, gradient_steps=0), indent=2)+'\n') + print(f'DIAG_DIRECTORY={directory}', flush=True) + with (directory / 'launcher.log').open('w') as stream: + result = subprocess.run(command, cwd=FRAMEWORK, env=env, stdout=stream, stderr=subprocess.STDOUT) + print(f'DIAG_EXIT={result.returncode}', flush=True) + raise SystemExit(result.returncode) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/eval_widowx_simpler.py b/releases/bridge-native-v3/code/scripts/eval_widowx_simpler.py new file mode 100644 index 0000000000000000000000000000000000000000..d90d942da831d33ac456b052ab00dc7f68d68631 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/eval_widowx_simpler.py @@ -0,0 +1,178 @@ +"""Configurable-count, deterministic-seed SimplerEnv episodes via localhost.""" +import argparse +import asyncio +import json +import math +import subprocess +from pathlib import Path +import cv2 +import msgpack +import numpy as np +from scipy.spatial.transform import Rotation +from transforms3d.euler import mat2euler +import websockets +import simpler_env +from widowx_rollout import CausalHistory +from scripts.bridge_recovery_contract import legacy_normalizer, reached_delta_raw +from simpler_env.utils.env.observation_utils import get_image_from_maniskill2_obs_dict + +_LEGACY_NORMALIZER = legacy_normalizer() +Q01 = np.asarray(_LEGACY_NORMALIZER['q01'], dtype=np.float32) +Q99 = np.asarray(_LEGACY_NORMALIZER['q99'], dtype=np.float32) + +def pack(x): + if isinstance(x,np.ndarray): return {b'__ndarray__':True,b'data':x.tobytes(),b'dtype':x.dtype.str,b'shape':x.shape} + if isinstance(x,np.generic): return x.item() + raise TypeError(type(x)) + +def unpack(x): + if b'__ndarray__' in x: return np.frombuffer(x[b'data'],dtype=x[b'dtype']).reshape(x[b'shape']) + return x + +def proprio(env, convention='bridge_tool'): + e=env.unwrapped + pose=e.agent.robot.pose.inv()*e.tcp.pose + # Bridge state uses the tool-frame convention from the dataset replay, + # not SimplerEnv's direct TCP Euler angles. The fixed basis transform is + # R_sim = R_bridge @ mat_transform; invert it before mat2euler. + sim_rotation=np.asarray(pose.to_transformation_matrix(),dtype=np.float64)[:3,:3] + mat_transform=np.asarray([[0.0,0.0,1.0],[0.0,1.0,0.0],[-1.0,0.0,0.0]],dtype=np.float64) + if convention == 'bridge_tool': + angles=np.asarray(mat2euler(sim_rotation @ mat_transform.T,axes='sxyz'),dtype=np.float32) + elif convention == 'legacy_tcp': + q=pose.q + angles=Rotation.from_quat([q[1],q[2],q[3],q[0]]).as_euler('xyz') + else: + raise ValueError(f'Unknown proprio convention: {convention}') + openness=1-float(e.agent.get_gripper_closedness()) + return np.asarray([*pose.p,*angles,0,openness,openness],np.float32) + +async def evaluate(args): + if args.proprio_convention != 'bridge_tool': + raise ValueError('Reached-delta CTE history requires the Bridge tool-frame proprio convention') + results=[] + async with websockets.connect(f'ws://127.0.0.1:{args.port}',compression=None,max_size=None,ping_interval=None) as ws: + metadata=msgpack.unpackb(await ws.recv(),object_hook=unpack) + if metadata.get('memory_mode') != args.memory_mode: + raise RuntimeError(f'Policy memory mode mismatch: {metadata} vs {args.memory_mode}') + for episode in range(args.seed_start, args.seed_start + args.episodes): + env=simpler_env.make('widowx_carrot_on_plate', + renderer_kwargs=dict(device=args.render_device, offscreen_only=True)) + max_steps = args.max_steps + if max_steps is None and args.max_seconds is not None: + # SimplerEnv's WidowX control loop is 5 Hz. Override only the + # outer Gymnasium TimeLimit so the policy/evaluation protocol + # remains unchanged while allowing a longer episode horizon. + max_steps = max(1, int(math.ceil(args.max_seconds * 5.0))) + if max_steps is not None: + if not hasattr(env, '_max_episode_steps'): + raise RuntimeError('expected a Gymnasium TimeLimit wrapper') + env._max_episode_steps = max_steps + obs,_=env.reset(seed=episode) + image=lambda o: cv2.resize(get_image_from_maniskill2_obs_dict(env,o),(256,256)) + first_image=image(obs); history=CausalHistory(first_image); steps=0; success=False; done=False + progress={}; trace=[] + writer = None + video_path = None + if args.video_dir: + video_dir=Path(args.video_dir); video_dir.mkdir(parents=True,exist_ok=True) + video_path=video_dir/f"{Path(args.checkpoint).stem}_episode_{episode:02d}.mp4" + writer=cv2.VideoWriter(str(video_path),cv2.VideoWriter_fourcc(*'mp4v'),5.0,(256,256)) + if not writer.isOpened(): raise RuntimeError(f'failed to open video writer: {video_path}') + first=first_image.copy() + cv2.putText(first,f'episode={episode} step=0 success=0',(6,18),cv2.FONT_HERSHEY_SIMPLEX,.42,(0,255,255),1,cv2.LINE_AA) + writer.write(cv2.cvtColor(first,cv2.COLOR_RGB2BGR)) + try: + while not done: + current_image=image(obs) + request={'observation/image':current_image,'observation/proprio':proprio(env,args.proprio_convention), + 'prompt':env.unwrapped.get_language_instruction(), + **history.request(current_image), + 'inference_seed':episode*10000+steps} + await ws.send(msgpack.packb(request,default=pack)) + response=await ws.recv() + if isinstance(response,str): raise RuntimeError(response) + chunk=np.asarray(msgpack.unpackb(response,object_hook=unpack)['action'],np.float32) + if chunk.shape!=(32,7) or not np.isfinite(chunk).all(): raise ValueError('invalid Zeva action chunk') + query_step = steps + for chunk_offset, prediction in enumerate(chunk[:args.exec_horizon]): + normalized=np.clip(prediction,-1,1) + raw=0.5*(normalized[:6]+1)*(Q99-Q01)+Q01 + command=np.r_[raw[:3],Rotation.from_euler('xyz',raw[3:]).as_rotvec(),1.0 if normalized[6]>0 else -1.0].astype(np.float32) + before=proprio(env,args.proprio_convention) + obs,_,terminated,truncated,info=env.step(command) + after=proprio(env,args.proprio_convention) + reached_raw=reached_delta_raw(before[:6],after[:6],command[6]) + history.append_reached_delta(reached_raw,image(obs)); steps+=1 + success=success or bool(info.get('success',False)) + for key in ('moved_correct_obj','moved_wrong_obj','is_src_obj_grasped','consecutive_grasp','src_on_target'): + progress[key]=progress.get(key,False) or bool(info.get(key,False)) + if args.trace_dir: + trace.append(dict(step=steps, query_step=query_step, chunk_offset=chunk_offset, + prediction=prediction.tolist(), command=command.tolist(), + reached_delta_raw=reached_raw.tolist(), + reached_delta_normalized=history.partial[-1].tolist() if history.partial else history.transitions[-1][-1].tolist(), + proprio_before=before.tolist(),proprio=after.tolist(), + info={k:bool(info.get(k,False)) for k in (*progress,'success')})) + done=bool(terminated or truncated) + if writer is not None: + frame=image(obs).copy() + cv2.putText(frame,f'episode={episode} step={steps} success={int(success)}',(6,18),cv2.FONT_HERSHEY_SIMPLEX,.42,(0,255,255),1,cv2.LINE_AA) + cv2.putText(frame,'action='+np.array2string(command,precision=2,suppress_small=True),(6,244),cv2.FONT_HERSHEY_SIMPLEX,.28,(255,255,255),1,cv2.LINE_AA) + writer.write(cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)) + if done: break + if args.trace_dir: + trace_dir=Path(args.trace_dir); trace_dir.mkdir(parents=True,exist_ok=True) + (trace_dir/f'episode_{episode:02d}.json').write_text(json.dumps(trace,indent=2)) + results.append(dict(seed=episode,steps=steps,success=success,progress=progress,video=str(video_path) if video_path else None)) + print(json.dumps(results[-1]),flush=True) + finally: + if writer is not None: + writer.release() + # OpenCV's mp4v output is valid MPEG-4 Part 2 but is not + # playable in some browser previews. Re-mux to broadly + # supported H.264/yuv420p in place. + if video_path is not None: + temp_path=video_path.with_name(video_path.stem+'.h264.tmp.mp4') + try: + subprocess.run(['ffmpeg','-y','-loglevel','error','-i',str(video_path), + '-c:v','libx264','-pix_fmt','yuv420p','-movflags','+faststart',str(temp_path)], + check=True) + temp_path.replace(video_path) + except (FileNotFoundError, subprocess.CalledProcessError): + if temp_path.exists(): temp_path.unlink() + env.close() + report=dict(status='complete',policy_controlled=True,task='widowx_carrot_on_plate', + proprio_convention=args.proprio_convention,protocol_version='widowx_full_v3', + exec_horizon=args.exec_horizon,render_device=args.render_device,memory_mode=args.memory_mode, + checkpoint=args.checkpoint,max_seconds=args.max_seconds,seed_start=args.seed_start, + max_steps=(args.max_steps if args.max_steps is not None else + max(1, int(math.ceil(args.max_seconds * 5.0))) + if args.max_seconds is not None else None), + episodes=results,success_rate=float(np.mean([x['success'] for x in results]))) + path=Path(args.output); path.parent.mkdir(parents=True,exist_ok=True) + temp=path.with_suffix('.tmp'); temp.write_text(json.dumps(report,indent=2)); temp.replace(path) + +if __name__=='__main__': + p=argparse.ArgumentParser(); p.add_argument('--port',type=int,default=18765) + p.add_argument('--episodes',type=int,default=10); p.add_argument('--checkpoint',required=True); p.add_argument('--output',required=True) + p.add_argument('--seed-start',type=int,default=0,help='first environment and inference seed') + p.add_argument('--memory-mode',choices=('on','bank_off'),default='on') + p.add_argument('--render-device',default='cuda:0', + help='SAPIEN renderer device within CUDA_VISIBLE_DEVICES; default explicitly selects its first GPU') + p.add_argument('--exec-horizon',type=int,default=4,choices=range(1,33), + help='controls to execute per prediction, independent of the 32-step prediction horizon') + p.add_argument('--video-dir',default=None,help='directory for one MP4 per evaluation episode') + p.add_argument('--trace-dir',default=None,help='optional per-step action/state/progress JSON directory') + limit=p.add_mutually_exclusive_group() + limit.add_argument('--max-seconds',type=float,default=None, + help='override episode TimeLimit in seconds at the 5 Hz WidowX control rate') + limit.add_argument('--max-steps',type=int,default=None, + help='maximum environment control steps per episode') + p.add_argument('--proprio-convention',choices=('bridge_tool','legacy_tcp'),default='bridge_tool',help='legacy_tcp is for regression comparison only') + args=p.parse_args() + if args.max_steps is not None and args.max_steps < 1: + p.error('--max-steps must be positive') + if args.seed_start < 0: + p.error('--seed-start must be nonnegative') + asyncio.run(evaluate(args)) diff --git a/releases/bridge-native-v3/code/scripts/extract_bridge_specialized.py b/releases/bridge-native-v3/code/scripts/extract_bridge_specialized.py new file mode 100644 index 0000000000000000000000000000000000000000..f22377b62dc9b9b2f76a306bf81ceccdfccf0110 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/extract_bridge_specialized.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +"""Extract a low-variation Bridge/LeRobot subset by episode task text. + +The default selection is the plate-placement family (``put ... on plate``), +which is close to the current carrot-on-plate evaluation while retaining +multiple objects and camera scenes. Episodes are copied whole, so no video +re-encoding or temporal duplication is introduced. +""" +from __future__ import annotations + +import argparse +import json +import os +import re +import shutil +from pathlib import Path + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--src", default="/opt/zhangchenyu/datasets/bridge_orig_lerobot_smoke") + ap.add_argument("--dst", default=".artifacts/bridge_put_on_plate_259") + ap.add_argument("--pattern", default=r"^put .+ on plate(?: sink)?$") + ap.add_argument("--max-episodes", type=int, default=None) + ap.add_argument("--min-length", type=int, default=None, + help="keep only episodes with at least this many frames") + ap.add_argument("--hardlink-videos", action="store_true", + help="hardlink videos instead of duplicating them when possible") + args = ap.parse_args() + src, dst = Path(args.src), Path(args.dst) + meta = src / "meta" + episodes = [json.loads(x) for x in (meta / "episodes.jsonl").read_text().splitlines()] + tasks = {int(x["task_index"]): x["task"] for x in + (json.loads(x) for x in (meta / "tasks.jsonl").read_text().splitlines())} + rx = re.compile(args.pattern, re.I) + selected = [] + for ep in episodes: + text = " ".join(ep.get("tasks", [])) + if rx.fullmatch(text.strip()): + selected.append((ep, text.strip())) + selected.sort(key=lambda x: int(x[0]["episode_index"])) + if args.min_length is not None: + selected = [x for x in selected if int(x[0]["length"]) >= args.min_length] + if args.max_episodes is not None: + selected = selected[:args.max_episodes] + if not selected: + raise SystemExit("no matching episodes") + + missing = [] + for ep, _ in selected: + i = int(ep["episode_index"]) + chunk = i // 1000 + dp = src / f"data/chunk-{chunk:03d}/episode_{i:06d}.parquet" + vp = src / f"videos/chunk-{chunk:03d}/observation.images.image_0/episode_{i:06d}.mp4" + if not dp.exists() or not vp.exists(): + missing.extend(str(p) for p in (dp, vp) if not p.exists()) + if missing: + raise SystemExit("raw parquet/video files are missing; metadata-only source. First missing: " + missing[0]) + + # Import only after the source check: this script remains usable for dry inspection. + import pyarrow.parquet as pq + import pyarrow as pa + + (dst / "meta").mkdir(parents=True, exist_ok=True) + out_eps, out_tasks = [], [] + total_frames = 0 + for new_i, (ep, text) in enumerate(selected): + old_i = int(ep["episode_index"]) + chunk = old_i // 1000 + old_dp = src / f"data/chunk-{chunk:03d}/episode_{old_i:06d}.parquet" + old_vp = src / f"videos/chunk-{chunk:03d}/observation.images.image_0/episode_{old_i:06d}.mp4" + new_dp = dst / f"data/chunk-000/episode_{new_i:06d}.parquet" + new_vp = dst / f"videos/chunk-000/observation.images.image_0/episode_{new_i:06d}.mp4" + new_dp.parent.mkdir(parents=True, exist_ok=True) + new_vp.parent.mkdir(parents=True, exist_ok=True) + tab = pq.read_table(old_dp) + # Keep all rows but rewrite episode/task ids to a compact standalone set. + cols = {name: tab[name] for name in tab.column_names} + if "episode_index" in cols: + cols["episode_index"] = pa.array([new_i] * tab.num_rows, type=cols["episode_index"].type) + task_col = pa.array([new_i] * tab.num_rows, type=cols["task_index"].type) + cols["task_index"] = task_col + pq.write_table(pa.table(cols), new_dp) + if args.hardlink_videos: + os.link(old_vp, new_vp) + else: + shutil.copy2(old_vp, new_vp) + out_eps.append({"episode_index": new_i, "tasks": [text], "length": int(ep["length"])}) + out_tasks.append({"task_index": new_i, "task": text}) + total_frames += int(ep["length"]) + + info = json.loads((meta / "info.json").read_text()) + info["total_episodes"] = len(out_eps) + info["total_frames"] = total_frames + info["total_tasks"] = len(out_tasks) + info["total_videos"] = len(out_eps) + info["total_chunks"] = 1 + info["splits"] = {"train": f"0:{len(out_eps)}"} + info["data_path"] = "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet" + info["video_path"] = "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4" + (dst / "meta/info.json").write_text(json.dumps(info, indent=2) + "\n") + (dst / "meta/episodes.jsonl").write_text("".join(json.dumps(x) + "\n" for x in out_eps)) + (dst / "meta/tasks.jsonl").write_text("".join(json.dumps(x) + "\n" for x in out_tasks)) + for name in ("modality.json", "stats.json", "stats_gr00t.json"): + if (meta / name).exists(): shutil.copy2(meta / name, dst / "meta" / name) + print(json.dumps({"episodes": len(out_eps), "frames": total_frames, "dst": str(dst)}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/follow_bridge_stage2_pilot.py b/releases/bridge-native-v3/code/scripts/follow_bridge_stage2_pilot.py new file mode 100644 index 0000000000000000000000000000000000000000..e31fb8bdf95101e1a1041c7294ebe5b399e3a4a3 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/follow_bridge_stage2_pilot.py @@ -0,0 +1,102 @@ +"""Follow this run's 50-step launcher; continue only a passed smoke to 500. + +This CPU-only watcher never stops another process. It stops itself on a +failed smoke or bounded resource timeout. No backbone is ever unfrozen. +""" +from __future__ import annotations + +import argparse +from datetime import datetime +import fcntl +import json +import math +from pathlib import Path +import subprocess +import time + +ROOT = Path(__file__).resolve().parents[1] +PYTHON = '/home/gpu4/tianyi/cosmos-framework/.venv/bin/python' +RUN = ROOT / '.artifacts/bridge_stage2_pilot_v2/train' + + +def process_identity(pid): + try: + fields = Path(f'/proc/{pid}/stat').read_text().rsplit(')', 1)[1].split() + return fields[19] # Linux starttime, immune to PID reuse. + except FileNotFoundError: + return None + + +def check_smoke(run=RUN): + engineering = json.loads((run / 'engineering_50.json').read_text()) + verified = json.loads((run / 'checkpoints/step_000000050.verified.json').read_text()) + if not engineering['passed'] or engineering['step'] != 50 or not verified['exact_model_roundtrip']: + raise ValueError('50-step engineering/checkpoint gate failed') + if engineering['bit_nonempty_fraction'] < .70: + raise ValueError('Not enough real BIT samples') + comparisons = [] + for path in sorted(run.glob('probe_*task*_end_50_rank*.json')): + end = json.loads(path.read_text()) + start = json.loads(Path(str(path).replace('_end_50_', '_start_0_')).read_text()) + if not all(math.isfinite(float(v)) for v in [end['action_loss'], *end['x0_mae']]): + raise FloatingPointError(f'Nonfinite fixed probe: {path.name}') + # A fitting smoke may need more than 50 updates, but do not continue + # through gross divergence. These are engineering guards, not an + # assertion of statistically significant learning or rollout success. + if end['action_loss'] > 2*start['action_loss']+.01: + raise ValueError(f'Action-loss regression in {path.name}') + if any(b > 2*a+.05 for a,b in zip(start['x0_mae'], end['x0_mae'])): + raise ValueError(f'Per-axis error regression in {path.name}') + comparisons.append(dict(probe=path.name, before=start, after=end)) + if len(comparisons) != 8: + raise ValueError('Expected all eight fixed train/development BIT probes') + return comparisons + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--launcher-pid', type=int, required=True) + parser.add_argument('--wait-minutes', type=float, default=220) + args = parser.parse_args() + lock = (RUN / 'follow.lock').open('a') + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + + def status(state, **extra): + payload = dict(status=state, updated_at=datetime.now().astimezone().isoformat(), + launcher_pid=args.launcher_pid, **extra) + temporary = RUN / 'follow_status.tmp' + temporary.write_text(json.dumps(payload, indent=2)+'\n') + temporary.replace(RUN / 'follow_status.json') + print(json.dumps(payload), flush=True) + + try: + identity = process_identity(args.launcher_pid) + if identity is not None: + command = Path(f'/proc/{args.launcher_pid}/cmdline').read_bytes().replace(b'\0', b' ').decode() + if 'scripts/run_bridge_stage2_pilot.py --steps 50' not in command: + raise ValueError('Refusing to follow an unrelated launcher') + deadline = time.monotonic()+60*args.wait_minutes + status('waiting_for_50_step_launcher') + while identity is not None and process_identity(args.launcher_pid) == identity: + if time.monotonic() >= deadline: + raise TimeoutError('Bounded follow deadline reached; no process was stopped') + time.sleep(30) + comparisons = check_smoke() + (RUN / 'smoke_gate.json').write_text(json.dumps(dict(passed=True, comparisons=comparisons), indent=2)+'\n') + status('launching_bounded_500') + result = subprocess.run([PYTHON, '-u', 'scripts/run_bridge_stage2_pilot.py', + '--steps', '500', '--gpus', 'auto', '--wait-minutes', '60'], cwd=ROOT) + if result.returncode: + raise RuntimeError(f'500-step launcher exited {result.returncode}') + engineering = json.loads((RUN / 'engineering_500.json').read_text()) + verified = json.loads((RUN / 'checkpoints/step_000000500.verified.json').read_text()) + if not engineering['passed'] or not verified['exact_model_roundtrip']: + raise ValueError('500-step verification failed') + status('completed_500', engineering=engineering) + except Exception as error: + status('stopped_without_touching_other_jobs', error=f'{type(error).__name__}: {error}') + raise + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/fp32_master_adamw.py b/releases/bridge-native-v3/code/scripts/fp32_master_adamw.py new file mode 100644 index 0000000000000000000000000000000000000000..1b6463ec3f2a65f5b6e7ffc75148f649145f869a --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/fp32_master_adamw.py @@ -0,0 +1,109 @@ +"""AdamW with lazy, checkpointed FP32 masters for BF16/DTensor parameters. + +Cosmos constructs its optimizer BEFORE loading the base weights. Masters must +therefore be initialized after checkpoint loading, not in ``__init__``. Keeping +masters and moments in normal per-parameter optimizer state also lets DCP gather +and redistribute them together with the model's DTensor placements. +""" +from __future__ import annotations + +import math +import torch + + +def _local(tensor): + return tensor.to_local() if hasattr(tensor, "to_local") else tensor + + +class FP32MasterAdamW(torch.optim.Optimizer): + # Cosmos's TE-specific callback must not try to manage these masters. + master_weights = False + _fp32_fields = ("master_param", "exp_avg", "exp_avg_sq", "max_exp_avg_sq") + + def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, + weight_decay=0.01, amsgrad=False, maximize=False, **kwargs): + for key in ("fused", "capturable", "master_weights", "foreach"): + kwargs.pop(key, None) + if kwargs: + raise TypeError(f"Unsupported AdamW options: {sorted(kwargs)}") + if lr < 0 or eps < 0 or weight_decay < 0: + raise ValueError("lr, eps and weight_decay must be non-negative") + if len(betas) != 2 or any(not 0 <= beta < 1 for beta in betas): + raise ValueError("AdamW betas must be in [0,1)") + super().__init__(params, dict(lr=lr, betas=tuple(betas), eps=eps, + weight_decay=weight_decay, amsgrad=amsgrad, + maximize=maximize)) + + @torch.no_grad() + def _initialize_param(self, param, group): + state = self.state[param] + if not state: + state["step"] = torch.tensor(0.0) + # Clone the CURRENT loaded parameter. Preserve DTensor placement. + state["master_param"] = param.detach().float().clone() + state["exp_avg"] = torch.zeros_like(state["master_param"]) + state["exp_avg_sq"] = torch.zeros_like(state["master_param"]) + if group["amsgrad"]: + state["max_exp_avg_sq"] = torch.zeros_like(state["master_param"]) + return state + + @torch.no_grad() + def initialize_state(self): + """Called after base loading; prevents DCP from taking a dummy step.""" + for group in self.param_groups: + for param in group["params"]: + self._initialize_param(param, group) + + @torch.no_grad() + def step(self, closure=None): + loss = None + if closure is not None: + with torch.enable_grad(): + loss = closure() + for group in self.param_groups: + beta1, beta2 = group["betas"] + lr = float(group["lr"]) + for param in group["params"]: + if param.grad is None: + continue + grad = _local(param.grad).detach().float() + if grad.is_sparse: + raise RuntimeError("AdamW does not support sparse gradients") + if group["maximize"]: + grad = -grad + state = self._initialize_param(param, group) + state["step"].add_(1) + step = int(state["step"].item()) + master = _local(state["master_param"]) + mean, variance = _local(state["exp_avg"]), _local(state["exp_avg_sq"]) + master.mul_(1 - lr * group["weight_decay"]) + mean.lerp_(grad, 1 - beta1) + variance.mul_(beta2).addcmul_(grad, grad, value=1 - beta2) + denominator_state = variance + if group["amsgrad"]: + denominator_state = _local(state["max_exp_avg_sq"]) + torch.maximum(denominator_state, variance, out=denominator_state) + denominator = denominator_state.sqrt().div_(math.sqrt(1 - beta2 ** step)).add_(group["eps"]) + master.addcdiv_(mean, denominator, value=-lr / (1 - beta1 ** step)) + _local(param).copy_(master) + return loss + + def load_state_dict(self, state_dict): + saved_ids = [i for g in state_dict["param_groups"] for i in g["params"]] + params = [p for g in self.param_groups for p in g["params"]] + for state in state_dict["state"].values(): + if state and "master_param" not in state: + raise ValueError("Legacy WidowX optimizer checkpoint lacks FP32 masters; start a new run from the base weights") + super().load_state_dict(state_dict) + # Optimizer.load_state_dict normally casts moments to parameter dtype. + # Restore directly from the source (not from the rounded BF16 copy). + with torch.no_grad(): + for saved_id, param in zip(saved_ids, params): + source = state_dict["state"].get(saved_id, {}) + if not source: + continue + for key in self._fp32_fields: + if key in source: + self.state[param][key] = source[key].detach().to(device=param.device, dtype=torch.float32).clone() + self.state[param]["step"] = source["step"].detach().cpu().clone() + _local(param).copy_(_local(self.state[param]["master_param"])) diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/__init__.py b/releases/bridge-native-v3/code/scripts/native_stage2/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d01af53e856f43f3bbcbecddab48a164b4d7342b --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/__init__.py @@ -0,0 +1 @@ +"""Bridge native10 training from the original Cosmos3-Nano checkpoint.""" diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/base.py b/releases/bridge-native-v3/code/scripts/native_stage2/base.py new file mode 100644 index 0000000000000000000000000000000000000000..123b8ae67d24ba10a8d0db6c17ada2ed9e6167ff --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/base.py @@ -0,0 +1,204 @@ +"""Strict, streaming HF initialization; no old experiment or DCP loader. + +Diffusers key renames follow NVIDIA cosmos-framework ee58e414's exporter. +The root index and transformer index are merged because the root can contain +only the reasoner manifest. Only newly introduced Bridge modules may be absent. +""" +from __future__ import annotations + +from collections import defaultdict +import re +from pathlib import Path + +import torch + +from scripts.native_stage2.common import ( + BASE_REPO, BASE_REVISION, atomic_json, copy_parameter, file_hash, local, + local_slice, read_json, tensor_hash, +) + +NEW_PREFIXES = ("behavior_", "proprio_") +ACTION_KEYS = ("action2llm.fc.weight", "action2llm.bias.weight", + "llm2action.fc.weight", "llm2action.bias.weight", "action_modality_embed") + + +def map_key(key): + for prefix in ("transformer.", "vision_encoder.", "model.net."): + if key.startswith(prefix): + key = key[len(prefix):] + rules = [ + (r"^action_proj_in\.", "action2llm."), (r"^action_proj_out\.", "llm2action."), + (r"^audio_proj_in\.", "sound2llm."), (r"^audio_proj_out\.", "llm2sound."), + (r"^audio_modality_embed$", "sound_modality_embed"), + (r"^proj_in\.", "vae2llm."), (r"^proj_out\.", "llm2vae."), + (r"^time_embedder\.linear_1\.", "time_embedder.mlp.0."), + (r"^time_embedder\.linear_2\.", "time_embedder.mlp.2."), + ] + for before, after in (("to_q", "q_proj"), ("to_k", "k_proj"), ("to_v", "v_proj"), + ("to_out", "o_proj"), ("norm_q", "q_norm"), ("norm_k", "k_norm"), + ("add_q_proj", "q_proj_moe_gen"), ("add_k_proj", "k_proj_moe_gen"), + ("add_v_proj", "v_proj_moe_gen"), ("to_add_out", "o_proj_moe_gen"), + ("norm_added_q", "q_norm_moe_gen"), ("norm_added_k", "k_norm_moe_gen")): + rules.append((rf"\.self_attn\.{before}\.", f".self_attn.{after}.")) + rules += [ + (r"^(?:model\.)?lm_head\.", "language_model.lm_head."), + (r"^(?:model\.)?visual\.", "language_model.visual."), + (r"^(blocks\.|deepstack_merger_list\.|merger\.|patch_embed\.|pos_embed\.)(.*)$", r"language_model.visual.\1\2"), + (r"^language_model\.(?!model\.|lm_head\.|visual\.)(embed_tokens\.|layers\.|norm(?:_moe_gen)?\.)(.*)$", r"language_model.model.\1\2"), + (r"^(?:model\.)?(embed_tokens\.|layers\.|norm(?:_moe_gen)?\.)(.*)$", r"language_model.model.\1\2"), + ] + for pattern, replacement in rules: + key = re.sub(pattern, replacement, key) + return key + + +def weight_map(base): + base = Path(base) + root = read_json(base / "model.safetensors.index.json")["weight_map"] + raw = {k: v for k, v in root.items() if ".k_norm_und_for_gen." not in k} + extra = base / "transformer/diffusion_pytorch_model.safetensors.index.json" + if extra.exists(): + for key, path in read_json(extra)["weight_map"].items(): + raw.setdefault(key, "transformer/" + path) + result = {} + for key, path in raw.items(): + if not path.startswith(("transformer/", "vision_encoder/")): + continue + resolved = (base / path).resolve() + if ".." in Path(path).parts or Path(path).is_absolute(): + raise ValueError("Unsafe checkpoint index path") + name = map_key(key) + if name in result: + raise ValueError(f"Two source tensors map to {name}") + result[name] = (str(resolved), key) + return result + + +def verify_base_files(base, output, offline=False): + """Bind every consumed HF component to the fixed upstream revision.""" + base, output = Path(base), Path(output) + index = weight_map(base) + paths = {Path(path) for path, _ in index.values()} + paths.add(base / "config.json") + paths.add(base / "model.safetensors.index.json") + for folder in (base / "text_tokenizer", base / "vision_encoder"): + paths.update(p for p in folder.rglob("*") if p.is_file() and ".cache" not in p.parts) + paths.update(base.glob("*.json")) + paths.update(base.glob("*.jinja")) + paths.update(base.glob("transformer/*.json")) + receipt = output / "base_identity.json" + old = read_json(receipt) if receipt.exists() else None + # HF cache symlinks point to blobs outside the snapshot. Track logical paths + # for HF lookup and resolved-file stats for safe reuse of a previous audit. + logical = {str((base / rel).resolve()): rel for rel in + set(read_json(base / "model.safetensors.index.json")["weight_map"].values())} + names = {} + for p in paths: + try: + rel = str(p.relative_to(base)) + except ValueError: + rel = logical.get(str(p)) + if rel is None: + # Supplementary transformer entries may not be in the root map. + candidates = [x for x in base.rglob(p.name) if x.resolve() == p] + if len(candidates) != 1: + raise ValueError(f"Cannot bind source file {p}") + rel = str(candidates[0].relative_to(base)) + names[rel] = base / rel + stats = {name: [p.stat().st_size, p.stat().st_mtime_ns] for name, p in sorted(names.items())} + if old and old.get("revision") == BASE_REVISION and old.get("stats") == stats: + return old + if offline: + raise ValueError("Offline initialization requires an unchanged base_identity.json from an online audit") + from huggingface_hub import HfApi + info = HfApi().model_info(BASE_REPO, revision=BASE_REVISION, files_metadata=True, timeout=30) + if info.sha != BASE_REVISION: + raise ValueError("Wrong original Nano revision") + upstream = {f.rfilename: f for f in info.siblings} + hashes = {} + import hashlib + for name, path in sorted(names.items()): + source = upstream[name] + if source.size != path.stat().st_size: + raise ValueError(f"Wrong base component size: {name}") + digest = file_hash(path) + if source.lfs: + if digest != source.lfs.sha256: + raise ValueError(f"Wrong original base component: {name}") + else: + value = path.read_bytes() + blob = hashlib.sha1(b"blob " + str(len(value)).encode() + b"\0" + value).hexdigest() + if blob != source.blob_id: + raise ValueError(f"Wrong base config: {name}") + hashes[name] = digest + report = dict(repo=BASE_REPO, revision=BASE_REVISION, files=hashes, stats=stats) + atomic_json(receipt, report) + return report + + +def audit_source(base): + from safetensors import safe_open + index, report = weight_map(base), {} + for name in ACTION_KEYS: + path, key = index[name] + with safe_open(path, framework="pt", device="cpu") as source: + tensor = source.get_tensor(key) + value = tensor if name == "action_modality_embed" else tensor[7] + expected = (4096,) if name == "action_modality_embed" else None + if expected and tuple(tensor.shape) != expected: + raise ValueError("Wrong Nano action embedding width") + if not expected and tensor.shape[0] != 32: + raise ValueError("Wrong original domain count") + report[name] = dict(source_file=path, source_key=key, shape=list(tensor.shape), + domain7_sha256=tensor_hash(value), norm=float(value.float().norm())) + if report["action2llm.fc.weight"]["shape"] != [32, 64 * 4096]: + raise ValueError("Original Nano action input does not have width 64") + if report["llm2action.fc.weight"]["shape"] != [32, 4096 * 64]: + raise ValueError("Original Nano action output does not have width 64") + return report + + +@torch.no_grad() +def load_original(net, base): + from safetensors import safe_open + index = weight_map(base) + state = net.state_dict() + missing = sorted(name for name in state if name not in index and not name.startswith(NEW_PREFIXES)) + if missing: + raise ValueError(f"Original base missing required tensors: {missing[:20]}") + files = defaultdict(list) + for name, target in state.items(): + if name in index: + path, key = index[name] + files[path].append((name, key, target)) + loaded = [] + for path, entries in sorted(files.items()): + with safe_open(path, framework="pt", device="cpu") as source: + for name, key, target in entries: + value = source.get_tensor(key) + if value.shape != target.shape: + raise ValueError(f"Base tensor shape differs: {name}: {value.shape} vs {target.shape}") + copy_parameter(target, value) + if not torch.equal(local(target).cpu(), value[local_slice(target)].to(target.dtype)): + raise AssertionError(f"Base tensor failed exact load: {name}") + loaded.append(name) + return dict(loaded=loaded, initialized_new=sorted(set(state) - set(loaded))) + + +def action_audit(net, base): + """Compare source against each FSDP shard; no rank-zero-only collectives.""" + from safetensors import safe_open + from scripts.bridge_native_contract import resolve_model_action_dim + width = resolve_model_action_dim(net) + index, report = weight_map(base), {} + named = dict(net.named_parameters()) + for name in ACTION_KEYS: + parameter = named[name] + path, key = index[name] + with safe_open(path, framework="pt", device="cpu") as source: + expected = source.get_tensor(key)[local_slice(parameter)].to(parameter.dtype) + actual = local(parameter).detach().cpu() + if not torch.equal(expected, actual): + raise AssertionError(f"Original action tensor changed before first update: {name}") + report[name] = dict(local_sha256=tensor_hash(actual), shape=list(actual.shape), exact=True) + return dict(model_action_dim=width, tensors=report) diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/checkpoint.py b/releases/bridge-native-v3/code/scripts/native_stage2/checkpoint.py new file mode 100644 index 0000000000000000000000000000000000000000..62b2e1130c4f7b3d104de1a2aa91a1be5f7e93d3 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/checkpoint.py @@ -0,0 +1,130 @@ +"""Atomic per-rank native deltas with all optimizer state and consumed cursors.""" +from __future__ import annotations + +import os +import random +import shutil +import uuid +from pathlib import Path + +import numpy as np +import torch + +from scripts.native_stage2.common import (atomic_json, barrier, file_hash, gather_objects, json_hash, + local, local_slice, rank, read_json, tensor_hash, world_size) + + +def rng_state(): + state = np.random.get_state() + return dict(python=random.getstate(), numpy=[state[0], state[1].tolist(), state[2], state[3], state[4]], + torch=torch.get_rng_state(), cuda=torch.cuda.get_rng_state() if torch.cuda.is_initialized() else None) + + +def restore_rng(state): + random.setstate(state["python"]) + n = state["numpy"] + np.random.set_state((n[0], np.array(n[1], dtype=np.uint32), *n[2:])) + torch.set_rng_state(state["torch"]) + if state["cuda"] is not None: + torch.cuda.set_rng_state(state["cuda"]) + + +def layout(optimizer): + return {name: dict(shape=list(p.shape), local_shape=list(local(p).shape), + slices=[[s.start, s.stop] for s in local_slice(p)]) for name, p in optimizer.named.items()} + + +def save_checkpoint(run, step, optimizer, memory, cursor, identity, progress): + run = Path(run) + final = run / "checkpoints" / f"step_{step:09d}" + if final.exists(): + raise FileExistsError(f"Checkpoint already exists; refusing to overwrite {final}") + local_bytes = sum(local(p).numel() * 14 for p in optimizer.named.values()) + required = sum(gather_objects(local_bytes)) + (2 << 30) + free = shutil.disk_usage(run).free + if free < required: + raise OSError(f"Checkpoint needs {required / 2**30:.1f} GiB; only {free / 2**30:.1f} GiB free") + nonce = gather_objects(uuid.uuid4().hex)[0] + temp = final.with_name(f".{final.name}.{nonce}.incomplete") + temp.mkdir(parents=True, exist_ok=True) + payload = dict(format="bridge_native_stage2_v1", identity=identity, step=step, consumed_microbatches=cursor, + world_size=world_size(), rank=rank(), layout=layout(optimizer), rng=rng_state(), progress=progress, + parameters={name: local(p).detach().cpu() for name, p in optimizer.named.items()}, + optimizer={name: {key: local(value).detach().cpu() for key, value in optimizer.state[p].items()} + for name, p in optimizer.named.items()}, + observed=optimizer.observed, + optimizer_groups=[{key: value for key, value in group.items() if key != "params"} + for group in optimizer.param_groups], + scheduler=dict(kind="linear_warmup_then_constant", warmup_steps=10, last_step=step), + retrieval={name: value.cpu() for name, value in memory.head.state_dict().items()}) + path = temp / f"rank_{rank():05d}.pt" + with path.open("wb") as stream: + torch.save(payload, stream) + stream.flush() + os.fsync(stream.fileno()) + del payload + files = gather_objects(dict(name=path.name, sha256=file_hash(path), size=path.stat().st_size)) + if rank() == 0: + atomic_json(temp / "manifest.json", dict(format="bridge_native_stage2_v1", step=step, world_size=world_size(), + identity=identity, files=files, complete=True)) + fd = os.open(temp, os.O_RDONLY) + try: + os.fsync(fd) + finally: + os.close(fd) + temp.rename(final) + fd = os.open(final.parent, os.O_RDONLY) + try: + os.fsync(fd) + finally: + os.close(fd) + barrier() + return final + + +def read_checkpoint(path, optimizer, identity): + path = Path(path) + manifest = read_json(path / "manifest.json") + if manifest.get("format") != "bridge_native_stage2_v1" or not manifest.get("complete"): + raise ValueError("Only atomically completed native checkpoints can resume") + if manifest["identity"] != identity or manifest["world_size"] != world_size(): + raise ValueError("Checkpoint base/contracts or GPU count differ; resharding is not supported") + record = manifest["files"][rank()] + shard = path / record["name"] + if shard.stat().st_size != record["size"] or file_hash(shard) != record["sha256"]: + raise ValueError("Checkpoint integrity check failed") + state = torch.load(shard, map_location="cpu", weights_only=True, mmap=True) + if state["layout"] != layout(optimizer) or state["identity"] != identity or state["rank"] != rank(): + raise ValueError("Checkpoint parameter layout differs") + expected_groups = [{k: v for k, v in g.items() if k not in ("params", "lr")} for g in optimizer.param_groups] + actual_groups = [{k: v for k, v in g.items() if k != "lr"} for g in state["optimizer_groups"]] + if actual_groups != expected_groups or state["scheduler"] != dict(kind="linear_warmup_then_constant", warmup_steps=10, last_step=state["step"]): + raise ValueError("Checkpoint optimizer/scheduler configuration differs") + return state + + +@torch.no_grad() +def restore_checkpoint(path, optimizer, memory, identity): + saved = read_checkpoint(path, optimizer, identity) + for name, p in optimizer.named.items(): + local(p).copy_(saved["parameters"][name]) + for key, value in saved["optimizer"][name].items(): + local(optimizer.state[p][key]).copy_(value) + if not torch.equal(local(p).cpu(), saved["parameters"][name]): + raise AssertionError(f"Parameter restore failed: {name}") + memory.head.load_state_dict(saved["retrieval"], strict=True) + optimizer.observed = saved["observed"] + optimizer.check_domains() + restore_rng(saved["rng"]) + return saved["step"], saved["consumed_microbatches"], saved["progress"] + + +def verify_roundtrip(path, optimizer, identity): + saved = read_checkpoint(path, optimizer, identity) + for name, p in optimizer.named.items(): + if not torch.equal(local(p).cpu(), saved["parameters"][name]): + raise AssertionError(f"Checkpoint parameter mismatch: {name}") + for key, value in optimizer.state[p].items(): + if not torch.equal(local(value).cpu(), saved["optimizer"][name][key]): + raise AssertionError(f"Checkpoint optimizer mismatch: {name}/{key}") + return dict(parameters_exact=True, optimizer_exact=True, consumed_microbatches=saved["consumed_microbatches"]) diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/common.py b/releases/bridge-native-v3/code/scripts/native_stage2/common.py new file mode 100644 index 0000000000000000000000000000000000000000..3257315ac80c649cf3b51bd30016655c6559eaec --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/common.py @@ -0,0 +1,95 @@ +"""Portable identities, atomic reports and distributed helpers.""" +from __future__ import annotations + +import hashlib +import json +import os +from pathlib import Path + +BASE_REPO = "nvidia/Cosmos3-Nano" +BASE_REVISION = "e59a53c25979a090fa8706c9acc0c254a6e89b92" +SEED = 20260926 + + +def read_json(path): + return json.loads(Path(path).read_text()) + + +def atomic_json(path, value): + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + temp = path.with_name(f".{path.name}.{os.getpid()}.tmp") + with temp.open("w") as stream: + json.dump(value, stream, indent=2, ensure_ascii=False, allow_nan=False) + stream.write("\n") + stream.flush() + os.fsync(stream.fileno()) + temp.replace(path) + + +def file_hash(path): + h = hashlib.sha256() + with Path(path).open("rb") as stream: + for block in iter(lambda: stream.read(8 << 20), b""): + h.update(block) + return h.hexdigest() + + +def json_hash(value): + return hashlib.sha256(json.dumps(value, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + + +def local(tensor): + return tensor.to_local() if hasattr(tensor, "to_local") else tensor + + +def tensor_hash(tensor): + import torch + value = local(tensor).detach().cpu().contiguous() + return hashlib.sha256(value.reshape(-1).view(torch.uint8).numpy().tobytes()).hexdigest() + + +def rank(): + import torch.distributed as dist + return dist.get_rank() if dist.is_initialized() else 0 + + +def world_size(): + import torch.distributed as dist + return dist.get_world_size() if dist.is_initialized() else 1 + + +def barrier(): + import torch.distributed as dist + if dist.is_initialized(): + dist.barrier() + + +def gather_objects(value): + import torch.distributed as dist + if not dist.is_initialized(): + return [value] + result = [None] * world_size() + dist.all_gather_object(result, value) + return result + + +def save_report(output, name, value): + if rank() == 0: + atomic_json(Path(output) / name, value) + + +def local_slice(parameter): + if not hasattr(parameter, "device_mesh"): + return tuple(slice(0, size) for size in parameter.shape) + from torch.distributed.tensor._utils import compute_local_shape_and_global_offset + shape, offset = compute_local_shape_and_global_offset( + parameter.shape, parameter.device_mesh, parameter.placements) + return tuple(slice(start, start + size) for start, size in zip(offset, shape)) + + +def copy_parameter(parameter, full): + import torch + with torch.no_grad(): + piece = full[local_slice(parameter)] + local(parameter).copy_(piece.to(device=parameter.device, dtype=parameter.dtype)) diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/data.py b/releases/bridge-native-v3/code/scripts/native_stage2/data.py new file mode 100644 index 0000000000000000000000000000000000000000..1d6f2d8c0328fb0f6e35000f4f17dbfca214bb3e --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/data.py @@ -0,0 +1,162 @@ +"""Episode-bounded native10 labels and deterministic consumed-sample cursors.""" +from __future__ import annotations + +from collections import OrderedDict +from pathlib import Path +import json + +import numpy as np +import torch + +from scripts.bridge_native_contract import normalize_policy_native10, policy_native_actions, proprio_native10 +from scripts.bridge_recovery_contract import normalize_reached_delta +from scripts.native_stage2.common import read_json + + +def make_window(states, actions, frames, start, instruction, episode_id): + """33 observations / 32 slots; only real adjacent state pairs are labels.""" + states, actions, frames = np.asarray(states), np.asarray(actions), np.asarray(frames) + if states.shape != (len(frames), 8) or actions.shape != (len(frames), 7): + raise ValueError("Bridge requires aligned [T,8] states, [T,7] actions and video") + if not 0 <= start < len(states) - 1: + raise ValueError("Window must contain at least one real state pair") + count = min(32, len(states) - start - 1) + raw = np.zeros((32, 10), dtype=np.float32) + raw[:count] = policy_native_actions(states[start:start + count + 1], actions[start:start + count, 6]) + normalized = np.zeros_like(raw) + normalized[:count] = normalize_policy_native10(raw[:count]) + indices = np.minimum(np.arange(start, start + 33), len(frames) - 1) + prefix_end = start // 4 * 4 + # A completed CTE transition contains exactly four observed state changes. + reached = np.concatenate((states[1:prefix_end + 1, :6] - states[:prefix_end, :6], + actions[:prefix_end, 6:7]), axis=1).astype(np.float32) + return dict( + video=torch.from_numpy(frames[indices].copy()).permute(3, 0, 1, 2).contiguous(), + action=torch.from_numpy(normalized), native_action_raw=torch.from_numpy(raw), + proprio=torch.from_numpy(proprio_native10(states[start])), + ai_caption=str(instruction), mode="wam", viewpoint="ego_view", + domain_id=torch.tensor(7), conditioning_fps=torch.tensor(5), + native_action_valid=torch.arange(32) < count, + native_vision_valid=torch.arange(0, 33, 4) <= count, + native_episode_start=torch.tensor([episode_id, start]), + cte_frames=torch.from_numpy(frames[np.arange(0, prefix_end + 1, 4)].copy()).permute(0, 3, 1, 2), + cte_actions=torch.from_numpy(normalize_reached_delta(reached)).reshape(-1, 4, 7), + initial_image=frames[0].copy(), raw_state=states[start].copy(), + ) + + +class Episodes: + def __init__(self, root, cache_episodes=2): + self.root = Path(root) + self.info = read_json(self.root / "meta/info.json") + if self.info["fps"] != 5 or self.info["robot_type"] != "widowx": + raise ValueError("Expected IPEC WidowX at 5 Hz") + self.episodes = {int(x["episode_index"]): x for x in self._jsonl("episodes")} + self.tasks = {int(x["task_index"]): x["task"] for x in self._jsonl("tasks")} + self.cache, self.capacity = OrderedDict(), cache_episodes + + def _jsonl(self, name): + return [json.loads(line) for line in (self.root / f"meta/{name}.jsonl").read_text().splitlines()] + + def paths(self, eid): + fmt = dict(episode_index=eid, episode_chunk=eid // self.info.get("chunks_size", 1000), + video_key="observation.images.image_0") + return tuple(self.root / self.info[key].format(**fmt) for key in ("data_path", "video_path")) + + def load(self, eid): + if eid in self.cache: + self.cache.move_to_end(eid) + return self.cache[eid] + import av + import pyarrow.parquet as pq + parquet, video = self.paths(eid) + table = pq.read_table(parquet, columns=["observation.state", "action", "episode_index", "task_index"]) + if set(table["episode_index"].to_pylist()) != {eid}: + raise ValueError("Cross-episode parquet") + states = np.asarray(table["observation.state"].to_pylist(), dtype=np.float32) + actions = np.asarray(table["action"].to_pylist(), dtype=np.float32) + with av.open(str(video)) as container: + frames = np.stack([frame.to_ndarray(format="rgb24") for frame in container.decode(video=0)]) + if len(frames) != self.episodes[eid]["length"] or len(states) != len(frames): + raise ValueError(f"Video/state/metadata length mismatch: {eid}") + if frames.shape[1:] != (256, 256, 3) or not np.isfinite(states).all() or not np.isfinite(actions).all(): + raise ValueError(f"Invalid Bridge episode: {eid}") + task = self.tasks[int(table["task_index"][0].as_py())] + result = states, actions, frames, task + self.cache[eid] = result + while len(self.cache) > self.capacity: + self.cache.popitem(last=False) + return result + + def window(self, eid, start): + states, actions, frames, text = self.load(eid) + return make_window(states, actions, frames, start, text, eid) + + +def partitions(bundle, episodes): + bundle = Path(bundle) + pilot = read_json(bundle / "memory/pilot_split.json") + stage1 = set(read_json(bundle / "memory/stage1_split.json")["train"]) + # The bank itself is the authoritative ordered list; never infer support + # membership from task names or the historical pilot support prototypes. + bank = torch.load(bundle / "memory/static_bank_3000/static_bank.pt", map_location="cpu", weights_only=True) + support = list(map(int, bank["support_episode_ids"])) + if len(support) != 3000 or len(set(support)) != 3000: + raise ValueError("Expected exactly 3000 distinct support episodes") + train, development = set(pilot["train"]), set(pilot["development"]) + if len(train) != 32 or len(development) != 8 or train & development or (train | development) & set(support): + raise ValueError("Invalid pilot/support split") + if not (train | development | set(support)) <= stage1: + raise ValueError("Episodes outside original Stage1 train") + continuous = sorted(eid for eid in stage1 - set(support) - development + if eid in episodes.episodes and episodes.episodes[eid]["length"] >= 2) + for eid in train | development: + if episodes.episodes[eid]["length"] < 33: + raise ValueError("Pilot episodes must have full 32-action windows") + return dict(train=sorted(train), development=sorted(development), support=support, continuous=continuous) + + +class WindowStream: + """Stateless sampling indexed by the last consumed global microbatch. + + Pilot pairs alternate full windows / completed-BIT windows. Independent + per-position RNG makes loader prefetch irrelevant to exact resumption. + Continuous epochs visit every valid start once (shuffled); no episode loss. + """ + def __init__(self, metadata, ids, seed, world_size, pilot=True): + self.seed, self.world_size, self.pilot = seed, world_size, pilot + self.windows = [(eid, start) for eid in ids for start in range(metadata[eid]["length"] - 1)] + self.full = [i for i, (eid, start) in enumerate(self.windows) if start + 32 < metadata[eid]["length"]] + self.bit = [i for i, (_, start) in enumerate(self.windows) if start >= 16] + if not self.windows or (pilot and (not self.full or not self.bit)): + raise ValueError("No eligible native training windows") + self._epoch, self._order = None, None + + def sample(self, consumed_microbatches, rank): + position = consumed_microbatches * self.world_size + rank + if self.pilot: + rng = np.random.default_rng(np.random.SeedSequence([self.seed, position])) + pool = self.bit if consumed_microbatches % 2 else self.full + return self.windows[pool[int(rng.integers(len(pool)))]] + epoch, index = divmod(position, len(self.windows)) + if self._epoch != epoch: + self._epoch = epoch + self._order = np.random.default_rng(self.seed + epoch).permutation(len(self.windows)) + return self.windows[int(self._order[index])] + + +def packed_sample(sample, transform): + """Match PackingDataLoader's single-sample layout, without prefetch.""" + from cosmos_framework.data.generator.joint_dataloader import JointDataLoader + omit = {"cte_frames", "cte_actions", "initial_image", "raw_state", "native_action_raw"} + output = transform({k: v.clone() if torch.is_tensor(v) else v for k, v in sample.items() if k not in omit}, "256") + packed = {} + for key, value in output.items(): + if key in JointDataLoader._MULTI_ITEM_KEYS: + packed[key] = [[value]] + elif torch.is_tensor(value): + packed[key] = [value.unsqueeze(0)] + else: + packed[key] = [value] + packed["dataset_name"] = ["bridge_native10"] + return packed diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/evaluate.py b/releases/bridge-native-v3/code/scripts/native_stage2/evaluate.py new file mode 100644 index 0000000000000000000000000000000000000000..efdad8ba70730e5b1fc72653595da926ce227dd7 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/evaluate.py @@ -0,0 +1,129 @@ +"""Fixed probes and explicit 50/500-step acceptance decisions.""" +from __future__ import annotations + +import numpy as np +import torch + +from scripts.bridge_native_contract import denormalize_policy_native10, controller_command +from scripts.native_stage2.common import gather_objects, rank, world_size, tensor_hash +from scripts.native_stage2.data import packed_sample + + +def action_metrics(predicted, sample): + from cosmos_framework.data.generator.action.pose_utils import convert_rotation + predicted = np.asarray(predicted, dtype=np.float32) + if predicted.shape != (32, 10) or not np.isfinite(predicted).all(): + raise ValueError("Sampled policy must be finite normalized [32,10]") + valid = sample["native_action_valid"].numpy() + normalized_target = sample["action"].numpy()[valid] + native = denormalize_policy_native10(predicted)[valid] + target = sample["native_action_raw"].numpy()[valid] + p_rotation = convert_rotation(native[:, 3:9], "rot6d", "matrix", normalize_matrix=True) + t_rotation = convert_rotation(target[:, 3:9], "rot6d", "matrix", normalize_matrix=True) + relative = np.swapaxes(t_rotation, -1, -2) @ p_rotation + angle = np.arccos(np.clip((np.trace(relative, axis1=-2, axis2=-1) - 1) / 2, -1, 1)) + gt = target[:, 9] > 0.5 + previous = np.r_[sample["raw_state"][7] > 0.5, gt[:-1]] + pg = native[:, 9] > 0.5 + masks = dict(steady=previous == gt, open_close=previous & ~gt, close_open=~previous & gt) + from cosmos_framework.data.generator.action.datasets import bridge_orig_lerobot_dataset as bridge + from scipy.spatial.transform import Rotation + tcp = np.eye(4) + tcp[:3, 3] = sample["raw_state"][:3] + tcp[:3, :3] = Rotation.from_euler("xyz", sample["raw_state"][3:6]).as_matrix() @ bridge._DEFAULT_ROTATION + decoded_first = controller_command(native[0], tcp, tcp) + return dict(normalized_error=np.abs(predicted[valid] - normalized_target).mean(0).tolist(), + translation_error=float(np.linalg.norm(native[:, :3] - target[:, :3], axis=-1).mean()), + rotation_error=float(angle.mean()), + gripper={key: dict(count=int(mask.sum()), correct=int(((pg == gt) & mask).sum())) + for key, mask in masks.items()}, + normalized10=predicted.tolist(), denormalized10=denormalize_policy_native10(predicted).tolist(), + decoded_first_command=decoded_first.tolist(), + decode_assumption="offline diagnostic: previous controller target equals current measured pose") + + +def probe_windows(episodes, splits): + result = [] + for split in ("train", "development"): + for eid in splits[split]: + states, actions, _, _ = episodes.load(eid) + grip = actions[:-1, 6] > 0.5 + starts = {0} + for direction in (-1, 1): + transitions = np.flatnonzero(np.diff(grip.astype(int)) == direction) + 1 + if len(transitions): + starts.add(max(0, min(int(transitions[0]) - 8, len(states) - 33))) + result.extend((split, eid, start) for start in sorted(starts)) + return result + + +@torch.no_grad() +def probes(model, memory, episodes, transform, windows, seed, step): + records = [] + training = model.net.training + model.net.eval() + try: + for offset in range(0, len(windows), world_size()): + index = min(offset + rank(), len(windows) - 1) + split, eid, start = windows[index] + with torch.random.fork_rng(devices=[torch.cuda.current_device()]): + torch.manual_seed(seed + index) + sample = memory.attach(episodes.window(eid, start)) + output, loss = model.training_step(packed_sample(sample, transform), index) + errors = model.last_action_error.tolist() + fixed_latent_hash = [tensor_hash(x) for x in output["x0"]] + fixed_noised_hash = [tensor_hash(x) for x in output["xt"]] + generated = model.generate_samples_from_batch( + packed_sample(sample, transform), seed=[seed + index], num_steps=30, guidance=1.5, shift=5) + action = generated["action"][0].float().cpu() + while action.ndim > 2 and action.shape[0] == 1: + action = action[0] + record = dict(index=index, split=split, episode=eid, start=start, seed=seed + index, + latent_sha256=fixed_latent_hash, noised_sha256=fixed_noised_hash, + action_error=errors, bit_length=int(sample["behavior_effect_valid"].sum()), + losses={key: float(output[key]) for key in ("flow_matching_loss_vision", "flow_matching_loss_action", "behavior_prior_nll")}, + sampled=action_metrics(action.numpy(), sample)) + if offset + rank() < len(windows): + records.append(record) + if rank() == 0: + print(f"Native probe step={step} {min(offset + world_size(), len(windows))}/{len(windows)}", flush=True) + finally: + model.net.train(training) + merged = sorted([x for part in gather_objects(records) for x in part], key=lambda x: x["index"]) + return dict(step=step, records=merged, summary=summarize(merged)) + + +def summarize(records): + output = {} + for split in ("train", "development"): + rows = [r for r in records if r["split"] == split] + gripper = {} + for kind in ("steady", "open_close", "close_open"): + count = sum(r["sampled"]["gripper"][kind]["count"] for r in rows) + correct = sum(r["sampled"]["gripper"][kind]["correct"] for r in rows) + gripper[kind] = dict(count=count, accuracy=correct / count if count else None) + output[split] = dict(action_error=float(np.mean([r["action_error"] for r in rows])), + sampled_error=float(np.mean([r["sampled"]["normalized_error"] for r in rows])), + gripper=gripper) + return output + + +def gate500(baseline, current, engineering_passed): + old, new = baseline["summary"], current["summary"] + checks = dict(engineering=engineering_passed, + train_improvement=new["train"]["action_error"] <= old["train"]["action_error"] * 0.9, + sampled_train=new["train"]["sampled_error"] <= old["train"]["sampled_error"] * 1.05, + sampled_development=new["development"]["sampled_error"] <= old["development"]["sampled_error"] * 1.05, + development=new["development"]["action_error"] <= old["development"]["action_error"] * 1.2) + for split in ("train", "development"): + for kind in ("open_close", "close_open"): + before, after = (s[split]["gripper"][kind]["accuracy"] for s in (old, new)) + checks[f"{split}_{kind}"] = before is not None and after is not None and after >= before - 0.05 + checks["fixed_probes"] = same_probe_inputs(baseline, current) + return dict(passed=all(checks.values()), checks=checks) + + +def same_probe_inputs(baseline, current): + def identity(r): + return r["episode"], r["start"], r["seed"], r["latent_sha256"], r["noised_sha256"] + return [identity(r) for r in baseline["records"]] == [identity(r) for r in current["records"]] diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/memory.py b/releases/bridge-native-v3/code/scripts/native_stage2/memory.py new file mode 100644 index 0000000000000000000000000000000000000000..e3f9a3910a6e8074691093edcee70f3797d30b7c --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/memory.py @@ -0,0 +1,166 @@ +"""Frozen initial-image retrieval and bounded, prefix-only CTE features.""" +from __future__ import annotations + +from collections import OrderedDict +from pathlib import Path + +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F + +from scripts.native_stage2.common import gather_objects, rank, save_report, world_size, tensor_hash + + +class QueryHead(nn.Sequential): + def __init__(self): + super().__init__(nn.Linear(4096, 1024), nn.GELU(), nn.Linear(1024, 128)) + + def forward(self, x): + return F.normalize(super().forward(x), dim=-1) + + +@torch.no_grad() +def retrieval_metrics(query, keys, indices): + scores = query @ keys.T + return dict(cosine=float((query * keys[indices]).sum(-1).mean()), + recall5=float((scores.topk(5, -1).indices == indices[:, None]).any(-1).float().mean())) + + +def fit_head(features, keys, output, seed, updates=2000): + """All ranks run the same small deterministic fit; no distributed optimizer.""" + if features.shape != (3000, 4096) or keys.shape != (3000, 128): + raise ValueError("Query alignment must use the 3000 support episodes only") + device = features.device + with torch.random.fork_rng(devices=[device.index] if device.type == "cuda" else []): + torch.manual_seed(seed) + head = QueryHead().to(device) + order = torch.randperm(3000, generator=torch.Generator().manual_seed(seed)).to(device) + train, validation = order[:2700], order[2700:] + random_baseline = retrieval_metrics(head(features[validation]), keys, validation) + constant = F.normalize(keys[train].mean(0, keepdim=True), dim=-1).expand(300, -1) + constant_baseline = retrieval_metrics(constant, keys, validation) + optimizer = torch.optim.AdamW(head.parameters(), lr=1e-3) + history, best, best_state = [], None, None + for step in range(1, updates + 1): + ids = train[torch.randint(len(train), (128,), device=device)] + pred = head(features[ids]) + cosine = 1 - (pred * keys[ids]).sum(-1).mean() + contrast = F.cross_entropy(pred @ keys.T / 0.07, ids) + loss = cosine + contrast + optimizer.zero_grad(set_to_none=True) + loss.backward() + optimizer.step() + if step % 100 == 0 or step == updates: + with torch.no_grad(): + metrics = retrieval_metrics(head(features[validation]), keys, validation) + history.append(dict(step=step, **metrics)) + score = (metrics["recall5"], metrics["cosine"]) + if best is None or score > (best["recall5"], best["cosine"]): + best = dict(step=step, **metrics) + best_state = {k: v.detach().cpu().clone() for k, v in head.state_dict().items()} + passed = all(best[key] > baseline[key] for key in ("cosine", "recall5") + for baseline in (random_baseline, constant_baseline)) + report = dict(passed=passed, train_indices=train.cpu().tolist(), validation_indices=validation.cpu().tolist(), + random=random_baseline, constant=constant_baseline, best=best, history=history) + save_report(output, "retrieval_report.json", report) + if not passed: + raise RuntimeError("Retrieval alignment failed random/constant baselines; see retrieval_report.json") + head.load_state_dict(best_state, strict=True) + return head.eval().requires_grad_(False), report + + +class CausalMemory: + def __init__(self, model, base, bundle, capacity=40): + from transformers import Qwen3VLProcessor + from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig + self.model, self.device = model, torch.device("cuda", torch.cuda.current_device()) + self.processor = Qwen3VLProcessor.from_pretrained(str(base), local_files_only=True) + payload = torch.load(Path(bundle) / "memory/cte_30000_inference.pt", map_location="cpu", weights_only=True) + self.cte = CausalTransitionEncoder(CausalTransitionEncoderConfig(**payload["model_config"])) + self.cte.load_state_dict(payload["model"], strict=True) + self.cte.to(self.device).eval().requires_grad_(False) + self.bank = torch.load(Path(bundle) / "memory/static_bank_3000/static_bank.pt", map_location="cpu", weights_only=True) + self.keys = F.normalize(torch.stack([e["retrieval_key"] for e in self.bank["entries"]]).float().to(self.device), dim=-1) + self.values = torch.stack([e["behavior_value"] for e in self.bank["entries"]]).float().to(self.device) + self.support = set(self.bank["support_episode_ids"]) + self.capacity, self.cache, self.head = capacity, OrderedDict(), None + + @torch.no_grad() + def readout(self, image, instruction): + from PIL import Image + messages = [{"role": "user", "content": [{"type": "image", "image": Image.fromarray(image)}, + {"type": "text", "text": str(instruction)}]}] + text = self.processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + inputs = self.processor(text=[text], images=[Image.fromarray(image)], return_tensors="pt") + inputs = {k: v.to(self.device) for k, v in inputs.items() + if k in {"input_ids", "pixel_values", "image_grid_thw", "attention_mask"}} + training = self.model.net.training + self.model.net.eval() + try: + with torch.autocast("cuda", dtype=torch.bfloat16): + return self.model.net.bridge_readout(**inputs)[0].float() + finally: + self.model.net.train(training) + + def train_retrieval(self, episodes, output, seed): + ids = self.bank["support_episode_ids"] + parts = [] + for offset in range(0, len(ids), world_size()): + index = min(offset + rank(), len(ids) - 1) + _, _, frames, instruction = episodes.load(int(ids[index])) + parts.append((index, self.readout(frames[0], instruction).cpu())) + if rank() == 0 and offset % (100 * world_size()) == 0: + print(f"Native retrieval readouts: {offset}/{len(ids)}", flush=True) + by_index = {index: feature for part in gather_objects(parts) for index, feature in part} + features = torch.stack([by_index[i] for i in range(3000)]).to(self.device) + self.head, report = fit_head(features, self.keys, output, seed) + return report + + @torch.no_grad() + def attach(self, sample): + from scripts.bridge_recovery_contract import encode_cte_single_frame + eid, start = map(int, sample["native_episode_start"]) + if eid in self.support: + raise ValueError("A Stage2 query overlaps the static support bank") + if eid not in self.cache: + self.cache[eid] = dict(latents=[], contexts={}) + entry = self.cache[eid] + self.cache.move_to_end(eid) + while len(self.cache) > self.capacity: + self.cache.popitem(last=False) + # All ranks must call an equal number of FSDP reasoner forwards. A hit + # on one rank cannot skip a collective needed by another rank. + miss = torch.tensor(int("global" not in entry), device=self.device) + if torch.distributed.is_initialized(): + torch.distributed.all_reduce(miss, op=torch.distributed.ReduceOp.MAX) + if miss.item(): + query = self.head(self.readout(sample["initial_image"], sample["ai_caption"]).unsqueeze(0))[0] + scores, nearest = (self.keys @ query).topk(5) + entry["global"] = ((scores / 0.07).softmax(0)[:, None] * self.values[nearest]).sum(0).cpu() + boundary = start // 4 + if boundary not in entry["contexts"]: + frames = sample["cte_frames"] + for index in range(len(entry["latents"]), len(frames)): + rgb = frames[index].permute(1, 2, 0).numpy() + latent = encode_cte_single_frame(self.model.tokenizer_vision_gen.encode, rgb, self.device) + entry["latents"].append(latent.cpu()) + latent = torch.stack(entry["latents"][:boundary + 1]).unsqueeze(0).to(self.device) + action = sample["cte_actions"].unsqueeze(0).to(self.device) + with torch.autocast("cuda", dtype=torch.bfloat16): + result = self.cte(latent, action) + effects = result["effect_post"][0][result["effect_complete"][0]] + if len(effects) != start // 16: + raise AssertionError("Effect exposed before its 16 executed controls") + history, valid = torch.zeros(4, 128), torch.zeros(4, dtype=torch.bool) + count = min(4, len(effects)) + if count: + history[-count:] = effects[-count:].float().cpu() + valid[-count:] = True + entry["contexts"][boundary] = dict(behavior_phase=result["phase"][0, -1].float().cpu(), + behavior_effect=history, behavior_effect_valid=valid) + return dict(sample, behavior_global=entry["global"], **entry["contexts"][boundary]) + + def frozen_hashes(self): + return {f"{prefix}.{name}": tensor_hash(value) for prefix, module in (("cte", self.cte), ("retrieval", self.head)) + for name, value in module.state_dict().items()} diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/model.py b/releases/bridge-native-v3/code/scripts/native_stage2/model.py new file mode 100644 index 0000000000000000000000000000000000000000..a521ca5c7f694fed25e09cfe67c21011e488c647 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/model.py @@ -0,0 +1,158 @@ +"""Native WAM model: scoped configuration, real video loss and pure reasoner readout.""" +from __future__ import annotations + +from copy import deepcopy +from types import MethodType + +import torch +from omegaconf import OmegaConf + +from cosmos_framework.model.generator.omni_mot_model import OmniMoTModel +from scripts.widowx_masked_loss import batch_vectors, mask_loss_conditions + + +def parameter_group(name): + if name.startswith(("action2llm.", "llm2action.")): + return "action_tables" + if name == "action_modality_embed": + return "action_embedding" + if name.startswith(("behavior_", "proprio_")): + return "bridge" + if "moe_gen" in name or "k_norm_und_for_gen" in name or name.startswith(( + "time_embedder.", "vae2llm.", "llm2vae.", "vision_modality_embed")): + return "generation" + return None + + +def native_config(base, vae, world_size): + from cosmos_framework.configs.base.defaults.model_config import OmniMoTModelConfig + from cosmos_framework.configs.base.defaults.tokenizer import Wan2pt2VAEConfig + from cosmos_framework.configs.base.experiment.sft.models.nano_model_config import NANO_MODEL_CONFIG + import attrs + cfg = OmegaConf.merge(OmegaConf.create(attrs.asdict(OmniMoTModelConfig()), flags={"allow_objects": True}), + deepcopy(NANO_MODEL_CONFIG)) + cfg.tokenizer = OmegaConf.merge(deepcopy(Wan2pt2VAEConfig), cfg.tokenizer) + cfg.tokenizer.vae_path = str(vae) + cfg.resolution = "256" + cfg.ema.enabled = False + cfg.compile.enabled = False + cfg.diffusion_expert_config.load_weights_from_pretrained = False + cfg.parallelism.data_parallel_shard_degree = world_size + cfg.parallelism.fsdp_master_dtype = "bfloat16" # masters belong to FP32MasterAdamW + cfg.rectified_flow_training_config.normalize_loss_by_active = True + cfg.rectified_flow_training_config.sample_level_loss_averaging = False + cfg.behavior_stage2.enabled = True + cfg.behavior_stage2.action_dim = 10 + cfg.behavior_stage2.leading_condition_steps = 0 + cfg.behavior_stage2.prior_dropout_rate = 0.0 + cfg.proprio_condition.enabled = True + cfg.proprio_condition.input_dim = 10 + lm = cfg.vlm_config.model_instance.config + lm.base_config.json_file = str(base / "config.json") + lm.tie_word_embeddings = False + lm.include_visual = True + cfg.vlm_config.tokenizer.pretrained_model_name = str(base / "text_tokenizer") + return cfg + + +def reasoner_readout(net, **inputs): + from cosmos_framework.model.generator.mot.unified_mot import prepare_multimodal_reasoner_inputs + embedding, visual_mask, deepstack, positions, _ = prepare_multimodal_reasoner_inputs( + net.language_model, **inputs) + hidden = net.language_model.model.reasoner_forward( + input_ids=None, cache=None, position_ids=positions, inputs_embeds=embedding, + visual_pos_masks=visual_mask, deepstack_visual_embeds=deepstack) + if hidden.shape[0] != 1 or hidden.shape[-1] != 4096: + raise ValueError("Native retrieval requires one unpadded 4096-wide reasoner sequence") + return hidden[:, -1].float() + + +class NativeWAM(OmniMoTModel): + def install_attention_dispatch(self, net): + net.proprio_gate = torch.nn.Parameter(torch.empty((1,), device="meta")) + net.proprio_projector.register_forward_hook( + lambda _module, _args, value: value * net.proprio_gate.sigmoid()) + net.bridge_readout = MethodType(reasoner_readout, net) + for name, param in net.named_parameters(): + param.requires_grad_(parameter_group(name) is not None) + + def build_net(self, *args, **kwargs): + net = super().build_net(*args, **kwargs) + from scripts.native_stage2.common import local + with torch.no_grad(): + local(net.proprio_gate).zero_() + from torch.distributed.fsdp import register_fsdp_forward_method + register_fsdp_forward_method(net, "bridge_readout") + return net + + def training_step(self, data_batch, iteration): + self.native_masks = {kind: batch_vectors(data_batch[f"native_{kind}_valid"]) + for kind in ("action", "vision")} + try: + return super().training_step(data_batch, iteration) + finally: + self.native_masks = None + + def generate_samples_from_batch(self, data_batch, *args, **kwargs): + self.native_masks = {kind: batch_vectors(data_batch[f"native_{kind}_valid"]) + for kind in ("action", "vision")} + try: + return super().generate_samples_from_batch(data_batch, *args, **kwargs) + finally: + self.native_masks = None + + def _compute_flow_matching_loss(self, **kwargs): + from cosmos_framework.model.generator.algorithm.loss.flow_matching import compute_flow_matching_loss + kind = "action" if kwargs.get("raw_action_dim") is not None else "vision" + kwargs["condition_mask"] = mask_loss_conditions(kwargs["condition_mask"], self.native_masks[kind]) + kwargs["normalize_by_active"] = True + if kwargs.pop("sample_weights", None) is not None: + raise ValueError("Native Stage2 does not use legacy per-sample action weighting") + # Call the pinned upstream helper directly: its signature does not have + # the sample_weights extension used by an older Zeva experiment. + return compute_flow_matching_loss(**kwargs, tensor_kwargs_fp32=self.tensor_kwargs_fp32) + + def _compute_losses(self, out_net, data_batch_packed, *args, **kwargs): + from cosmos_framework.model.zeva import gaussian_prior_nll + without_prior = {key: value for key, value in out_net.items() if key != "behavior_prior_mean"} + total, losses = super()._compute_losses(without_prior, data_batch_packed, *args, **kwargs) + mean, std = out_net["behavior_prior_mean"], out_net["behavior_prior_std"] + if mean.shape != (1, 32, 10) or std.shape != mean.shape: + raise ValueError("PBD must produce [1,32,10]") + valid = torch.stack(self.native_masks["action"]).to(mean.device) + prior = gaussian_prior_nll(data_batch_packed.behavior_prior_target.float(), mean.float(), std.float(), valid) + losses["behavior_prior_nll"] = prior + noised = args[0] if args else kwargs["gen_data_noised"] + sigma = noised.sigmas_action + if sigma is None: + raise ValueError("Native WAM requires an action noise schedule") + predicted = noised.xt_tokens_action[0][..., :10].float() - sigma[0].reshape(-1, 1) * out_net["preds_action"][0][..., :10].float() + target = data_batch_packed.behavior_prior_target[0].float() + self.last_action_error = (predicted - target).abs()[valid[0]].mean(0).detach().cpu() + self.runtime_shapes = dict(policy=[1, 32, 10], model_action=[1, 32, 64], + pbd=list(mean.shape), vision=[list(v.shape) for v in out_net["preds_vision"]]) + return total + prior * 0.01, losses + + def denoise(self, net=None, data_batch_packed=None, **kwargs): + # This is executed on every training and solver evaluation. The solver + # starts with padded dimensions zero and receives zero velocity there. + action = data_batch_packed.action + masks = getattr(self, "native_masks", None) + if action is not None: + tokens = [] + for index, tensor in enumerate(action.tokens): + if tensor.shape[-1] != 64: + raise ValueError("Internal action width must remain 64") + tensor = torch.cat((tensor[..., :10], torch.zeros_like(tensor[..., 10:])), -1) + if masks is not None: + tensor = tensor * masks["action"][index].to(tensor.device)[:, None] + tokens.append(tensor) + action.tokens = tokens + if masks is not None and data_batch_packed.vision is not None: + data_batch_packed.vision.tokens = [tensor * masks["vision"][i].to(tensor.device)[None, :, None, None] + for i, tensor in enumerate(data_batch_packed.vision.tokens)] + output = super().denoise(net=net, data_batch_packed=data_batch_packed, **kwargs) + if "preds_action" in output: + output["preds_action"] = [torch.cat((x[..., :10], torch.zeros_like(x[..., 10:])), -1) + for x in output["preds_action"]] + return output diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/online.py b/releases/bridge-native-v3/code/scripts/native_stage2/online.py new file mode 100644 index 0000000000000000000000000000000000000000..6a07becd405617997b653d7392888121310e60e3 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/online.py @@ -0,0 +1,137 @@ +"""Measured-state native execution and real SimplerEnv controller acceptance.""" +from __future__ import annotations + +import argparse +from pathlib import Path + +import numpy as np +from scipy.spatial.transform import Rotation + +from scripts.bridge_native_contract import controller_command, denormalize_policy_native10 +from scripts.bridge_recovery_contract import reached_delta_raw +from scripts.native_stage2.common import atomic_json, file_hash, read_json +from scripts.widowx_rollout import CausalHistory + + +def measured(env): + from cosmos_framework.data.generator.action.datasets import bridge_orig_lerobot_dataset as bridge + u = env.unwrapped + pose = (u.agent.robot.pose.inv() * u.tcp.pose).to_transformation_matrix().astype(np.float64) + raw_rotation = pose[:3, :3] @ bridge._DEFAULT_ROTATION.T + raw = np.r_[pose[:3, 3], Rotation.from_matrix(raw_rotation).as_euler("xyz"), 0., + 1 - float(u.agent.get_gripper_closedness())].astype(np.float32) + return pose, raw + + +def image(env, observation): + import cv2 + from simpler_env.utils.env.observation_utils import get_image_from_maniskill2_obs_dict + return cv2.resize(get_image_from_maniskill2_obs_dict(env, observation), (256, 256)) + + +class NativeExecutor: + def __init__(self, env, observation): + self.env, self.history = env, CausalHistory(image(env, observation)) + self.arm = env.unwrapped.agent.controller.controllers["arm"] + cfg = self.arm.config + if (cfg.frame != "ee_align2" or not cfg.use_target or cfg.normalize_action + or getattr(cfg, "delta_target_from_last_drive_target", False)): + raise ValueError("Native decoder requires unnormalized ee_align2/use_target controller") + + def step(self, native10): + before_pose, before = measured(self.env) + previous = self.arm._target_pose.to_transformation_matrix() + command = controller_command(native10, before_pose, previous) + obs, reward, terminated, truncated, info = self.env.step(command) + after_pose, after = measured(self.env) + reached = reached_delta_raw(before[:6], after[:6], command[6]) + self.history.append_reached_delta(reached, image(self.env, obs)) + record = dict(native10=np.asarray(native10).tolist(), command=command.tolist(), + before=before.tolist(), after=after.tolist(), reached7=reached.tolist(), + measured_tcp=after_pose.tolist(), controller_target=self.arm._target_pose.to_transformation_matrix().tolist(), + completed_controls=4 * len(self.history.transitions), pending_controls=len(self.history.partial)) + return (obs, reward, terminated, truncated, info), record + + +def policy_output(normalized10): + value = np.asarray(normalized10, dtype=np.float32) + if value.shape != (32, 10): + raise ValueError("Policy output must be normalized [32,10]") + return dict(normalized10=value, denormalized10=denormalize_policy_native10(value)) + + +def audit_controller(path, seed=20260926): + import simpler_env + from cosmos_framework.data.generator.action.datasets import bridge_orig_lerobot_dataset as bridge + from cosmos_framework.data.generator.action.pose_utils import pose_abs_to_rel + env = simpler_env.make("widowx_carrot_on_plate", renderer_kwargs=dict(device="cuda:0", offscreen_only=True)) + records, checks = [], {} + try: + obs, _ = env.reset(seed=seed) + executor = NativeExecutor(env, obs) + cv = np.eye(4) + cv[:3, :3] = bridge._BRIDGE_TO_OPENCV + for kind, axis in (("translation", 0), ("rotation", 2), ("close", 0), ("open", 0)): + start_pose, start_state = measured(env) + for _ in range(5): + current, _ = measured(env) + target = current.copy() + if kind == "translation": + target[axis, 3] += .003 + elif kind == "rotation": + rotation = np.zeros(3) + rotation[axis] = .015 + target[:3, :3] = Rotation.from_rotvec(rotation).as_matrix() @ current[:3, :3] + native_poses = np.stack([p @ bridge._TCP_TO_FLANGE @ cv for p in (current, target)]) + action = np.r_[pose_abs_to_rel(native_poses, rotation_format="rot6d", pose_convention="backward_framewise")[0], 0. if kind == "close" else 1.] + result, record = executor.step(action) + record["test"] = kind + record["target_max_error"] = float(np.abs(np.asarray(record["controller_target"]) - target).max()) + records.append(record) + if result[2] or result[3]: + raise RuntimeError("Controller acceptance episode ended early") + end_pose, end_state = measured(env) + if kind == "translation": + checks[kind] = float(end_pose[axis, 3] - start_pose[axis, 3]) > .001 + elif kind == "rotation": + checks[kind] = float(Rotation.from_matrix(end_pose[:3, :3] @ start_pose[:3, :3].T).as_rotvec()[axis]) > .005 + elif kind == "close": + closed = float(end_state[7]) + checks[kind] = closed < float(start_state[7]) - .25 + else: + checks[kind] = float(end_state[7]) > closed + .5 + checks["controller_target"] = max(r["target_max_error"] for r in records) <= 1e-5 + checks["reached_history"] = all(np.allclose(np.asarray(r["after"])[:6] - np.asarray(r["before"])[:6], r["reached7"][:6], atol=1e-7) for r in records) + checks["completion_timing"] = all(r["completed_controls"] == ((i + 1) // 4) * 4 and r["pending_controls"] == (i + 1) % 4 for i, r in enumerate(records)) + finally: + env.close() + report = dict(format="bridge_native_controller_v1", passed=all(checks.values()), checks=checks, records=records, + implementation_sha256=file_hash(__file__), contracts=contract_hashes(), + seed=seed, policy_success="NOT_EVALUATED") + atomic_json(path, report) + if not report["passed"]: + raise RuntimeError(f"Native controller acceptance failed: {path}") + return report + + +def require_controller(path): + report = read_json(path) + required = {"translation", "rotation", "close", "open", "controller_target", "reached_history", "completion_timing"} + if (report.get("format") != "bridge_native_controller_v1" or not report.get("passed") + or report.get("implementation_sha256") != file_hash(__file__) + or report.get("contracts") != contract_hashes() + or set(report.get("checks", {})) != required or not all(report["checks"].values()) + or len(report.get("records", [])) != 20): + raise ValueError("Controller report is missing, stale or failed") + return report + + +def contract_hashes(): + root = Path(__file__).resolve().parents[1] + return {name: file_hash(root / name) for name in ("bridge_native_contract.py", "bridge_recovery_contract.py", "widowx_rollout.py")} + + +if __name__ == "__main__": + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--output", type=Path, required=True) + audit_controller(p.parse_args().output) diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/optim.py b/releases/bridge-native-v3/code/scripts/native_stage2/optim.py new file mode 100644 index 0000000000000000000000000000000000000000..0fd71a8cf01956ebb3450c22848abb57e6206288 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/optim.py @@ -0,0 +1,105 @@ +"""FP32 masters, domain-row isolation and measured parameter updates.""" +from __future__ import annotations + +import math +import torch + +from scripts.fp32_master_adamw import FP32MasterAdamW +from scripts.native_stage2.common import local, local_slice, tensor_hash, gather_objects +from scripts.native_stage2.model import parameter_group + + +def other_domain_rows(parameter): + region = local_slice(parameter)[0] + return torch.arange(region.start, region.stop, device=parameter.device) != 7 + + +def frozen_hashes(module): + return {name: tensor_hash(p) for name, p in module.named_parameters() if not p.requires_grad} + + +class NativeAdamW(FP32MasterAdamW): + def __init__(self, net): + self.named = {name: p for name, p in net.named_parameters() if p.requires_grad} + self.names = {p: name for name, p in self.named.items()} + rates = dict(generation=2e-5, action_tables=1e-4, action_embedding=1e-4, bridge=3e-5) + groups = [dict(params=[p for n, p in self.named.items() if parameter_group(n) == group], + name=group, lr=rate, target_lr=rate, weight_decay=0.0 if group == "action_tables" else 0.01) + for group, rate in rates.items()] + if any(not g["params"] for g in groups): + raise ValueError("A required native parameter group is empty") + super().__init__(groups) + self.observed = {name: dict(gradient_max=0.0, update_max=0.0) for name in self.named} + self.domain_baseline = None + + def initialize_state(self): + super().initialize_state() + self.domain_baseline = self.domain_hashes() + + def domain_hashes(self): + return {name: dict(parameter=tensor_hash(local(p)[other_domain_rows(p)]), + master=tensor_hash(local(self.state[p]["master_param"])[other_domain_rows(p)])) + for name, p in self.named.items() if parameter_group(name) == "action_tables"} + + def check_domains(self): + if self.domain_hashes() != self.domain_baseline: + raise AssertionError("A non-domain-7 parameter/master changed") + return dict(other_domains_max_delta=0.0, exact=True, hashes=self.domain_baseline) + + @torch.no_grad() + def step_native(self, update): + for group in self.param_groups: + lr = group["target_lr"] * min(update / 10.0, 1.0) + group["lr"] = lr + beta1, beta2 = group["betas"] + for p in group["params"]: + if p.grad is None: + continue + name = self.names[p] + grad = local(p.grad).float() + if group["name"] == "action_tables": + grad[other_domain_rows(p)] = 0 + if not torch.isfinite(grad).all(): + raise FloatingPointError(f"Nonfinite gradient: {name}") + record = self.observed[name] + if grad.numel(): + record["gradient_max"] = max(record["gradient_max"], float(grad.abs().max())) + state = self.state[p] + state["step"].add_(1) + step = int(state["step"].item()) + master, mean, variance = [local(state[k]) for k in ("master_param", "exp_avg", "exp_avg_sq")] + master.mul_(1 - lr * group["weight_decay"]) + mean.lerp_(grad, 1 - beta1) + variance.mul_(beta2).addcmul_(grad, grad, value=1 - beta2) + denominator = variance.sqrt().div_(math.sqrt(1 - beta2 ** step)).add_(group["eps"]) + master.addcdiv_(mean, denominator, value=-lr / (1 - beta1 ** step)) + actual = master.to(p.dtype) + if actual.numel(): + record["update_max"] = max(record["update_max"], float((actual.float() - local(p).float()).abs().max())) + local(p).copy_(actual) + + def manifest(self): + return [dict(name=name, group=parameter_group(name), shape=list(p.shape), local_shape=list(local(p).shape), + dtype=str(p.dtype), numel=p.numel(), lr=next(g["target_lr"] for g in self.param_groups + if g["name"] == parameter_group(name))) for name, p in self.named.items()] + + def update_report(self): + merged = {} + for part in gather_objects(self.observed): + for name, value in part.items(): + target = merged.setdefault(name, dict(gradient_max=0., update_max=0.)) + for key in target: + target[key] = max(target[key], value[key]) + modules = {} + for name, value in merged.items(): + if name.startswith("language_model."): + bucket = "generation_language" + elif name.startswith("behavior_pbd."): + bucket = ".".join(name.split(".")[:2]) + else: + bucket = name.split(".")[0] + result = modules.setdefault(bucket, dict(gradient_max=0., update_max=0.)) + for key in value: + result[key] = max(result[key], value[key]) + failed = [name for name, value in modules.items() if value["gradient_max"] <= 0 or value["update_max"] <= 0] + return dict(passed=not failed, failed_modules=failed, modules=modules, parameters=merged) diff --git a/releases/bridge-native-v3/code/scripts/native_stage2/train.py b/releases/bridge-native-v3/code/scripts/native_stage2/train.py new file mode 100644 index 0000000000000000000000000000000000000000..8ab2b06f8153e959c9c05247ac3df6e5f6f1606c --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/native_stage2/train.py @@ -0,0 +1,215 @@ +"""50 -> 500 -> continuous training, with failures saved as failures.""" +from __future__ import annotations + +from dataclasses import asdict +import os +from pathlib import Path +import random +import time + +import numpy as np +import torch +import torch.distributed as dist + +from scripts.native_stage2.common import (BASE_REPO, BASE_REVISION, atomic_json, barrier, file_hash, gather_objects, + json_hash, rank, read_json, save_report, tensor_hash, world_size) + + +def code_identity(): + root = Path(__file__).resolve().parents[2] + paths = list((root / "scripts/native_stage2").glob("*.py")) + paths += [root / "scripts" / n for n in ("run_bridge_stage2_native.py", "bridge_native_contract.py", + "bridge_recovery_contract.py", "fp32_master_adamw.py")] + paths += list((root / "cosmos_framework").rglob("*.py")) + return {str(p.relative_to(root)): file_hash(p) for p in sorted(paths)} + + +def immutable_hashes(model, memory): + from scripts.native_stage2.optim import frozen_hashes + vae = model.tokenizer_vision_gen.model.model + return dict(backbone=frozen_hashes(model.net), vae={n: tensor_hash(v) for n, v in vae.state_dict().items()}, + memory=memory.frozen_hashes()) + + +def train(args): + device = int(os.environ["LOCAL_RANK"]) + torch.cuda.set_device(device) + dist.init_process_group("nccl") + if world_size() != args.nproc_per_node: + raise ValueError("Native runner supports one node with the declared GPU count") + args.run_dir.mkdir(parents=True, exist_ok=True) + try: + _train(args) + except BaseException as exc: + # A failed rank writes its own diagnostic without waiting for collectives. + atomic_json(args.run_dir / f"failure_rank_{rank()}.json", + dict(status="FAILED", exception=type(exc).__name__, message=str(exc))) + if rank() == 0: + previous = read_json(args.run_dir / "status.json") if (args.run_dir / "status.json").exists() else {} + atomic_json(args.run_dir / "status.json", dict(previous, status="FAILED", error=str(exc))) + raise + finally: + dist.destroy_process_group() + + +def _train(args): + from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline + from scripts.bridge_native_contract import DIMENSIONS + from scripts.native_stage2.base import action_audit, audit_source, load_original, verify_base_files + from scripts.native_stage2.checkpoint import save_checkpoint, restore_checkpoint, verify_roundtrip + from scripts.native_stage2.data import Episodes, WindowStream, packed_sample, partitions + from scripts.native_stage2.evaluate import gate500, probe_windows, probes, same_probe_inputs + from scripts.native_stage2.memory import CausalMemory, QueryHead + from scripts.native_stage2.model import NativeWAM, native_config + from scripts.native_stage2.online import audit_controller, require_controller + from scripts.native_stage2.optim import NativeAdamW + + run = args.run_dir + status = dict(status="PREPARING", training="NOT_RUN", gate_50="NOT_RUN", gate_500="NOT_RUN", continuous="NOT_RUN") + save_report(run, "status.json", status) + if rank() == 0: + from scripts.bridge_handoff import verify + from scripts.run_bridge_stage2_native import check_dependencies + verify(args.bundle, dataset=args.dataset, vae=args.vae) + check_dependencies(args) + verify_base_files(args.base_path, run / "base_audit", args.offline) + atomic_json(run / "base_audit/action_source.json", audit_source(args.base_path)) + controller_path = args.controller_report or run / "controller_acceptance.json" + if not controller_path.exists(): + audit_controller(controller_path, args.seed) + require_controller(controller_path) + barrier() + identity = dict(base=dict(repo=BASE_REPO, revision=BASE_REVISION), dimensions=asdict(DIMENSIONS), + handoff=file_hash(args.bundle / "handoff_manifest.json"), + base_files=read_json(run / "base_audit/base_identity.json")["files"], code=code_identity(), seed=args.seed, + microbatch_per_gpu=1, accumulation=8, world_size=world_size()) + if not args.resume and any((run / "checkpoints").glob("step_*")): + raise ValueError("Run already has checkpoints: explicitly --resume one or choose a new --run-dir") + save_report(run, "dimension_ledger.json", dict(version=1, **asdict(DIMENSIONS), model_action_dim=64, + policy_space="native10 quantile normalized; gripper index 9", cte_space="reached XYZ/RPY + executed gripper; legacy clipped; index 6", + proprio_space="absolute transformed pose + measured gripper; unnormalized", internal_valid_channels=list(range(10)))) + torch.manual_seed(args.seed) + random.seed(args.seed) + np.random.seed(args.seed) + config = native_config(args.base_path, args.vae, world_size()) + model = NativeWAM(config) + source = load_original(model.net, args.base_path) + save_report(run, "base_audit/load_manifest.json", source) + save_report(run, "base_audit/after_load.json", gather_objects(action_audit(model.net, args.base_path))) + optimizer = NativeAdamW(model.net) + optimizer.initialize_state() + save_report(run, "base_audit/after_optimizer.json", gather_objects(action_audit(model.net, args.base_path))) + save_report(run, "trainable_manifest.json", gather_objects(optimizer.manifest())) + episodes = Episodes(args.dataset) + split = partitions(args.bundle, episodes) + transform = ActionTransformPipeline(max_action_dim=64, tokenizer_config=config.vlm_config.tokenizer, + append_viewpoint_info=False, append_duration_fps_timestamps=False, + append_resolution_info=False) + memory = CausalMemory(model, args.base_path, args.bundle, args.feature_cache_episodes) + progress = dict(phase="pilot", phase_origin=0, bit_histogram=[0] * 5, samples=0, empty_instruction=0, + gate_50="NOT_RUN", gate_500="NOT_RUN") + step, cursor = 0, 0 + if args.resume: + memory.head = QueryHead().to(memory.device).eval().requires_grad_(False) + step, cursor, progress = restore_checkpoint(args.resume, optimizer, memory, identity) + if progress.get("gate_50") == "FAILED" or progress.get("gate_500") == "FAILED": + raise ValueError("A failed gate checkpoint is diagnostic only; do not continue it") + for completed in (50, 500): + if step >= completed and not read_json(run / f"gate_{completed}.json")["passed"]: + raise ValueError(f"Cannot resume past a failed {completed}-step gate") + if step >= 500 and args.continuous and progress["phase"] == "pilot": + progress.update(phase="continuous", phase_origin=500 * 8) + else: + memory.train_retrieval(episodes, run, args.seed) + immutable = immutable_hashes(model, memory) + save_report(run, "frozen_hashes.json", gather_objects(immutable)) + windows = probe_windows(episodes, split) + baseline_path = run / "probe_step_000000000.json" + if step == 0: + baseline = probes(model, memory, episodes, transform, windows, args.seed, 0) + save_report(run, baseline_path.name, baseline) + save_report(run, "base_audit/before_first_update.json", gather_objects(action_audit(model.net, args.base_path))) + else: + baseline = read_json(baseline_path) + # Full fixed probes perform real forward/loss/solver execution before the + # first update, so no training can start behind an unexecuted shape trace. + save_report(run, "runtime_shape_trace.json", dict(model=model.runtime_shapes if step == 0 else "restored", + policy_dtype="float32 -> bfloat16", generation_dtype="bfloat16", cte_dtype="bfloat16 autocast", + action_mask=[1, 32], vision_mask=[1, 9], cte_group=[1, "completed_transitions", 4, 7], + proprio=[1, 10], global_feature=[1, 256], phase=[1, 128], effect=[1, 4, 128], + controller_report=str(args.controller_report or run / "controller_acceptance.json"))) + limit = args.max_steps if args.continuous else min(args.max_steps, 500) + stream = WindowStream(episodes.episodes, split["continuous" if progress["phase"] == "continuous" else "train"], + args.seed, world_size(), pilot=progress["phase"] == "pilot") + if step == 0: + torch.manual_seed(args.seed + rank()) + model.net.train() + while step < limit: + optimizer.zero_grad(set_to_none=True) + sums = dict(vision=0., action=0., pbd=0.) + started = time.monotonic() + for _ in range(8): + eid, start = stream.sample(cursor - progress["phase_origin"], rank()) + sample = memory.attach(episodes.window(eid, start)) + batch = packed_sample(sample, transform) + output, loss = model.training_step(batch, step) + if not torch.isfinite(loss): + raise FloatingPointError("Nonfinite native joint loss") + (loss / 8).backward() + cursor += 1 # consumed only after backward, never a prefetch position + progress["samples"] += 1 + progress["bit_histogram"][int(sample["behavior_effect_valid"].sum())] += 1 + progress["empty_instruction"] += int(not sample["ai_caption"].strip()) + for key, field in (("vision", "flow_matching_loss_vision"), ("action", "flow_matching_loss_action"), ("pbd", "behavior_prior_nll")): + sums[key] += float(output[field].detach()) / 8 + del output, loss + optimizer.step_native(step + 1) + optimizer.zero_grad(set_to_none=True) + step += 1 + status.update(status="TRAINING", training="RUNNING", step=step, consumed_microbatches=cursor, + phase=progress["phase"], seconds_per_update=time.monotonic() - started, loss=sums, + global_batch=8 * world_size(), **{k: progress[k] for k in ("gate_50", "gate_500")}) + save_report(run, "status.json", status) + if rank() == 0: + with (run / "metrics.jsonl").open("a") as f: + import json + f.write(json.dumps(status) + "\n") + print(f"Native step={step} vision={sums['vision']:.6g} action={sums['action']:.6g} pbd={sums['pbd']:.6g}", flush=True) + if step % 50 == 0: + domains = gather_objects(optimizer.check_domains()) + if immutable_hashes(model, memory) != immutable: + raise AssertionError("A frozen backbone/VAE/CTE/retrieval tensor changed") + save_report(run, f"audits/step_{step:09d}.json", dict(domains=domains, frozen_exact=True)) + if step in (50, 500): + updates = optimizer.update_report() + histogram = np.array(gather_objects(progress["bit_histogram"])).sum(0) + fraction = 1 - histogram[0] / histogram.sum() + engineering = bool(updates["passed"] and fraction >= .5) + probe = probes(model, memory, episodes, transform, windows, args.seed, step) + save_report(run, f"probe_step_{step:09d}.json", probe) + fixed_inputs = same_probe_inputs(baseline, probe) + gate = dict(passed=engineering and fixed_inputs, checks=dict(updates=updates["passed"], bit_fraction=fraction >= .5, + fixed_probes=fixed_inputs)) if step == 50 else gate500(baseline, probe, engineering) + gate.update(updates=updates, bit_fraction=float(fraction), bit_histogram=histogram.tolist()) + progress[f"gate_{step}"] = "PASSED" if gate["passed"] else "FAILED" + checkpoint = save_checkpoint(run, step, optimizer, memory, cursor, identity, progress) + gate["roundtrip"] = gather_objects(verify_roundtrip(checkpoint, optimizer, identity)) + # Restore parameters, masters, moments, RNG and cursor from disk, + # then rerun the identical solver probes. This also tests 50->500. + step, cursor, progress = restore_checkpoint(checkpoint, optimizer, memory, identity) + reloaded = probes(model, memory, episodes, transform, windows, args.seed, step) + gate["fixed_solver_reload_exact"] = probe == reloaded + gate["passed"] = bool(gate["passed"] and gate["fixed_solver_reload_exact"]) + save_report(run, f"gate_{step}.json", gate) + if not gate["passed"]: + raise RuntimeError(f"Native {step}-step gate failed; diagnostics saved in {run}") + if step == 500 and args.continuous: + progress.update(phase="continuous", phase_origin=cursor) + stream = WindowStream(episodes.episodes, split["continuous"], args.seed, world_size(), pilot=False) + status["continuous"] = "RUNNING" + elif step % 10000 == 0 or step == limit: + save_checkpoint(run, step, optimizer, memory, cursor, identity, progress) + status.update(status="STOPPED_AT_LIMIT", training="STOPPED", step=step, + continuous="STOPPED_AT_LIMIT" if progress["phase"] == "continuous" else "NOT_RUN", + gate_50=progress["gate_50"], gate_500=progress["gate_500"]) + save_report(run, "status.json", status) diff --git a/releases/bridge-native-v3/code/scripts/prepare_bridge_stage2_pilot.py b/releases/bridge-native-v3/code/scripts/prepare_bridge_stage2_pilot.py new file mode 100644 index 0000000000000000000000000000000000000000..c4add5218d142ca526927b6e63cfbbd01c825435 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/prepare_bridge_stage2_pilot.py @@ -0,0 +1,192 @@ +"""Build a small, disjoint support/query Bridge CTE bundle, without policy weights.""" +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import numpy as np +import torch + +from scripts.bridge_cte_data import BridgeCTEDataset, canonical_instruction, load_metadata +from scripts.bridge_recovery_contract import cte_identity, sha256_file, sha256_json +from scripts.train_bridge_cte import FrozenFrameEncoder +from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig + + +def write_json(path, payload): + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix('.tmp') + temporary.write_text(json.dumps(payload, indent=2, ensure_ascii=False) + '\n') + temporary.replace(path) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output', type=Path, default=Path('.artifacts/bridge_stage2_pilot_v2')) + parser.add_argument('--checkpoint', type=Path, default=Path('.artifacts/bridge_cte_stage1_20260924/checkpoints/cte_step_000030000.pt')) + parser.add_argument('--refresh-provider-identity', action='store_true', help='Correct provider metadata on the existing small bundle without re-encoding') + args = parser.parse_args() + if args.refresh_provider_identity: + manifest = json.loads((args.output / 'manifest.json').read_text()) + if list((args.output / 'train/checkpoints').glob('step_*.pt')): + raise ValueError('Cannot change a feature contract after training has saved checkpoints') + contract = manifest['contract'] + contract['identity']['static_retrieval_preprocess_id'] = 'support_cte_singleframe256_task_prototype_train_only_v1' + contract['retrieval_head'] = None + fingerprint = sha256_json(contract) + for relative in manifest['feature_file_sha256']: + path = args.output / relative + payload = torch.load(path, weights_only=True) + payload['fingerprint'] = fingerprint + temporary = path.with_suffix('.tmp') + torch.save(payload, temporary) + temporary.replace(path) + manifest['feature_file_sha256'][relative] = sha256_file(path) + manifest['fingerprint'] = fingerprint + write_json(args.output / 'manifest.json', manifest) + print('UPDATED_PROVIDER_IDENTITY_WITHOUT_ENCODING', fingerprint, flush=True) + return + if (args.output / 'manifest.json').exists(): + raise FileExistsError('Completed bundles are immutable; choose a new output directory') + torch.set_num_threads(2) + torch.cuda.set_device(0) + torch.cuda.set_per_process_memory_fraction(.18) + checkpoint = torch.load(args.checkpoint, map_location='cpu', weights_only=False) + run = args.checkpoint.parent.parent + split = json.loads((run / 'split.json').read_text()) + identity = cte_identity(checkpoint, args.checkpoint, run / 'split.json') + identity['static_retrieval_preprocess_id'] = 'support_cte_singleframe256_task_prototype_train_only_v1' + root = Path(identity['dataset']) + info, train, _ = load_metadata(root, checkpoint['contract']['seed'], checkpoint['contract']['val_fraction']) + if [e['episode_index'] for e in train] != split['train']: + raise ValueError('Original Stage1 train split has changed') + tasks = ['put carrot on plate', 'take carrot off plate'] + rng = np.random.default_rng(20260924) + partitions = dict(support=[], train=[], development=[]) + for task in tasks: + eligible = [e for e in train if len(e['tasks']) == 1 + and canonical_instruction(e['tasks'][0]) == task and e['length'] >= 33] + if len(eligible) < 24: + raise ValueError(f'Not enough independent long episodes for {task}') + order = rng.permutation(len(eligible))[:24] + for part, indices in (('support', order[:4]), ('train', order[4:20]), ('development', order[20:24])): + partitions[part].extend(eligible[int(i)] for i in indices) + ids = {k: [e['episode_index'] for e in v] for k, v in partitions.items()} + if len(set(sum(ids.values(), []))) != sum(map(len, ids.values())): + raise AssertionError('Support/query/development overlap') + model = CausalTransitionEncoder(CausalTransitionEncoderConfig(**checkpoint['model_config'])).to('cuda:0').eval() + model.load_state_dict(checkpoint['model'], strict=True) + model.requires_grad_(False) + encoder = FrozenFrameEncoder(checkpoint['contract']['vae_path'], torch.device('cuda:0'), microbatch=4) + args.output.mkdir(parents=True, exist_ok=True) + all_outputs = {} + prefix_max = dict(phase=0., effect_post=0., retrieval=0.) + for part, episodes in partitions.items(): + dataset = BridgeCTEDataset(root, info, episodes) + for item_index, ep in enumerate(episodes): + item = dataset[item_index] + with torch.no_grad(): + latents = encoder(dict(frames=item['frames'], valid=torch.ones(1, len(item['frames']), dtype=torch.bool))) + actions = item['actions'].to('cuda:0').unsqueeze(0) + valid = torch.ones(latents.shape[:2], device='cuda:0', dtype=torch.bool) + with torch.autocast('cuda', dtype=torch.bfloat16): + output = model(latents, actions, valid) + # Real prefixes verify that cached phase/state do not see a + # query's future; effect becomes available at its raw end. + for count in sorted(set((1, min(5, len(item['frames'])), max(1, len(item['frames'])-1)))): + with torch.autocast('cuda', dtype=torch.bfloat16): + prefix = model(latents[:, :count], actions[:, :count-1], valid[:, :count]) + for key in prefix_max: + value = prefix[key] + if value.numel(): + error = float((value.float()-output[key][:, :value.shape[1]].float()).abs().max()) + prefix_max[key] = max(prefix_max[key], error) + if error > .005: + raise AssertionError(f'Causal prefix mismatch {key}: {error}') + all_outputs[ep['episode_index']] = {key: value[0].detach().float().cpu() if value.is_floating_point() + else value[0].detach().cpu() for key, value in output.items()} + print(f'CTE_FEATURES partition={part} episode={ep["episode_index"]} boundaries={len(item["frames"])}', flush=True) + prototypes, support_entries = {}, [] + for task in tasks: + members = [e for e in partitions['support'] if canonical_instruction(e['tasks'][0]) == task] + values = [] + for ep in members: + output = all_outputs[ep['episode_index']] + value = output['causal_interaction_state'].mean(0) + values.append(value) + support_entries.append(dict(episode_id=ep['episode_index'], task=task, + key=output['retrieval'].mean(0), value=value)) + prototypes[task] = torch.stack(values).mean(0) + bank = dict(version='bridge_support_bank_v1', global_mode='support_task_prototype_train_only', + cte_checkpoint_sha256=identity['cte_checkpoint_sha256'], + support_episode_ids=ids['support'], entries=support_entries, prototypes=prototypes, + query_selection='exact canonical instruction only; no query image, state or future is used') + bank_path = args.output / 'static_bank.pt' + torch.save(bank, bank_path) + contract = dict(version='bridge_stage2_pilot_bundle_v1', identity=identity, + global_mode=bank['global_mode'], bank_sha256=sha256_file(bank_path), + retrieval_head=None, + episode_ids=ids, task_names=tasks, seed=20260924, + development_independence='Held out from Stage2 updates and support bank; seen by Stage1 CTE', + anchor_policy='one reset anchor plus every four-control boundary >=16 with >=8 remaining labels', + source_sha256={name: sha256_file(Path(__file__).parent / name) for name in + ('prepare_bridge_stage2_pilot.py', 'bridge_stage2_data.py', 'bridge_recovery_contract.py')}) + fingerprint = sha256_json(contract) + files, stats = {}, {} + for part in ('train', 'development'): + directory = args.output / 'features' / part + directory.mkdir(parents=True, exist_ok=True) + nonempty, windows, switching = 0, 0, 0 + for ep in partitions[part]: + eid = ep['episode_index'] + output = all_outputs[eid] + starts = torch.arange(len(output['phase'])) * 4 + effects = output['effect_post'][output['effect_complete']] + availability = torch.arange(1, len(effects)+1) * 16 + history = torch.zeros(len(starts), 4, 128) + masks = torch.zeros(len(starts), 4, dtype=torch.bool) + ends = torch.full((len(starts), 4), -1, dtype=torch.int64) + for j, start in enumerate(starts): + available = int((availability <= start).sum()) + take = min(4, available) + if take: + history[j, -take:] = effects[available-take:available] + masks[j, -take:] = True + ends[j, -take:] = availability[available-take:available] + if bool((ends[masks] > starts[:, None].expand_as(ends)[masks]).any()): + raise AssertionError('Future effect entered cache') + task = canonical_instruction(ep['tasks'][0]) + payload = dict(fingerprint=fingerprint, episode_index=eid, starts=starts, + behavior_global=prototypes[task].expand(len(starts), -1).clone(), + behavior_phase=output['phase'], behavior_effect=history, behavior_effect_valid=masks, + state=output['causal_interaction_state'], retrieval=output['retrieval'], + effect_end_indices=ends, global_source_episode_ids=[e['episode_index'] for e in partitions['support'] + if canonical_instruction(e['tasks'][0]) == task]) + if eid in payload['global_source_episode_ids']: + raise AssertionError('Self episode in global context') + path = directory / f'episode_{eid:06d}.pt' + torch.save(payload, path) + files[str(path.relative_to(args.output))] = sha256_file(path) + anchors = [0] + [int(s) for s in starts if s >= 16 and s <= ep['length']-8] + windows += len(anchors) + nonempty += sum(bool(masks[s//4].any()) for s in anchors) + stats[part] = dict(episodes=len(partitions[part]), windows=windows, + bit_nonempty_windows=nonempty, bit_nonempty_fraction=nonempty/windows) + if nonempty/windows < .70: + raise ValueError(f'Insufficient completed BIT windows: {stats[part]}') + diagnostics = json.loads(Path('.artifacts/bridge_zeva_recovery_v2/cte_fixed_diagnostics.json').read_text()) + selection = dict(selected_step=checkpoint['step'], selected_checkpoint=str(args.checkpoint.resolve()), + checkpoint_sha256=identity['cte_checkpoint_sha256'], + rationale='30k improves effect-pre R@1 and gripper-switch error over 20k; motion donor gap is maintained, task retrieval remains strong, no collapse. Differences are exploratory, not significance-certified.', + candidates={k: v for k, v in diagnostics['candidates'].items() if v.get('step') in (20000, 30000, 31495)}, + stage1_frozen=True, extra_cte_updates=0) + write_json(args.output / 'cte_selection.json', selection) + write_json(args.output / 'manifest.json', dict(contract=contract, fingerprint=fingerprint, + feature_file_sha256=files, stats=stats, prefix_max_abs=prefix_max)) + print(f'BUNDLE_COMPLETE {args.output} {stats}', flush=True) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/prepare_widowx_features.py b/releases/bridge-native-v3/code/scripts/prepare_widowx_features.py new file mode 100644 index 0000000000000000000000000000000000000000..74a2c64dcd0c81c1b33ab204291afcf587a17bc2 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/prepare_widowx_features.py @@ -0,0 +1,119 @@ +"""Cache frozen release CTE/retrieval features using only each window's past.""" +import os +import argparse +from pathlib import Path +import numpy as np +import torch +from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import WidowXBridgeV3Dataset, normalize_actions +from cosmos_framework.scripts.action_policy_server_robocasa365_zeva import RobolabServerArgs, RobolabPolicyService +from scripts.widowx_contract import ensure_manifest + +@torch.inference_mode() +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--start-episode", + type=int, + default=None, + help="inclusive episode index to process (default: first episode)", + ) + parser.add_argument( + "--end-episode", + type=int, + default=None, + help="exclusive episode index to process (default: after last episode)", + ) + parser.add_argument('--shard-index', type=int, default=0) + parser.add_argument('--num-shards', type=int, default=1) + parser.add_argument('--validate-only', action='store_true') + args = parser.parse_args() + if not 0 <= args.shard_index < args.num_shards: + parser.error('require 0 <= shard-index < num-shards') + release = Path('/home/gpu4/tianyi/zeva-release/weights') + out = Path(os.environ['WIDOWX_FEATURE_CACHE']); out.mkdir(parents=True, exist_ok=True) + cache_fingerprint = ensure_manifest(os.environ['WIDOWX_DATASET'], out) + ds = WidowXBridgeV3Dataset(os.environ['WIDOWX_DATASET'], window_mode='full') + lengths = {e['episode_index']: int(e['length']) for e in ds.episodes} + episodes = sorted(lengths)[args.shard_index::args.num_shards] + if args.start_episode is not None: + episodes = [e for e in episodes if e >= args.start_episode] + if args.end_episode is not None: + episodes = [e for e in episodes if e < args.end_episode] + if not episodes: + raise SystemExit('no episodes selected') + pending = [] + for ep in episodes: + path = out / f'episode_{ep:06d}.pt' + if not path.exists(): + pending.append(ep) + continue + payload = torch.load(path, weights_only=True, map_location='cpu') + starts = list(range(0, lengths[ep], 4)) + if payload.get('fingerprint') != cache_fingerprint or payload.get('episode_index') != ep: + raise ValueError(f'Cache provenance mismatch: {path}') + if payload['starts'].tolist() != starts: + raise ValueError(f'Incomplete episode cache: {path}') + for key, tail in [('behavior_global',(256,)), ('behavior_phase',(128,)), + ('behavior_effect',(4,128)), ('behavior_effect_valid',(4,))]: + if tuple(payload[key].shape) != (len(starts), *tail) or not torch.isfinite(payload[key]).all(): + raise ValueError(f'Invalid feature tensor {key}: {path}') + if args.validate_only: + if pending: + raise SystemExit(f'Feature cache incomplete: {len(pending)} missing episodes') + print(f'FEATURE_CACHE_VALID episodes={len(episodes)} fingerprint={cache_fingerprint}', flush=True) + return + episodes = pending + if not episodes: + print('FEATURE_CACHE_ALREADY_COMPLETE', flush=True) + return + service = RobolabPolicyService(RobolabServerArgs( + checkpoint_path=os.environ.get('BASE_CHECKPOINT_PATH', str(release/'stage2')), allow_dcp_checkpoint=True, + output_dir=out.parent/'feature_runtime'/f'shard_{args.shard_index}', + experiment='action_policy_robocasa365_atomic5_zeva', + experiment_overrides=[ + 'model.config.tokenizer.vae_path=' + os.environ['WAN_VAE_PATH'], + 'model.config.vlm_config.tokenizer.pretrained_model_name=' + os.environ['QWEN_VLM_PATH']], + task_context_bank=release/'stage1/train_memory_effect_v3.pt', + cte_checkpoint=release/'stage1/zeva_cte.pt', + static_task_context_checkpoint=release/'stage3/best.pt', + domain_name='bridge_orig_lerobot', image_height=256, image_width=256, + conditioning_fps=5, action_dim=7, use_state=False)) + for count, ep in enumerate(episodes): + path = out / f'episode_{ep:06d}.pt' + ds._load(ep) + rgb, rows = ds._frames[ep], ds._rows[ep] + starts = boundary = list(range(0, len(rgb), 4)) + latents = torch.stack([service._encode_cte_frame(rgb[i]) for i in boundary]).unsqueeze(0) + raw = normalize_actions(rows['action']) + transitions = torch.from_numpy(raw[:boundary[-1]].reshape(-1,4,7)).to(latents.device).unsqueeze(0) + valid = torch.ones(latents.shape[:2], dtype=torch.bool, device=latents.device) + # The released CTE is causal; run once per prefix to also enforce causality + # if a future implementation changes its internal attention masking. + features = {k: [] for k in ('behavior_global','behavior_phase','behavior_effect','behavior_effect_valid')} + instruction = ds.tasks[int(rows['task_index'][0])] + global_value = service._task_context_from_initial_observation(rgb[0], instruction)[0].float().cpu() + for j in range(len(boundary)): + a = transitions[:, :j] + with torch.autocast('cuda', dtype=torch.bfloat16): + enc = service._cte(latents[:, :j+1], a, valid[:, :j+1], torch.ones(a.shape[:-1], dtype=torch.bool, device=a.device)) + completed = enc['effect_post'][0][enc['effect_complete'][0]].float().cpu() + history = torch.zeros(4, service._cte.cfg.effect_dim) + mask = torch.zeros(4, dtype=torch.bool) + take = min(4, len(completed)) + if take: history[-take:] = completed[-take:]; mask[-take:] = True + for k,v in zip(features, (global_value,enc['phase'][0,-1].float().cpu(),history,mask)): + features[k].append(v) + payload = {k: torch.stack(v) for k,v in features.items()} + payload['episode_index'] = ep + payload['instruction'] = instruction + payload['fingerprint'] = cache_fingerprint + payload['starts'] = torch.tensor(starts, dtype=torch.int64) + temp = path.with_suffix(f'.{os.getpid()}.tmp'); torch.save(payload,temp); temp.replace(path) + print(f'prepared {count+1}/{len(episodes)} episode={ep} windows={len(starts)}',flush=True) + +if __name__ == '__main__': + try: + main() + finally: + if torch.distributed.is_initialized(): + torch.distributed.destroy_process_group() diff --git a/releases/bridge-native-v3/code/scripts/report_bridge_stage2_pilot.py b/releases/bridge-native-v3/code/scripts/report_bridge_stage2_pilot.py new file mode 100644 index 0000000000000000000000000000000000000000..411f21a60f4111673f78a24cd1650c262b668996 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/report_bridge_stage2_pilot.py @@ -0,0 +1,121 @@ +"""Summarize only materialized pilot evidence; never invent training results.""" +from datetime import datetime +import hashlib +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +BUNDLE = ROOT / '.artifacts/bridge_stage2_pilot_v2' + + +def load(path): + return json.loads(path.read_text()) if path.exists() else None + + +def write_report(): + run = BUNDLE / 'train' + manifest = load(BUNDLE / 'manifest.json') + selection = load(BUNDLE / 'cte_selection.json') + regression = load(BUNDLE / 'regression_report.json') + golden = load(BUNDLE / 'golden_cte30k_single_gpu0.json') + sources = sorted(set((ROOT / 'scripts').glob('*bridge_stage2*.py')) | { + ROOT / 'scripts/widowx_contract.py', ROOT / 'scripts/bridge_stage2_pilot.toml', + ROOT / 'scripts/fp32_master_adamw.py', ROOT / 'scripts/widowx_checkpoint.py', + ROOT / 'scripts/widowx_data_resume.py', ROOT / 'scripts/widowx_masked_loss.py', + ROOT / 'scripts/check_bridge_cte_golden_v2.py', + ROOT / 'scripts/test_widowx_full.py'}) + (BUNDLE / 'current_source_provenance.json').write_text(json.dumps(dict( + captured_at=datetime.now().astimezone().isoformat(), + feature_fingerprint=manifest['fingerprint'], + sha256={str(path.relative_to(ROOT)): hashlib.sha256(path.read_bytes()).hexdigest() for path in sources}), indent=2)+'\n') + lines = ['# Bridge Stage2 有界 pilot 报告', '', + f'生成时间:{datetime.now().astimezone().isoformat()}。分支:`recovery/bridge-reached-cte-v2`。', '', + '实时作业状态以 `train/run_status.json` 的时间、PID 及进程是否存活为准;旧的 `resource_wait.json` / `follow_status.json` 已被替代。', '', + '## CTE 选优', '', + '选择并冻结 30k;本轮没有增加 CTE 训练。固定原 validation 的 128 episodes、200 effects、同一候选池:', '', + '| step | total | effect-pre R@1 | motion donor gap | task R@1 | effective rank | phase loss | switch MAE |', + '|---:|---:|---:|---:|---:|---:|---:|---:|'] + for candidate in sorted(selection['candidates'].values(), key=lambda x:x['step']): + pre = candidate['effect_pre_retrieval']['recall_at_1'] + donor = candidate['perturbations']['motion']['recall_at_1'] + lines.append(f"| {candidate['step']} | {candidate['total_fixed_pool']:.4f} | {pre:.1%} | {pre-donor:.1%} | " + f"{candidate['task_retrieval']['recall_at_1']:.1%} | {candidate['effect_post_geometry']['effective_rank']:.1f} | " + f"{candidate['components']['phase']:.6f} | {candidate['gripper_action_error']['switch_gripper_mae']['mean']:.3f} |") + lines += ['', '30k 的 effect-pre 检索及夹爪切换误差优于 20k,运动 donor gap 保持约 25 个百分点;task 检索略低。31,495 仅作参考。差异未经统计显著性认证,不声称普遍最优。', '', + '未见全维坍缩,但 effect 向量非自身余弦仍约 0.975,存在强共同方向;夹爪 donor 影响弱、切换误差明显高于稳态,phase loss 低也不等于语义阶段已标定。足以做受限工程/拟合 pilot,不足以宣称在线控制有效。', '', + '## 新 bank 与 causal cache', '', + '- 固定 IPEC reached-state delta 7D、256×256 单帧 BF16 Wan VAE、legacy normalizer;没有更换 Stage1 split。', + '- 两个固定任务:put carrot on plate / take carrot off plate;8 support(每任务 4)、32 train query、8 development query,episode ID 三方无交集,均来自原 Stage1 train。development 只对 Stage2 留出,不是独立 Stage1 test。', + '- support episode 的 causal interaction state 先逐 episode 平均,再在任务内等权平均;按已知指令取 prototype。模式明确为 `support_task_prototype_train_only`,不用旧 RoboCasa retrieval head。query 的自身未来不进入 global context。', + '- query 每四个 raw control 边界保存 phase/effect/effect_valid;effect 仅在完整 16 个 control 后可用,保存最近四个已完成 effect。真实 prefix 检查最大误差低于 0.005(BF16 数值批量差)。', + '- anchor:每 episode 一个 reset 窗口,加所有 start≥16 且至少余 8 个真实 action label 的四步边界。32 train episodes 共 160 窗口,128 个有 BIT(80%);padding 不计 action/vision loss。', + '- 仅有这 48 个 episodes 的小 bundle;没有全量 VAE / feature 缓存。policy 预处理未改变。', '', + f"CTE SHA256:`{selection['checkpoint_sha256']}`。", '', + f"Bundle fingerprint:`{manifest['fingerprint']}`;bank SHA256:`{manifest['contract']['bank_sha256']}`。", '', + 'feature manifest 保留生成时源码身份;随后仅修正 provider 元数据、重写相应 fingerprint,没有重新编码。新增训练合同另记录当前训练源码 hash、base 文件身份、warm-start hash、probe manifest、split 和 episode IDs。', '', + '## Stage2 配置与验收', '', + '- release base → old ipec_full 290k 的 replacement tensors 覆盖,不是相加,不恢复旧优化器/数据游标。保留 action/proprio;重新初始化并训练 behavior PBD、adapter 和 global projector。', + '- 默认只训练 action2llm、llm2action、action modality embedding、proprio projector、behavior adapter/global projector/PBD(预期原 44 tensors、19,477,568 scalars,以实际 `parameters_at_*.json` 为准)。Qwen/Cosmos 大 backbone 冻结,CTE 仅提供已冻结缓存。训练 forward 不包 no_grad;固定诊断 probe 才使用 no_grad。', + '- 2 张空闲 GPU,batch 1/rank、accumulation 1,即 effective batch 2。behavior/proprio LR 1e-5,action LR multiplier 5;BF16 + FP32-master AdamW、常数 scheduler。prior dropout=0;W&B 离线。', + '- 先 50 optimizer steps,通过后最多到总计 500(不是额外 500)。只保存本轮 50/500 checkpoint,不删除任何旧 checkpoint。', + '- 检查所有可训练组及 phase/effect/global 接收模块梯度、参数更新、冻结参数采样 hash、实际 BIT 比例≥70%、逐维 x0 误差、gripper switching、checkpoint 精确 tensor 重载;50→500 时重建 base+delta 并重复完整固定 probe。冻结检查为每 tensor 的确定性采样,不冒充全参数逐位 hash。', + '- 额外 8 个固定 BIT probe 覆盖两任务及训练/开发分区,每个含夹爪切换;它们是固定噪声 teacher-forced denoising 指标,不是完整 diffusion solver / SimplerEnv 成功率。', + '- 启动前必须两卡显存≤256MiB、util≤5%、无其他 compute PID;模型载入前再检查一次。CPU 等待最多 120 分钟,后续 500 的资源等待最多 60 分钟,各段训练最多 100 分钟。低于 8GiB 空间不启动。', '', + '## 50 / 500 步实测', ''] + if golden is not None: + cached = golden['cached_query_check'] + position = lines.index('## Stage2 配置与验收') + lines[position:position] = [ + '## 单卡真实 Bridge 检查', '', + f"GPU 0 上以 30k CTE、真实 Bridge 帧及 query episode {cached['episode_id']} 检查。", + f"单帧离线/在线 Wan latent 逐元素相同;四帧批处理与在线单帧的 latent 最大绝对差 {golden['latent_max_abs']:.6f}。", + f"缓存重算 phase 最大差 {cached['phase_max_abs']:.6f}、已完成 effect 最大差 {cached['effect_post_max_abs']:.6f},{cached['completed_effects']} 个完整 effect,检查通过。", + '该检查验证视觉与新缓存的一致性;没有加载完整 Stage2 policy,也没有测 SimplerEnv 成功率。', ''] + results = {} + for step in (50, 500): + engineering = load(run / f'engineering_{step}.json') + result = dict(engineering=engineering, fixed_probes={}) + if engineering is None: + lines += [f'{step} steps:尚无完成证据;不填写 loss、更新量或成功率。', ''] + else: + lines += [f"{step} steps:engineering passed={engineering['passed']},实际 BIT 非空比例 {engineering['bit_nonempty_fraction']:.1%}。", '', + '| 分区 | fixed action loss | x0 MAE:x/y/z/r/p/yaw/gripper | switch MAE / sign accuracy |', + '|---|---:|---|---|'] + for partition in ('train', 'development'): + probes = [load(p) for p in sorted(run.glob(f'probe_{partition}_task*_end_{step}_rank*.json'))] + if len(probes) != 4: + lines.append(f'| {partition} | 未完成 | 未完成 | 未完成 |') + continue + action = sum(p['action_loss'] for p in probes)/len(probes) + axis = [sum(p['x0_mae'][i] for p in probes)/len(probes) for i in range(7)] + count = sum(p['gripper_switch_count'] for p in probes) + switch = sum(p['gripper_switch_abs_sum'] for p in probes)/max(count, 1) + correct = sum(p['gripper_switch_correct'] for p in probes)/max(count, 1) + result['fixed_probes'][partition] = dict(action_loss=action, x0_mae=axis, + switch_mae=switch, switch_sign_accuracy=correct, switch_count=count) + lines.append(f"| {partition} | {action:.5f} | {' / '.join(f'{v:.4f}' for v in axis)} | {switch:.4f} / {correct:.1%} |") + lines.append('') + results[str(step)] = result + lines += ['## 当前结论与下一步', '', + f"- 工程:{regression['total_unique_tests_passed']} 项 CPU/伪环境回归通过;CTE/cache 因果验证通过。完整大模型 GPU 梯度和拟合是否通过,仅以以上已完成的 engineering 结果为准。", + '- 离线表示:支持选择 30k 做有界适配,不支持继续无上限 CTE 补训。', + '- 在线契约:Bridge 与仿真的 measured pose 坐标/工具偏移仍未完整标定,本轮没有真实闭环成功率。', + '- 扩大训练:目前不自动放行。即使 500 拟合通过,也应先完成在线契约与匹配的 memory/no-memory 对照,再讨论规模扩大。', '', + '已排队的命令(有存活 launcher 时不要重复启动):', '', + '```bash', + '/home/gpu4/tianyi/cosmos-framework/.venv/bin/python -u scripts/run_bridge_stage2_pilot.py \\', + ' --steps 50 --gpus auto --wait-minutes 120 --then-500 --background', + '```', '', + '只有已有 50-step checkpoint、工程/固定探针门槛通过,且没有活动 launcher 时,下一条允许的有界续跑命令是:', '', + '```bash', + '/home/gpu4/tianyi/cosmos-framework/.venv/bin/python -u scripts/run_bridge_stage2_pilot.py \\', + ' --steps 500 --gpus auto --wait-minutes 60 --background', + '```', '', + '该命令仍只到总计 500;不是正式大规模训练授权。', ''] + (BUNDLE / 'report.md').write_text('\n'.join(lines)) + (BUNDLE / 'pilot_results.json').write_text(json.dumps(results, indent=2)+'\n') + return BUNDLE / 'report.md' + + +if __name__ == '__main__': + print(write_report()) diff --git a/releases/bridge-native-v3/code/scripts/run_bridge_cte_stage1.sh b/releases/bridge-native-v3/code/scripts/run_bridge_cte_stage1.sh new file mode 100644 index 0000000000000000000000000000000000000000..442dddae542f12f04af43df65529e12cc32e0a51 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/run_bridge_cte_stage1.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT=/home/gpu4/tianyi/Zeva +COSMOS=/home/gpu4/tianyi/cosmos-framework +export PYTHONPATH="$ROOT:$COSMOS" +export COSMOS_INTERNAL=0 +export OMP_NUM_THREADS=2 +export OPENBLAS_NUM_THREADS=1 +export TOKENIZERS_PARALLELISM=false +export HF_HUB_OFFLINE=1 +: "${CUDA_VISIBLE_DEVICES:=0,1,2,3,4,5,6,7}" +: "${NPROC_PER_NODE:=8}" +: "${CTE_RUN_DIR:=$ROOT/.artifacts/bridge_cte_stage1_20260924}" +: "${WANDB_PROJECT:=Zeva}" +# This shared host's default login differed from the previous run's account. +# Default to local logging; explicitly choose online with the intended account. +: "${WANDB_MODE:=offline}" +: "${WANDB_BASE_URL:=https://api.wandb.ai}" +export CUDA_VISIBLE_DEVICES NPROC_PER_NODE WANDB_PROJECT WANDB_MODE WANDB_BASE_URL +mkdir -p "$CTE_RUN_DIR" +cd "$ROOT" +exec "$COSMOS/.venv/bin/python" -u -m torch.distributed.run --standalone \ + --nproc-per-node="$NPROC_PER_NODE" "$ROOT/scripts/train_bridge_cte.py" \ + --output "$CTE_RUN_DIR" "$@" diff --git a/releases/bridge-native-v3/code/scripts/run_bridge_stage2_native.py b/releases/bridge-native-v3/code/scripts/run_bridge_stage2_native.py new file mode 100644 index 0000000000000000000000000000000000000000..c6d9c6c36d0ec3824d3decd0dc675586cdc7fef2 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/run_bridge_stage2_native.py @@ -0,0 +1,157 @@ +"""Bridge native10 WAM training. Run --help or --preflight before allocating GPUs.""" +from __future__ import annotations + +import argparse +import csv +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys + +from scripts.native_stage2.common import BASE_REPO, BASE_REVISION, SEED, atomic_json, file_hash + + +def parser(): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--base", default=BASE_REPO, choices=[BASE_REPO]) + p.add_argument("--base-revision", default=BASE_REVISION, choices=[BASE_REVISION]) + p.add_argument("--assets", type=Path, default=Path(os.environ.get("BRIDGE_NATIVE_ASSETS", "assets/bridge_native"))) + p.add_argument("--bundle", type=Path, default=Path(os.environ.get("BRIDGE_NATIVE_BUNDLE", "releases/bridge-native-v3"))) + p.add_argument("--base-path", type=Path) + p.add_argument("--dataset", type=Path) + p.add_argument("--vae", type=Path) + p.add_argument("--run-dir", type=Path, default=Path(os.environ.get("BRIDGE_NATIVE_RUN_DIR", "runs/bridge_stage2_native"))) + p.add_argument("--domain", default="bridge_orig_lerobot", choices=["bridge_orig_lerobot"]) + for name, value in (("domain-id", 7), ("policy-action-dim", 10), ("cte-action-dim", 7), ("proprio-dim", 10), ("horizon", 32)): + p.add_argument(f"--{name}", type=int, default=value, choices=[value]) + p.add_argument("--seed", type=int, default=SEED, choices=[SEED]) + p.add_argument("--continuous", action="store_true", help="Continue after both engineering/learning gates pass") + p.add_argument("--max-steps", type=int, default=100000) + p.add_argument("--nproc-per-node", type=int, default=2) + p.add_argument("--resume", type=Path, help="A complete checkpoint from this native run; no legacy deltas") + p.add_argument("--preflight", action="store_true", help="Check paths, resources and memory identity without training") + p.add_argument("--audit-only", action="store_true", help="Verify pinned base files and action tensor hashes; no model allocation") + p.add_argument("--offline", action="store_true", help="Require an existing, unchanged online base audit") + p.add_argument("--controller-report", type=Path, help="Previously completed native SimplerEnv acceptance report") + p.add_argument("--feature-cache-episodes", type=int, default=40) + return p + + +def resolve_paths(args): + args.base_path = args.base_path or args.assets / "models/Cosmos3-Nano" + args.dataset = args.dataset or args.assets / "datasets/bridge_orig_lerobot" + args.vae = args.vae or args.assets / "models/wan22_vae/Wan2.2_VAE.pth" + for key, value in vars(args).items(): + if isinstance(value, Path): + setattr(args, key, value.expanduser().resolve()) + if args.max_steps < 50 or (50 < args.max_steps < 500): + raise ValueError("Use --max-steps 50, 500 or a larger limit") + if args.nproc_per_node < 2 or args.feature_cache_episodes < 1: + raise ValueError("Native Stage2 needs at least two GPUs and a positive bounded cache") + if args.run_dir == Path("/dev/shm") or Path("/dev/shm") in args.run_dir.parents: + raise ValueError("Checkpoints require persistent storage") + + +def resources(args): + raw = subprocess.check_output(["nvidia-smi", "--query-gpu=index,uuid,memory.total,memory.free", "--format=csv,noheader,nounits"], text=True) + devices = [dict(index=r[0].strip(), uuid=r[1].strip(), total=int(r[2]), free=int(r[3])) for r in csv.reader(raw.splitlines())] + apps = subprocess.check_output(["nvidia-smi", "--query-compute-apps=gpu_uuid,pid", "--format=csv,noheader,nounits"], text=True) + busy = {r[0].strip() for r in csv.reader(apps.splitlines()) if len(r) == 2} + selection = os.environ.get("CUDA_VISIBLE_DEVICES") + if selection: + ids = selection.split(",") + selected = [next((g for g in devices if i in (g["index"], g["uuid"])), None) for i in ids] + if any(g is None for g in selected) or len(selected) != args.nproc_per_node: + raise ValueError("CUDA_VISIBLE_DEVICES must name exactly --nproc-per-node physical GPUs") + else: + selected = [g for g in devices if g["uuid"] not in busy and g["total"] >= 79000 and g["free"] >= 76000][:args.nproc_per_node] + failures = [] + if len(selected) < args.nproc_per_node: + failures.append("Need at least two unused 80GB GPUs") + for gpu in selected: + if gpu["uuid"] in busy or gpu["total"] < 79000 or gpu["free"] < 76000: + failures.append(f"GPU {gpu['index']} is occupied or has insufficient memory") + ancestor = args.run_dir + while not ancestor.exists(): + ancestor = ancestor.parent + free = shutil.disk_usage(ancestor).free + if free < 320 * 2**30: + failures.append(f"Need 320 GiB persistent free space; {free / 2**30:.1f} GiB available") + return dict(passed=not failures, failures=failures, selected=selected, free_gib=free / 2**30) + + +def preflight(args): + from scripts.bridge_handoff import verify + from scripts.native_stage2.data import Episodes, partitions + report = dict(training="NOT_RUN", gate_50="NOT_RUN", gate_500="NOT_RUN") + report["memory"] = verify(args.bundle, dataset=args.dataset, vae=args.vae) + report["implementation_dependencies"] = check_dependencies(args) + data = Episodes(args.dataset) + split = partitions(args.bundle, data) + report["partitions"] = {k: len(v) for k, v in split.items()} + missing = [str(path) for eid in set(split["continuous"] + split["support"] + split["development"]) + for path in data.paths(eid) if not path.is_file()] + if missing: + raise FileNotFoundError(f"Dataset incomplete ({len(missing)} files), first: {missing[:3]}") + for relative in ("config.json", "model.safetensors.index.json", "transformer/diffusion_pytorch_model.safetensors.index.json", + "text_tokenizer/tokenizer_config.json", "preprocessor_config.json"): + if not (args.base_path / relative).is_file(): + raise FileNotFoundError(f"Download the complete pinned Nano snapshot; missing {args.base_path / relative}") + report["resources"] = resources(args) + args.run_dir.mkdir(parents=True, exist_ok=True) + atomic_json(args.run_dir / "preflight.json", report) + return report + + +def check_dependencies(args): + from cosmos_framework.data.generator.action.datasets import bridge_orig_lerobot_dataset as bridge + from scripts.bridge_recovery_contract import NORMALIZER_FILE + source = Path(bridge.__file__).resolve() + repo = next((p for p in source.parents if (p / ".git").exists()), None) + if repo is None: + raise ValueError("Use a checkout of the pinned Cosmos Framework; its Git revision must be auditable") + revision = subprocess.check_output(["git", "-C", str(repo), "rev-parse", "HEAD"], text=True).strip() + expected = "ee58e41467f33c49ddde08b4d0ef4923876a95ac" + if revision != expected: + raise ValueError(f"Cosmos Framework must be {expected}, found {revision}") + for actual, filename in ((NORMALIZER_FILE, "cte_legacy_normalizer.json"), + (bridge._NORMALIZER_PATH, "policy_native10_normalizer.json")): + if file_hash(actual) != file_hash(args.bundle / "memory" / filename): + raise ValueError(f"Runtime normalizer differs from the handoff: {filename}") + return dict(framework_revision=revision, normalizers_exact=True) + + +def main(): + args = parser().parse_args() + resolve_paths(args) + if args.audit_only: + from scripts.native_stage2.base import verify_base_files, audit_source + out = args.run_dir / "base_audit" + verify_base_files(args.base_path, out, args.offline) + atomic_json(out / "action_source.json", audit_source(args.base_path)) + print(f"Pinned Nano audit saved: {out}") + return + if "LOCAL_RANK" in os.environ: + from scripts.native_stage2.train import train + train(args) + return + report = preflight(args) + if args.preflight: + print(json.dumps(report, indent=2, ensure_ascii=False)) + if not report["resources"]["passed"]: + raise SystemExit(2) + return + if not report["resources"]["passed"]: + raise RuntimeError("; ".join(report["resources"]["failures"])) + os.environ["CUDA_VISIBLE_DEVICES"] = ",".join(g["uuid"] for g in report["resources"]["selected"]) + os.environ["COSMOS_TRAINING"] = "1" + os.environ["COSMOS_DEVICE"] = "cuda" + command = [sys.executable, "-m", "torch.distributed.run", "--standalone", f"--nproc-per-node={args.nproc_per_node}", + "--module", "scripts.run_bridge_stage2_native", *sys.argv[1:]] + raise SystemExit(subprocess.call(command)) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/run_bridge_stage2_pilot.py b/releases/bridge-native-v3/code/scripts/run_bridge_stage2_pilot.py new file mode 100644 index 0000000000000000000000000000000000000000..1d957e2915766e51056fa35fa6ddec949921caf0 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/run_bridge_stage2_pilot.py @@ -0,0 +1,163 @@ +"""Launch only the authorized 50/500-step pilot on verified idle GPUs.""" +from __future__ import annotations + +import argparse +from datetime import datetime +import fcntl +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import time + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) +PYTHON = '/home/gpu4/tianyi/cosmos-framework/.venv/bin/python' +RUN = ROOT / '.artifacts/bridge_stage2_pilot_v2/train' + + +def write_status(state, **extra): + temporary = RUN / f'run_status.{os.getpid()}.tmp' + temporary.write_text(json.dumps(dict(status=state, pid=os.getpid(), + updated_at=datetime.now().astimezone().isoformat(), **extra), indent=2)+'\n') + temporary.replace(RUN / 'run_status.json') + + +def run_stage(args): + bundle = ROOT / '.artifacts/bridge_stage2_pilot_v2' + run = bundle / 'train' + if not (bundle / 'manifest.json').exists(): + raise FileNotFoundError('Prepare the support/query bundle first') + from scripts.bridge_stage2_data import read_bundle + from scripts.bridge_recovery_contract import sha256_file + manifest = read_bundle(bundle) + identity = manifest['contract']['identity'] + if sha256_file(identity['cte_checkpoint_path']) != identity['cte_checkpoint_sha256']: + raise ValueError('Frozen source CTE changed after bundle construction') + probes = json.loads((bundle / 'probes_v1/manifest.json').read_text()) + if probes['feature_fingerprint'] != manifest['fingerprint']: + raise ValueError('Fixed probes do not match the frozen feature bundle') + run.mkdir(exist_ok=True) + def check_disk(): + if shutil.disk_usage(run).free < 8*2**30: + raise OSError('Need at least 8 GiB free for bounded pilot artifacts; old files will not be removed') + check_disk() + if args.steps == 50 and list((run / 'checkpoints').glob('step_*.pt')): + raise FileExistsError('Fresh smoke must not overwrite an existing run') + if args.steps == 500: + result = json.loads((run / 'engineering_50.json').read_text()) + if not result['passed'] or not (run / 'checkpoints/step_000000050.verified.json').exists(): + raise ValueError('50-step engineering and checkpoint checks must pass first') + from scripts.follow_bridge_stage2_pilot import check_smoke + check_smoke(run) + selected = args.gpus + shared_baseline = None + if not args.dryrun: + deadline = time.monotonic() + 60*args.wait_minutes + while True: + rows = subprocess.check_output(['nvidia-smi', '--query-gpu=index,uuid,memory.used,memory.free,utilization.gpu', '--format=csv,noheader,nounits'], text=True) + actual = {int(parts[0]): dict(uuid=parts[1].strip(), used=int(parts[2]), free=int(parts[3]), util=int(parts[4])) + for row in rows.splitlines() for parts in [row.split(',')]} + active_rows = subprocess.check_output(['nvidia-smi', '--query-compute-apps=gpu_uuid,pid', '--format=csv,noheader'], text=True) + occupied = {row.split(',')[0].strip() for row in active_rows.splitlines()} + idle = [index for index, gpu in actual.items() + if (gpu['util'] <= 5 and + ((gpu['used'] <= 256 and gpu['uuid'] not in occupied) or + (args.allow_shared_idle and gpu['free'] >= 36*1024)))] + wanted = idle[:2] if args.gpus == 'auto' else list(map(int, args.gpus.split(','))) + if len(wanted) == 2 and all(index in idle for index in wanted): + selected = ','.join(map(str, wanted)) + if args.allow_shared_idle: + shared_baseline = {actual[index]['uuid']: sorted( + int(row.split(',')[1]) for row in active_rows.splitlines() + if row.split(',')[0].strip() == actual[index]['uuid']) for index in wanted} + break + print(f'WAITING_FOR_IDLE_GPUS idle={idle}; no existing jobs changed', flush=True) + write_status('waiting_for_idle_gpus', target_step=args.steps, gpu_usage=actual, + required_idle_gpus=2, remaining_wait_seconds=max(0, deadline-time.monotonic())) + if time.monotonic() >= deadline: + raise RuntimeError('No two idle GPUs before the bounded wait deadline') + time.sleep(min(30., max(.1, deadline-time.monotonic()))) + elif selected == 'auto': + selected = '2,3' + check_disk() + env = dict(os.environ, PYTHONPATH=f'{ROOT}:/home/gpu4/tianyi/cosmos-framework', + CUDA_VISIBLE_DEVICES=selected, TOKENIZERS_PARALLELISM='false', HF_HUB_OFFLINE='1', + QWEN_VLM_PATH='/home/gpu4/tianyi/models/Qwen3-VL-8B-Instruct', + WAN_VAE_PATH='/home/gpu4/tianyi/models/wan22_vae/Wan2.2_VAE.pth', + BASE_CHECKPOINT_PATH='/home/gpu4/tianyi/zeva-release/weights/stage2', + BRIDGE_STAGE2_BUNDLE=str(bundle), + BRIDGE_STAGE2_WARMSTART=str(ROOT / '.artifacts/ipec_full/checkpoints/step_000290000.pt'), + WIDOWX_RUN_DIR=str(run), IMAGINAIRE_OUTPUT_ROOT=str(run / 'runtime'), + WIDOWX_RESUME='none' if args.steps == 50 else str(run / 'checkpoints/step_000000050.pt')) + if shared_baseline is not None: + env['BRIDGE_PILOT_SHARED_BASELINE'] = json.dumps(shared_baseline) + command = [PYTHON, '-u', '-m', 'torch.distributed.run', '--standalone', + f'--nproc-per-node={len(selected.split(","))}', str(ROOT / 'scripts/train_bridge_stage2_pilot.py'), + '--sft-toml', str(ROOT / 'scripts/bridge_stage2_pilot.toml')] + if args.dryrun: + command.append('--dryrun') + else: + command = ['timeout', '--signal=TERM', '--kill-after=60s', '100m', *command] + command.extend(['--', f'trainer.max_iter={args.steps}', f'checkpoint.save_iter={args.steps}']) + (run / f'launch_{args.steps}.json').write_text(json.dumps(dict(command=command, gpu_ids=selected, max_steps=args.steps), indent=2)+'\n') + write_status('dryrun' if args.dryrun else 'training', target_step=args.steps, gpu_ids=selected) + print('PILOT_LAUNCH '+json.dumps(command), flush=True) + with (run / f'launcher_{args.steps}.log').open('a') as log: + # The upstream Qwen config loader resolves its JSON path relative to + # the framework checkout, not to this Zeva overlay checkout. + result = subprocess.run(command, env=env, cwd='/home/gpu4/tianyi/cosmos-framework', + stdout=log, stderr=subprocess.STDOUT) + print(f'PILOT_EXIT steps={args.steps} code={result.returncode}', flush=True) + (run / f'exit_{args.steps}.json').write_text(json.dumps(dict( + target_step=args.steps, returncode=result.returncode, + finished_at=datetime.now().astimezone().isoformat()), indent=2)+'\n') + if result.returncode: + raise RuntimeError(f'Pilot {args.steps} exited with code {result.returncode}') + write_status('dryrun_complete' if args.dryrun else 'stage_complete', target_step=args.steps) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--steps', type=int, choices=(50, 500), required=True) + parser.add_argument('--gpus', default='auto') + parser.add_argument('--wait-minutes', type=float, default=0) + parser.add_argument('--allow-shared-idle', action='store_true', + help='Opt in to low-utilization GPUs with >=36 GiB free; never stop resident jobs') + parser.add_argument('--dryrun', action='store_true') + parser.add_argument('--then-500', action='store_true', help='Continue a passed 50-step smoke only') + parser.add_argument('--background', action='store_true', help='Detach this bounded job from the tool session') + args = parser.parse_args() + RUN.mkdir(parents=True, exist_ok=True) + if args.then_500 and (args.steps != 50 or args.dryrun): + parser.error('--then-500 requires a real 50-step smoke') + if args.background: + command = [PYTHON, '-u', str(Path(__file__).resolve()), *[a for a in sys.argv[1:] if a != '--background']] + with (RUN / 'controller.log').open('a') as output: + child = subprocess.Popen(command, cwd=ROOT, stdin=subprocess.DEVNULL, + stdout=output, stderr=subprocess.STDOUT, start_new_session=True) + print(f'PILOT_BACKGROUND_PID={child.pid}', flush=True) + return + lock = (RUN / 'launcher.lock').open('a') + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + try: + run_stage(args) + if args.then_500: + from scripts.follow_bridge_stage2_pilot import check_smoke + comparisons = check_smoke() + (RUN / 'smoke_gate.json').write_text(json.dumps(dict(passed=True, comparisons=comparisons), indent=2)+'\n') + args.steps = 500 + args.wait_minutes = min(args.wait_minutes, 60) + run_stage(args) + write_status('dryrun_complete' if args.dryrun else 'completed', target_step=args.steps) + except Exception as error: + write_status('stopped_without_touching_other_jobs', target_step=args.steps, + error=f'{type(error).__name__}: {error}') + raise + + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/run_ipec_full_training.sh b/releases/bridge-native-v3/code/scripts/run_ipec_full_training.sh new file mode 100644 index 0000000000000000000000000000000000000000..57f6e1118b1135f5ec4c262c7ac8b6eb3db94a56 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/run_ipec_full_training.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Full IPEC-COMMUNITY/bridge_orig_lerobot adaptation. The released Zeva +# Stage-2 behavior path consumes one frozen CTE/retrieval feature file per +# episode, so feature preparation is an explicit, validated phase before the +# trainer is launched. +ROOT=/home/gpu4/tianyi/Zeva +COSMOS=/home/gpu4/tianyi/cosmos-framework +PYTHON="$COSMOS/.venv/bin/python" +DATASET="${WIDOWX_DATASET:-/home/gpu4/tianyi/TTTVLA/datasets/bridge_orig_1.0.0_lerobot}" +# New sampling/loss contract must not silently resume the old biased run. +RUN_DIR="${WIDOWX_RUN_DIR:-$ROOT/.artifacts/ipec_full_v2}" +FEATURE_CACHE="${WIDOWX_FEATURE_CACHE:-/home/gpu4/tianyi/TTTVLA/datasets/bridge_orig_1.0.0_lerobot_zeva_features_v2}" + +export PYTHONPATH="$ROOT:$COSMOS" +export QWEN_VLM_PATH=/home/gpu4/tianyi/models/Qwen3-VL-8B-Instruct +export WAN_VAE_PATH=/home/gpu4/tianyi/models/wan22_vae/Wan2.2_VAE.pth +export BASE_CHECKPOINT_PATH=/home/gpu4/tianyi/zeva-release/weights/stage2 +export WIDOWX_DATASET="$DATASET" +export WIDOWX_RUN_DIR="$RUN_DIR" +export WIDOWX_FEATURE_CACHE="$FEATURE_CACHE" +export IMAGINAIRE_OUTPUT_ROOT="$RUN_DIR/train" +export WIDOWX_WINDOW_MODE=full +if [[ -n "${WIDOWX_MAX_EPISODES:-}" ]]; then + echo 'Unset WIDOWX_MAX_EPISODES for the full-data launcher; use run_widowx_training.sh for bounded smoke tests.' >&2 + exit 2 +fi +: "${CUDA_VISIBLE_DEVICES:=1}" +: "${NPROC_PER_NODE:=1}" +export CUDA_VISIBLE_DEVICES NPROC_PER_NODE +export TOKENIZERS_PARALLELISM=false +export HF_HUB_OFFLINE=1 + +mkdir -p "$RUN_DIR" "$FEATURE_CACHE" + +cd "$COSMOS" +if ! "$PYTHON" "$ROOT/scripts/prepare_widowx_features.py" --validate-only; then + # One independent preprocessing worker per explicitly selected training GPU. + # No automatic GPU discovery and no interference with other processes. + IFS=',' read -ra feature_gpus <<< "$CUDA_VISIBLE_DEVICES" + feature_pids=() + for shard in "${!feature_gpus[@]}"; do + CUDA_VISIBLE_DEVICES="${feature_gpus[$shard]}" MASTER_ADDR=127.0.0.1 MASTER_PORT="$((29681 + shard))" \ + RANK=0 WORLD_SIZE=1 LOCAL_RANK=0 OMP_NUM_THREADS=2 \ + "$PYTHON" "$ROOT/scripts/prepare_widowx_features.py" \ + --shard-index "$shard" --num-shards "${#feature_gpus[@]}" \ + > "$RUN_DIR/features.shard_${shard}.log" 2>&1 & + feature_pids+=("$!") + done + failed=0 + for feature_pid in "${feature_pids[@]}"; do + wait "$feature_pid" || failed=1 + done + if [[ "$failed" == 1 ]]; then + echo 'Feature preparation failed; training was NOT started. Inspect features.shard_*.log.' >&2 + exit 2 + fi + "$PYTHON" "$ROOT/scripts/prepare_widowx_features.py" --validate-only +fi +touch "$RUN_DIR/feature_cache_complete" + +echo "Feature cache complete: all episode boundaries validated" >&2 +cd "$ROOT" +exec bash "$ROOT/scripts/run_widowx_training.sh" "$@" diff --git a/releases/bridge-native-v3/code/scripts/run_widowx_memory_ablation.py b/releases/bridge-native-v3/code/scripts/run_widowx_memory_ablation.py new file mode 100644 index 0000000000000000000000000000000000000000..251ae308de91b601a0d8cb7544b753380616ee72 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/run_widowx_memory_ablation.py @@ -0,0 +1,88 @@ +"""Matched external-bank on/off evaluation, without changing training state.""" +import argparse +import hashlib +import json +import os +from pathlib import Path +import subprocess +import sys +import time + + +def summarize(root, checkpoint): + path=root/'eval'/f'{checkpoint.stem}.json' + report=json.loads(path.read_text()) + episodes=report['episodes'] + traces=[] + for ep in episodes: + traces.extend(json.loads((root/'eval/traces'/checkpoint.stem/f'episode_{ep["seed"]:02d}.json').read_text())) + return dict(report=str(path),episodes=len(episodes), + successes=sum(bool(ep['success']) for ep in episodes), + success_rate=report['success_rate'], + progress={key:sum(bool(ep['progress'].get(key)) for ep in episodes) + for key in ('moved_correct_obj','moved_wrong_obj','is_src_obj_grasped','src_on_target')}, + control_steps=len(traces), + gripper_closed_fraction=sum(x['command'][6]<0 for x in traces)/max(1,len(traces))) + + +def main(): + p=argparse.ArgumentParser(description=__doc__) + p.add_argument('--checkpoint',type=Path,required=True) + p.add_argument('--output',type=Path,required=True) + p.add_argument('--episodes',type=int,default=20) + p.add_argument('--port',type=int,default=18825) + p.add_argument('--seed-start',type=int,default=0) + p.add_argument('--exec-horizon',type=int,choices=range(1,33),default=4) + p.add_argument('--after',type=Path,help='wait for a preceding matched comparison to finish') + args=p.parse_args() + if args.episodes<1 or args.seed_start<0: p.error('invalid episode count or seed') + if args.after: + print(f'MEMORY_ABLATION_WAITING_FOR {args.after}',flush=True) + while not args.after.is_file(): + time.sleep(15) + previous=json.loads(args.after.read_text()) + if previous.get('status')!='complete': raise ValueError('Preceding comparison is not complete') + checkpoint=args.checkpoint.resolve(strict=True) + root=args.output.resolve();root.mkdir(parents=True,exist_ok=True) + with checkpoint.open('rb') as stream: + digest=hashlib.file_digest(stream,'sha256').hexdigest() + protocol=dict(checkpoint=str(checkpoint),checkpoint_sha256=digest, + episodes=args.episodes,seed_start=args.seed_start,max_steps=150, + num_steps=30,exec_horizon=args.exec_horizon,guidance=3.0, + modes=['bank_off','on'],policy_gpu=os.environ.get('WIDOWX_EVAL_GPU'), + render_gpu=os.environ.get('WIDOWX_RENDER_GPU'), + intervention='bank_off skips external bank/head loading; global=zeros; CTE/BIT and policy weights unchanged') + manifest=root/'protocol.json' + if manifest.exists() and json.loads(manifest.read_text())!=protocol: + raise ValueError('Existing ablation protocol differs; choose a new output directory') + manifest.write_text(json.dumps(protocol,indent=2)) + watcher=Path(__file__).with_name('watch_widowx_eval.py') + summary={} + for mode in protocol['modes']: + run=root/mode + report=run/'eval'/f'{checkpoint.stem}.json' + if not report.exists(): + env=os.environ.copy();env['WIDOWX_RUN_DIR']=str(run) + print(f'MEMORY_ABLATION_START mode={mode}',flush=True) + subprocess.run([sys.executable,str(watcher),'--once','--checkpoint',str(checkpoint), + '--episodes',str(args.episodes),'--seed-start',str(args.seed_start), + '--port',str(args.port),'--record-traces','--max-steps','150', + '--num-steps','30','--exec-horizon',str(args.exec_horizon),'--guidance','3', + '--memory-mode',mode],env=env,check=True) + payload=json.loads(report.read_text()) + if payload.get('status')!='complete' or payload.get('memory_mode')!=mode or len(payload['episodes'])!=args.episodes: + raise ValueError(f'Incomplete/wrong-mode report: {report}') + for field,expected in [('checkpoint',str(checkpoint)),('max_steps',150),('inference_num_steps',30), + ('exec_horizon',args.exec_horizon),('guidance',3.0),('seed_start',args.seed_start)]: + if payload.get(field)!=expected: raise ValueError(f'Protocol mismatch: {field}') + if [ep['seed'] for ep in payload['episodes']]!=list(range(args.seed_start,args.seed_start+args.episodes)): + raise ValueError('Seed sequence differs') + summary[mode]=summarize(run,checkpoint) + print(f'MEMORY_ABLATION_RESULT {mode} '+json.dumps(summary[mode]),flush=True) + result=dict(status='complete',protocol=protocol,results=summary, + caveat='Inference-only ablation on a model trained with bank context; not equivalent to training without it.') + temp=root/'comparison.tmp';temp.write_text(json.dumps(result,indent=2));temp.replace(root/'comparison.json') + print('MEMORY_ABLATION_COMPLETE '+str(root/'comparison.json'),flush=True) + + +if __name__=='__main__': main() diff --git a/releases/bridge-native-v3/code/scripts/run_widowx_training.sh b/releases/bridge-native-v3/code/scripts/run_widowx_training.sh new file mode 100644 index 0000000000000000000000000000000000000000..85fb7049b8853e1daf57e96e20d414cffded2ff5 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/run_widowx_training.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -euo pipefail +export PYTHONPATH=/home/gpu4/tianyi/Zeva:/home/gpu4/tianyi/cosmos-framework +: "${QWEN_VLM_PATH:=/home/gpu4/tianyi/models/Qwen3-VL-8B-Instruct}" +: "${WAN_VAE_PATH:=/home/gpu4/tianyi/models/wan22_vae/Wan2.2_VAE.pth}" +: "${BASE_CHECKPOINT_PATH:=/home/gpu4/tianyi/zeva-release/weights/stage2}" +: "${WIDOWX_DATASET:=/opt/zhangchenyu/datasets/bridge_orig_lerobot_smoke}" +: "${WIDOWX_RUN_DIR:=/home/gpu4/tianyi/Zeva/.artifacts/widowx_fixed}" +# Frozen CTE features are reusable across isolated training runs. +: "${WIDOWX_FEATURE_CACHE:=/home/gpu4/tianyi/Zeva/.artifacts/widowx/features}" +: "${IMAGINAIRE_OUTPUT_ROOT:=$WIDOWX_RUN_DIR/train}" +: "${WANDB_BASE_URL:=https://api.wandb.ai}" +: "${CUDA_VISIBLE_DEVICES:=1,2,3,4,5,7}" +: "${NPROC_PER_NODE:=6}" +# Every value above is consumed through ``os.environ``/Hydra ``oc.env`` in the +# Python entrypoint. Export the defaults as well as the override-friendly +# values; otherwise a direct ``bash scripts/run_widowx_training.sh`` launch +# silently loses the dataset, model, VAE, and base-checkpoint paths. +export QWEN_VLM_PATH WAN_VAE_PATH BASE_CHECKPOINT_PATH WIDOWX_DATASET \ + WIDOWX_RUN_DIR WIDOWX_FEATURE_CACHE IMAGINAIRE_OUTPUT_ROOT \ + CUDA_VISIBLE_DEVICES NPROC_PER_NODE WANDB_BASE_URL +export TOKENIZERS_PARALLELISM=false +export HF_HUB_OFFLINE=1 +cd /home/gpu4/tianyi/cosmos-framework +exec /home/gpu4/tianyi/cosmos-framework/.venv/bin/python -m torch.distributed.run --standalone --nproc-per-node="$NPROC_PER_NODE" /home/gpu4/tianyi/Zeva/scripts/train_widowx_zeva.py --sft-toml /home/gpu4/tianyi/Zeva/scripts/widowx_smoke.toml "$@" diff --git a/releases/bridge-native-v3/code/scripts/smoke_train_bridge_data.py b/releases/bridge-native-v3/code/scripts/smoke_train_bridge_data.py new file mode 100644 index 0000000000000000000000000000000000000000..7b9e5fa60a391da4351742952975722ef9daa17d --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/smoke_train_bridge_data.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +"""Small real-data training smoke for bridge_orig_lerobot_smoke. + +This deliberately tests decoding, batching, CUDA forward/backward, optimizer +updates, and checkpoint writing without claiming to train the full Cosmos/Zeva +model. The Zeva framework's Bridge adapter currently expects older LeRobot +metadata, while this smoke set is v3. +""" +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import numpy as np +import pyarrow.parquet as pq +import torch +from torch import nn +import av + + +class TinyActionNet(nn.Module): + def __init__(self) -> None: + super().__init__() + self.encoder = nn.Sequential( + nn.Conv2d(3, 16, 5, stride=2, padding=2), nn.GELU(), + nn.Conv2d(16, 32, 5, stride=2, padding=2), nn.GELU(), + nn.Conv2d(32, 64, 5, stride=2, padding=2), nn.GELU(), + nn.AdaptiveAvgPool2d(1), + ) + self.head = nn.Sequential(nn.Linear(64 + 8, 64), nn.GELU(), nn.Linear(64, 7)) + + def forward(self, image: torch.Tensor, state: torch.Tensor) -> torch.Tensor: + feat = self.encoder(image).flatten(1) + return self.head(torch.cat([feat, state], dim=1)) + + +def load_subset(root: Path, episodes: int, size: int) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + rows_i, images, states, actions = [], [], [], [] + for episode in range(episodes): + table = pq.read_table(root / "data" / "chunk-000" / f"episode_{episode:06d}.parquet").to_pylist() + video = root / "videos" / "chunk-000" / "observation.images.image_0" / f"episode_{episode:06d}.mp4" + container = av.open(str(video)) + decoded = [frame.to_ndarray(format="rgb24") for frame in container.decode(video=0)] + container.close() + if len(decoded) < len(table): + raise RuntimeError(f"decoded {len(decoded)} frames but parquet has {len(table)}: {video}") + for row, frame in zip(table, decoded): + # Avoid an OpenCV dependency; torch interpolation handles the resize. + frame = torch.from_numpy(frame).permute(2, 0, 1).float().unsqueeze(0) + frame = torch.nn.functional.interpolate(frame, size=(size, size), mode="bilinear", align_corners=False) + frame = frame.squeeze(0).byte().permute(1, 2, 0).numpy() + images.append(frame) + states.append(row["observation.state"]) + actions.append(row["action"]) + if not images: + raise RuntimeError("smoke subset is empty") + return ( + torch.from_numpy(np.asarray(images)).permute(0, 3, 1, 2).float().div_(255.0), + torch.tensor(np.asarray(states), dtype=torch.float32), + torch.tensor(np.asarray(actions), dtype=torch.float32), + ) + + +def main() -> int: + p = argparse.ArgumentParser() + p.add_argument("--root", type=Path, required=True) + p.add_argument("--steps", type=int, default=2000) + p.add_argument("--episodes", type=int, default=3) + p.add_argument("--output", type=Path, required=True) + p.add_argument("--device", default="cuda") + args = p.parse_args() + if args.steps < 1: + raise ValueError("steps must be positive") + device = torch.device(args.device if args.device != "cuda" or torch.cuda.is_available() else "cpu") + images, states, actions = load_subset(args.root, args.episodes, 64) + images, states, actions = images.to(device), states.to(device), actions.to(device) + model = TinyActionNet().to(device) + opt = torch.optim.AdamW(model.parameters(), lr=3e-4) + loss_fn = nn.MSELoss() + losses: list[float] = [] + generator = torch.Generator(device=device).manual_seed(42) + model.train() + for step in range(args.steps): + idx = torch.randint(images.shape[0], (min(8, images.shape[0]),), generator=generator, device=device) + loss = loss_fn(model(images.index_select(0, idx), states.index_select(0, idx)), actions.index_select(0, idx)) + opt.zero_grad(set_to_none=True) + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) + opt.step() + losses.append(float(loss.detach().cpu())) + if (step + 1) % max(1, args.steps // 10) == 0: + print(f"step={step + 1} loss={losses[-1]:.8f}", flush=True) + args.output.parent.mkdir(parents=True, exist_ok=True) + torch.save({"model": model.state_dict(), "steps": args.steps}, args.output.with_suffix(".pt")) + report = { + "status": "PASS_DATA_GPU_TRAINING_SMOKE", + "device": str(device), + "episodes": args.episodes, + "frames": int(images.shape[0]), + "image_shape": list(images.shape[1:]), + "state_shape": list(states.shape[1:]), + "action_shape": list(actions.shape[1:]), + "steps": args.steps, + "loss_first": losses[0], + "loss_last": losses[-1], + "loss_min": min(losses), + "checkpoint": str(args.output.with_suffix(".pt").resolve()), + } + args.output.write_text(json.dumps(report, indent=2), encoding="utf-8") + print(json.dumps(report, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/releases/bridge-native-v3/code/scripts/snapshot_bridge_recovery_v2.py b/releases/bridge-native-v3/code/scripts/snapshot_bridge_recovery_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..b0b86191a71645cd1534b1881f766201e8b931e6 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/snapshot_bridge_recovery_v2.py @@ -0,0 +1,135 @@ +"""Small, read-only provenance snapshot for the Bridge recovery branch.""" +from __future__ import annotations + +import json +import os +import shutil +import subprocess +from datetime import datetime +from pathlib import Path + +import torch + +from scripts.bridge_recovery_contract import bridge_feature_source, cte_identity, sha256_file + + +ROOT = Path(__file__).resolve().parents[1] +OUTPUT = ROOT / '.artifacts/bridge_zeva_recovery_v2' +RUN = ROOT / '.artifacts/bridge_cte_stage1_20260924' +SOURCE = ( + 'scripts/action_normalizer_legacy_v0.json', + 'scripts/bridge_recovery_contract.py', + 'scripts/widowx_rollout.py', + 'scripts/eval_widowx_simpler.py', + 'scripts/widowx_policy_server.py', + 'scripts/diagnose_bridge_cte_v2.py', + 'scripts/check_bridge_cte_golden_v2.py', + 'scripts/audit_ipec_base_delta_v2.py', + 'scripts/check_simpler_reached_state_v2.py', + 'scripts/snapshot_bridge_recovery_v2.py', + 'scripts/test_bridge_recovery_v2.py', + 'scripts/test_widowx_execution.py', +) + + +def command(*args): + try: + value = subprocess.run(args, cwd=ROOT, text=True, capture_output=True, check=False) + except FileNotFoundError: + return dict(exit_code=127, stdout='', stderr=f'{args[0]} is not installed') + return dict(exit_code=value.returncode, stdout=value.stdout.strip(), stderr=value.stderr.strip()) + + +def filesystem(path): + total, used, free = shutil.disk_usage(path) + return dict(path=path, total_bytes=total, used_bytes=used, free_bytes=free, + free_gib=round(free/2**30, 3)) + + +def main(): + OUTPUT.mkdir(parents=True, exist_ok=True) + now = datetime.now().astimezone().isoformat() + ps = command('ps', '-eo', 'pid,ppid,stat,etime,args') + cte_processes = [line.strip() for line in ps['stdout'].splitlines() + if 'train_bridge_cte.py' in line and 'ps -eo' not in line] + snapshot = dict(timestamp=now, branch=command('git', 'branch', '--show-current')['stdout'], + head=command('git', 'rev-parse', 'HEAD')['stdout'], + running_cte_processes=cte_processes, + latest_status=json.loads((RUN / 'status.json').read_text()), + latest_checkpoint=json.loads((RUN / 'latest_checkpoint.json').read_text()), + run_log_bytes=(RUN / 'launcher.log').stat().st_size, + filesystems=[filesystem('/'), filesystem('/opt')], + gpus=command('nvidia-smi', '--query-gpu=index,name,uuid,utilization.gpu,memory.used,memory.free', + '--format=csv,noheader'), + gpu_processes=command('nvidia-smi', '--query-compute-apps=pid,gpu_uuid,used_gpu_memory', + '--format=csv,noheader'), + tmux_panes=command('tmux', 'list-panes', '-a', '-F', + '#{session_name}:#{window_index}.#{pane_index} #{pane_pid} #{pane_current_command}'), + quota=command('quota', '-s'), + cte_stop_target=('none: no verified live process belongs to this CTE run' + if not cte_processes else 'explicit approval needed; signal only verified launcher/PID'), + cte_stop_method=('no command applies while the run is stopped' + if not cte_processes else 'SIGTERM to exact verified CTE launcher, wait for graceful checkpoint; never pkill by name')) + (OUTPUT / 'run_snapshot.json').write_text(json.dumps(snapshot, indent=2) + '\n') + + files = [] + for path in sorted((RUN / 'checkpoints').glob('cte_step_*.pt')): + payload = torch.load(path, map_location='cpu', weights_only=False) + files.append(dict(path=str(path.resolve()), step=payload.get('step'), + bytes=path.stat().st_size, sha256=sha256_file(path), + format=payload.get('format'), + has_optimizer=isinstance(payload.get('optimizer'), dict), + rng_ranks=len(payload.get('rng_states', [])), + has_epoch='epoch' in payload, has_batch_cursor='batch_cursor' in payload, + contract_fingerprint=payload.get('contract_fingerprint'), + model_tensor_count=len(payload.get('model', {})))) + if payload.get('step') == 20000: + identity = cte_identity(payload, path, RUN / 'split.json') + (OUTPUT / 'cte_identity_20k.json').write_text(json.dumps(identity, indent=2) + '\n') + (OUTPUT / 'bridge_feature_source_20k.json').write_text( + json.dumps(bridge_feature_source(identity), indent=2) + '\n') + inventory = dict(timestamp=now, source_run=str(RUN.resolve()), + requested_14k_exists=(RUN / 'checkpoints/cte_step_000014000.pt').is_file(), + checkpoints=files) + (OUTPUT / 'checkpoint_inventory.json').write_text(json.dumps(inventory, indent=2) + '\n') + + patch = [] + tracked_diff = command('git', 'diff', '--binary', 'HEAD', '--', *SOURCE) + if tracked_diff['stdout']: + patch.append(tracked_diff['stdout'] + '\n') + for name in SOURCE: + if not command('git', 'ls-files', '--error-unmatch', name)['exit_code']: + continue + result = command('git', 'diff', '--no-index', '--binary', '/dev/null', name) + if result['exit_code'] not in (0, 1): + raise RuntimeError(f'Could not snapshot source {name}: {result}') + if result['stdout']: + patch.append(result['stdout'] + '\n') + (OUTPUT / 'source_snapshot.patch').write_text(''.join(patch)) + provenance = dict(timestamp=now, branch=snapshot['branch'], head=snapshot['head'], + patch_sha256=sha256_file(OUTPUT / 'source_snapshot.patch'), + source_sha256={name: sha256_file(ROOT / name) for name in SOURCE}, + cte_source_sha256={name: sha256_file(ROOT / name) for name in ( + 'scripts/train_bridge_cte.py', 'scripts/bridge_cte_data.py', + 'scripts/bridge_cte_loss.py', + 'cosmos_framework/model/zeva/cte_losses.py', + 'cosmos_framework/model/zeva/causal_transition_encoder.py')}) + (OUTPUT / 'source_provenance.json').write_text(json.dumps(provenance, indent=2) + '\n') + + size = max(item['bytes'] for item in files) + floor = max(30 * 2**30, 2 * size + 5 * 2**30) + storage = f'''# Recovery storage audit ({now}) + +- Current CTE status: {snapshot['latest_status']['kind']} at optimizer update {snapshot['latest_status']['step']}; live CTE PIDs: {cte_processes or 'none'}. +- Root filesystem free: {snapshot['filesystems'][0]['free_gib']:.2f} GiB; /opt free: {snapshot['filesystems'][1]['free_gib']:.2f} GiB. Both are 99%-used volumes. +- Largest CTE checkpoint: {size/2**20:.1f} MiB. Plan's conservative free-space floor is {floor/2**30:.1f} GiB. Root is below that floor; do not start a new unbounded checkpoint-writing job there. +- This round writes only small JSON/patch reports in {OUTPUT}; it neither copies nor deletes checkpoints and creates no full VAE cache. +- CTE stop object: {snapshot['cte_stop_target']}. Stop method: {snapshot['cte_stop_method']}. +- If a future run is authorized, use a new output directory, a bounded step count and wallclock, and confirm disk space before launch. Any transfer or deletion of old artifacts requires separate authorization. +''' + (OUTPUT / 'storage_plan.md').write_text(storage) + print(f'SNAPSHOT_COMPLETE {OUTPUT} checkpoints={len(files)} running_cte={len(cte_processes)}', flush=True) + + +if __name__ == '__main__': + main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_cte_stage1.py b/releases/bridge-native-v3/code/scripts/test_bridge_cte_stage1.py new file mode 100644 index 0000000000000000000000000000000000000000..d421daf5480f10c47b5c2380e921e54d1d302772 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_cte_stage1.py @@ -0,0 +1,174 @@ +"""CPU regression tests; run with python -m unittest scripts.test_bridge_cte_stage1.""" +import unittest +import tempfile +from pathlib import Path + +import torch +import torch.distributed as dist +import torch.multiprocessing as mp +from torch.nn import functional as F +from torch.nn.parallel import DistributedDataParallel + +from cosmos_framework.model.zeva.causal_transition_encoder import CausalTransitionEncoder, CausalTransitionEncoderConfig +from scripts.bridge_cte_data import PairedEpisodeSampler, canonical_instruction, collate_episodes +from scripts.bridge_cte_loss import bridge_cte_loss, task_loss + + +def _distributed_task_worker(rank, store_path, queue): + torch.set_num_threads(2) + dist.init_process_group("gloo", init_method=f"file://{store_path}", rank=rank, world_size=2) + torch.manual_seed(17) + model = DistributedDataParallel(torch.nn.Linear(5, 3, bias=False)) + inputs = torch.randn(4, 3, 5, generator=torch.Generator().manual_seed(123)) + ids, episodes = torch.tensor([0, 1, 0, 1]), torch.arange(4) + section = slice(2 * rank, 2 * rank + 2) + output = F.normalize(model(inputs[section]), dim=-1) + loss, _, _ = task_loss(output, torch.ones(2, 3, dtype=torch.bool), ids[section], episodes[section]) + loss.backward() + queue.put((rank, model.module.weight.grad.tolist(), loss.item())) + dist.destroy_process_group() + + +class BridgeCTETests(unittest.TestCase): + @classmethod + def setUpClass(cls): + torch.set_num_threads(2) + + def model(self): + torch.manual_seed(42) + return CausalTransitionEncoder(CausalTransitionEncoderConfig( + action_dim=7, image_channels=48, hidden_dim=32, retrieval_dim=16, + phase_dim=16, effect_dim=16, num_layers=1, num_heads=4, effect_target_grid=(2, 2))) + + def test_unknowns_do_not_form_a_task(self): + z = torch.randn(4, 5, 16, requires_grad=True) + valid = torch.ones(4, 5, dtype=torch.bool) + loss, positive, known = task_loss(z, valid, torch.full((4,), -1), torch.arange(4)) + self.assertEqual(loss.item(), 0) + self.assertEqual(positive.item(), 0) + self.assertEqual(known.item(), 0) + loss.backward() + self.assertEqual(z.grad.abs().sum().item(), 0) + + def test_unknowns_are_not_negative_labels_either(self): + torch.manual_seed(9) + z = torch.randn(4, 5, 16, requires_grad=True) + valid = torch.ones(4, 5, dtype=torch.bool) + ids, episodes = torch.tensor([0, 0, 1, -1]), torch.arange(4) + loss, positives, _ = task_loss(z, valid, ids, episodes) + expected, _, _ = task_loss(z[:3], valid[:3], ids[:3], episodes[:3]) + torch.testing.assert_close(loss, expected) + self.assertEqual(positives.item(), 2) + loss.backward() + self.assertEqual(z.grad[3].abs().sum().item(), 0) + self.assertGreater(z.grad[:3].abs().sum().item(), 0) + + def test_repeated_same_episode_is_not_a_positive(self): + z = torch.randn(3, 5, 16, requires_grad=True) + loss, positives, _ = task_loss(z, torch.ones(3, 5, dtype=torch.bool), + torch.tensor([1, 1, 2]), torch.tensor([9, 9, 10])) + self.assertEqual(positives.item(), 0) + self.assertEqual(loss.item(), 0) + + def test_full_anchor_coverage_and_resume(self): + episodes = [dict(semantic_id=i // 3 if i < 21 else -1) for i in range(37)] + rank_batches = [list(PairedEpisodeSampler(episodes, 4, 2, rank, 42, epoch=3)) for rank in range(2)] + anchors = {index for batches in rank_batches for batch in batches for index in batch[::2]} + self.assertEqual(anchors, set(range(37))) + for rank in range(2): + resumed = list(PairedEpisodeSampler(episodes, 4, 2, rank, 42, epoch=3, start_batch=2)) + self.assertEqual(resumed, rank_batches[rank][2:]) + self.assertNotEqual(rank_batches[0], list(PairedEpisodeSampler(episodes, 4, 2, 0, 42, epoch=4))) + + def test_canonicalization_preserves_task_direction(self): + self.assertEqual(canonical_instruction(" Put cup. "), "put cup") + self.assertNotEqual(canonical_instruction("move left"), canonical_instruction("move right")) + self.assertEqual(canonical_instruction(" "), "") + + def test_collate_masks_full_trajectories(self): + samples = [dict(frames=torch.zeros(n, 3, 256, 256, dtype=torch.uint8), + actions=torch.ones(n-1, 4, 7), episode_id=i, semantic_id=-1) + for i, n in enumerate([1, 4, 10])] + batch = collate_episodes(samples) + self.assertEqual(batch["frames"].shape[0], 15) + self.assertEqual(batch["valid"].sum(1).tolist(), [1, 4, 10]) + self.assertEqual(batch["transition_valid"].all(-1).sum(1).tolist(), [0, 3, 9]) + self.assertEqual(batch["actions"][0].abs().sum().item(), 0) + + def test_future_frames_and_actions_do_not_change_past(self): + model = self.model().eval() + frames = torch.randn(2, 9, 48, 8, 8) + actions = torch.randn(2, 8, 4, 7) + with torch.no_grad(): + baseline = model(frames, actions) + altered_frames, altered_actions = frames.clone(), actions.clone() + altered_frames[:, 3:] += 10 + altered_actions[:, 2:] += 10 + altered = model(altered_frames, altered_actions) + for key in ("phase", "retrieval", "causal_interaction_state"): + torch.testing.assert_close(baseline[key][:, :3], altered[key][:, :3]) + changed = actions.clone() + changed[:, 0] += 10 + changed_output = model(frames, changed) + torch.testing.assert_close(baseline["phase"][:, 0], changed_output["phase"][:, 0]) + self.assertGreater((baseline["phase"][:, 1] - changed_output["phase"][:, 1]).abs().sum().item(), 0) + + def test_padding_does_not_change_real_prefix(self): + model = self.model().eval() + frames, actions = torch.randn(1, 5, 48, 8, 8), torch.randn(1, 4, 4, 7) + with torch.no_grad(): + baseline = model(frames, actions) + padded = model(torch.cat([frames, torch.randn(1, 4, 48, 8, 8)], 1), + torch.cat([actions, torch.randn(1, 4, 4, 7)], 1), + torch.tensor([[True]*5 + [False]*4]), + torch.tensor([[[True]*4]*4 + [[False]*4]*4])) + torch.testing.assert_close(baseline["phase"], padded["phase"][:, :5]) + self.assertEqual(padded["transition_complete"].sum().item(), 4) + self.assertEqual(padded["effect_complete"].sum().item(), 1) + + def test_backward_is_finite_and_ema_updates(self): + model = self.model() + frames, actions = torch.randn(4, 9, 48, 8, 8), torch.randn(4, 8, 4, 7) + valid = torch.ones(4, 9, dtype=torch.bool) + output = model(frames, actions, valid) + losses = bridge_cte_loss(output, actions, valid, torch.tensor([0, 0, 1, 1]), torch.arange(4)) + self.assertTrue(all(torch.isfinite(x) for x in losses.values())) + losses["total"].backward() + self.assertTrue(all(torch.isfinite(p.grad).all() for p in model.parameters() if p.grad is not None)) + for head in (model.retrieval_head, model.phase_head, model.effect_post_head, model.effect_pre_head): + self.assertGreater(sum(p.grad.abs().sum().item() for p in head.parameters()), 0) + target = next(model.target_visual_encoder.parameters()) + old = target.detach().clone() + torch.optim.AdamW(model.parameters(), lr=0.001).step() + model.update_ema_target() + self.assertIsNone(target.grad) + self.assertGreater((target-old).abs().sum().item(), 0) + + def test_short_unknown_episodes_have_no_fictitious_supervision(self): + model = self.model() + valid = torch.tensor([[True, False, False, False, False]] * 2) + actions = torch.zeros(2, 4, 4, 7) + output = model(torch.randn(2, 5, 48, 8, 8), actions, valid, + torch.zeros(2, 4, 4, dtype=torch.bool)) + loss = bridge_cte_loss(output, actions, valid, torch.tensor([-1, -1]), torch.arange(2)) + self.assertEqual(loss["total"].item(), 0) + loss["total"].backward() + + def test_distributed_task_gradient_matches_global_reference(self): + torch.manual_seed(17) + model = torch.nn.Linear(5, 3, bias=False) + inputs = torch.randn(4, 3, 5, generator=torch.Generator().manual_seed(123)) + loss, _, _ = task_loss(F.normalize(model(inputs), dim=-1), torch.ones(4, 3, dtype=torch.bool), + torch.tensor([0, 1, 0, 1]), torch.arange(4)) + loss.backward() + queue = mp.get_context("spawn").SimpleQueue() + with tempfile.TemporaryDirectory(prefix="bridge_cte_gloo_") as directory: + mp.spawn(_distributed_task_worker, args=(str(Path(directory) / "store"), queue), nprocs=2, join=True) + for _ in range(2): + _, gradient, actual_loss = queue.get() + torch.testing.assert_close(torch.tensor(gradient), model.weight.grad, atol=1e-5, rtol=1e-5) + self.assertAlmostEqual(actual_loss, loss.item(), places=5) + + +if __name__ == "__main__": + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_handoff.py b/releases/bridge-native-v3/code/scripts/test_bridge_handoff.py new file mode 100644 index 0000000000000000000000000000000000000000..d198889be7f00af6b3f7a81e751b0106985dc94d --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_handoff.py @@ -0,0 +1,106 @@ +"""Publication guard tests. No network calls or model training.""" +import json +from pathlib import Path +import tempfile +import unittest +from types import SimpleNamespace +from unittest.mock import patch + +import torch + +from scripts.bridge_handoff import ( + BASE_REPO, BASE_REVISION, canonical_sha, checked_path, check_publishable_text, + collect_code, safe_relative, sha256_file, tensor_manifest, verify_remote_files, write_json, +) + + +class HandoffTests(unittest.TestCase): + def test_artifact_paths_must_not_escape(self): + for bad in ("../x", "/tmp/x", "a/../x", "a//x", "./x", "a\\x", ""): + with self.subTest(path=bad), self.assertRaises(ValueError): + safe_relative(bad) + self.assertEqual(str(safe_relative("memory/static_bank_3000/static_bank.pt")), "memory/static_bank_3000/static_bank.pt") + + def test_symlink_is_rejected(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + (root / "outside").symlink_to("/etc") + with self.assertRaises(ValueError): + checked_path(root, "outside/passwd") + + def test_json_is_immutable_and_deterministic(self): + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "manifest.json" + value = dict(base=BASE_REPO, revision=BASE_REVISION) + write_json(path, value) + before = sha256_file(path) + with self.assertRaises(FileExistsError): + write_json(path, value) + self.assertEqual(sha256_file(path), before) + self.assertEqual(json.loads(path.read_text()), value) + self.assertEqual(canonical_sha(value), canonical_sha(dict(revision=BASE_REVISION, base=BASE_REPO))) + + def test_text_credentials_are_rejected_without_printing_values(self): + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "config.py" + path.write_text("token=" + "hf_" + "a" * 30) + with self.assertRaises(ValueError) as error: + check_publishable_text(path) + self.assertNotIn("a" * 30, str(error.exception)) + path.write_text("import os\ntoken = os.environ.get('HF_TOKEN')\n") + check_publishable_text(path) + + def test_tensor_hash_tracks_dtype_shape_and_values(self): + original = {"value": torch.arange(8, dtype=torch.bfloat16).reshape(2, 4)} + same = {"value": original["value"].clone()} + self.assertEqual(tensor_manifest(original), tensor_manifest(same)) + self.assertNotEqual(tensor_manifest(original), tensor_manifest({"value": original["value"].float()})) + self.assertNotEqual(tensor_manifest(original), tensor_manifest({"value": original["value"].reshape(4, 2)})) + same["value"][0, 0] = 99 + self.assertNotEqual(tensor_manifest(original), tensor_manifest(same)) + self.assertTrue(tensor_manifest({"scalar": torch.tensor(1)})) + + def test_source_inventory_excludes_artifacts_and_secrets(self): + # Works from an HF source snapshot without .git as well as a checkout. + files = ["scripts/bridge_handoff.py", "scripts/bridge_native_contract.py", + "configs/bridge_stage2_native_contract.json", ".env", + ".artifacts/secret.pt", "scripts/__pycache__/cached.py", "movie.mp4"] + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + for name in files: + path = root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("{}") + with patch("scripts.bridge_handoff.subprocess.check_output", return_value="\0".join(files).encode()): + names = collect_code(root) + self.assertEqual(set(names), set(files[:3])) + + def test_remote_missing_lfs_is_not_success(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + write_json(root / "handoff_manifest.json", {"files": {"weights.pt": {}}}) + with self.assertRaisesRegex(ValueError, "Published file is missing"): + verify_remote_files(root, SimpleNamespace(siblings=[])) + + def test_remote_git_and_lfs_hashes(self): + import hashlib + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + (root / "weights.pt").write_bytes(b"test weights") + write_json(root / "handoff_manifest.json", {"files": {"weights.pt": {}}}) + siblings = [] + for name in ("handoff_manifest.json", "weights.pt"): + value = (root / name).read_bytes() + siblings.append(SimpleNamespace( + rfilename="release/" + name, size=len(value), + lfs=SimpleNamespace(sha256=sha256_file(root / name)) if name.endswith(".pt") else None, + blob_id=hashlib.sha1(b"blob " + str(len(value)).encode() + b"\0" + value).hexdigest())) + info = SimpleNamespace(siblings=siblings) + self.assertEqual(verify_remote_files(root, info, prefix="release"), 2) + siblings[-1].lfs.sha256 = "bad" + with self.assertRaisesRegex(ValueError, "LFS hash differs"): + verify_remote_files(root, info, prefix="release") + + +if __name__ == "__main__": + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_native_contract.py b/releases/bridge-native-v3/code/scripts/test_bridge_native_contract.py new file mode 100644 index 0000000000000000000000000000000000000000..56be2b32fb13373257e67fbd46d401bec75bc2a7 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_native_contract.py @@ -0,0 +1,134 @@ +"""CPU-only native policy geometry, dimensions and normalization tests.""" +import unittest +from types import SimpleNamespace + +import numpy as np +import torch +from scipy.spatial.transform import Rotation + +from scripts.bridge_native_contract import ( + BridgeDimensions, controller_command, denormalize_policy_native10, + get_cte_gripper, get_policy_gripper, normalize_policy_native10, + pad_policy_action, policy_native_actions, proprio_native10, + raw_states_to_native_poses, resolve_model_action_dim, +) + + +class NativeContractTests(unittest.TestCase): + def setUp(self): + rng = np.random.default_rng(20260926) + self.states = rng.normal(0, .03, (33, 8)).astype(np.float32) + self.states[:, 2] += .2 + self.states[:, 6] = 0 + self.states[:, 7] = np.linspace(0, 1, 33) + self.gripper = (np.arange(32) >= 16).astype(np.float32) + + def test_exact_nvidia_label_builder(self): + from cosmos_framework.data.generator.action.datasets.bridge_orig_lerobot_dataset import BridgeOrigLeRobotDataset + reference = object.__new__(BridgeOrigLeRobotDataset) + reference._chunk_length = 32 + reference._pose_convention = "backward_framewise" + rows = [{"observation.state": state, "action": [0.] * 6 + [float(self.gripper[min(i, 31)])]} + for i, state in enumerate(self.states)] + expected, _ = reference._build_raw_action(rows, rows[:32]) + actual = policy_native_actions(self.states, self.gripper) + np.testing.assert_array_equal(actual, expected.numpy()) + self.assertEqual(actual.shape, (32, 10)) + + def test_pose_roundtrip(self): + from cosmos_framework.data.generator.action.pose_utils import pose_rel_to_abs + native = policy_native_actions(self.states, self.gripper) + expected = raw_states_to_native_poses(self.states) + actual = pose_rel_to_abs(native[:, :9], rotation_format="rot6d", pose_convention="backward_framewise", + initial_pose=expected[0]) + self.assertLess(float(np.max(np.abs(actual - expected))), 1e-6) + np.testing.assert_array_equal(native[:, 9], self.gripper) + + def test_normalizer_is_native_unclipped(self): + native = policy_native_actions(self.states, self.gripper) + normalized = normalize_policy_native10(native) + self.assertTrue(bool(np.any(np.abs(normalized) > 1))) + np.testing.assert_allclose(denormalize_policy_native10(normalized), native, atol=2e-7, rtol=1e-6) + np.testing.assert_array_equal(normalized[:, 9], 2 * self.gripper - 1) + with self.assertRaises(ValueError): + normalize_policy_native10(np.zeros((32, 7))) + + def test_proprio_is_absolute_and_measured(self): + state = self.states[9].copy() + state[7] = .31 + proprio = proprio_native10(state) + absolute = raw_states_to_native_poses(state[None])[0] + self.assertEqual(proprio.shape, (10,)) + np.testing.assert_array_equal(proprio[:3], absolute[:3, 3]) + self.assertAlmostEqual(float(proprio[9]), .31, places=6) + + def test_conflicting_gripper_indices(self): + action = torch.zeros(2, 32, 10) + action[..., 6] = -123 + action[..., 9] = 1 + self.assertTrue(bool(torch.all(get_policy_gripper(action) == 1))) + reached = torch.zeros(2, 4, 7) + reached[..., 6] = -1 + self.assertTrue(bool(torch.all(get_cte_gripper(reached) == -1))) + with self.assertRaises(ValueError): + get_policy_gripper(reached) + with self.assertRaises(ValueError): + get_cte_gripper(action) + + def test_width_is_runtime_verified_and_padding_differentiable(self): + net = SimpleNamespace(config=SimpleNamespace(action_dim=64), action_dim=64, + action2llm=SimpleNamespace(input_size=64), llm2action=SimpleNamespace(output_size=64)) + width = resolve_model_action_dim(net) + value = torch.randn(2, 32, 10, requires_grad=True) + padded, channels = pad_policy_action(value, width) + self.assertEqual(padded.shape, (2, 32, 64)) + self.assertEqual(int(channels.sum()), 10) + self.assertEqual(float(padded[..., 10:].detach().abs().sum()), 0) + padded.sum().backward() + self.assertTrue(bool(torch.all(value.grad == 1))) + net.action2llm.input_size = 7 + with self.assertRaises(ValueError): + resolve_model_action_dim(net) + with self.assertRaises(ValueError): + pad_policy_action(value[:, :16], width) + + def test_dimensions_and_adjacent_states_are_strict(self): + BridgeDimensions().validate() + with self.assertRaises(ValueError): + BridgeDimensions(policy_action_dim=7).validate() + with self.assertRaises(ValueError): + policy_native_actions(self.states, np.ones(33)) + with self.assertRaises(ValueError): + policy_native_actions(self.states[:, :7], self.gripper) + + def test_controller_handles_target_lag_and_tool_offset(self): + from cosmos_framework.data.generator.action.datasets import bridge_orig_lerobot_dataset as bridge + from cosmos_framework.data.generator.action.pose_utils import pose_abs_to_rel + rng = np.random.default_rng(41) + cv = np.eye(4) + cv[:3, :3] = bridge._BRIDGE_TO_OPENCV + flange = bridge._TCP_TO_FLANGE + for _ in range(64): + current, target, previous = (np.eye(4) for _ in range(3)) + current[:3, :3] = Rotation.from_rotvec(rng.normal(0, .5, 3)).as_matrix() + current[:3, 3] = rng.normal(0, .2, 3) + target[:] = current + target[:3, 3] += rng.normal(0, .01, 3) + target[:3, :3] = Rotation.from_rotvec(rng.normal(0, .03, 3)).as_matrix() @ current[:3, :3] + previous[:] = current + previous[:3, :3] = Rotation.from_rotvec(rng.normal(0, .03, 3)).as_matrix() @ current[:3, :3] + previous[:3, 3] += rng.normal(0, .01, 3) + native_poses = np.stack((current @ flange @ cv, target @ flange @ cv)) + motion = pose_abs_to_rel(native_poses, rotation_format="rot6d", pose_convention="backward_framewise")[0] + command = controller_command(np.r_[motion, 1.], current, previous) + pivot, delta = np.eye(4), np.eye(4) + pivot[:3, 3] = current[:3, 3] + delta[:3, 3] = command[:3] + delta[:3, :3] = Rotation.from_rotvec(command[3:6]).as_matrix() + reconstructed = pivot @ delta @ np.linalg.inv(pivot) @ previous + np.testing.assert_allclose(reconstructed, target, atol=1e-6, rtol=0) + self.assertEqual(command[6], 1.) + + +if __name__ == "__main__": + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_native_distributed.py b/releases/bridge-native-v3/code/scripts/test_bridge_native_distributed.py new file mode 100644 index 0000000000000000000000000000000000000000..6c9ccf431e3834b779e88c220b53c2fadedb09e9 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_native_distributed.py @@ -0,0 +1,63 @@ +"""Run with torchrun --standalone --nproc-per-node=2 -m scripts.test_bridge_native_distributed. + +Uses CPU/Gloo DTensors, never initializes CUDA. Exercises real sharded row +masking and per-rank checkpoint restore with the native optimizer. +""" +from pathlib import Path +import tempfile +from types import SimpleNamespace + +import torch +import torch.distributed as dist +from torch import nn +from torch.distributed.device_mesh import init_device_mesh +from torch.distributed.tensor import distribute_tensor, Shard + +from scripts.test_bridge_native_training import TinyNet +from scripts.native_stage2.optim import NativeAdamW +from scripts.native_stage2.checkpoint import save_checkpoint, restore_checkpoint, verify_roundtrip +from scripts.native_stage2.common import local, gather_objects, rank, barrier + + +def main(): + dist.init_process_group("gloo") + try: + torch.manual_seed(42) + mesh = init_device_mesh("cpu", (dist.get_world_size(),)) + net = TinyNet() + for name, p in list(net.named_parameters()): + module_name, _, attr = name.rpartition(".") + module = net.get_submodule(module_name) if module_name else net + setattr(module, attr, nn.Parameter(distribute_tensor(p.detach(), mesh, [Shard(0)]))) + opt = NativeAdamW(net) + opt.initialize_state() + for step in range(1, 51): + for p in net.parameters(): + p.grad = torch.ones_like(p) + opt.step_native(step) + opt.check_domains() + assert opt.update_report()["passed"] + memory = SimpleNamespace(head=nn.Linear(2, 2)) + directory = tempfile.TemporaryDirectory() if rank() == 0 else None + root = Path(gather_objects(directory.name if directory else None)[0]) + checkpoint = save_checkpoint(root, 50, opt, memory, 400, {"test": "cpu_shards"}, {}) + verify_roundtrip(checkpoint, opt, {"test": "cpu_shards"}) + saved = {n: local(p).clone() for n, p in net.named_parameters()} + with torch.no_grad(): + for p in net.parameters(): + local(p).zero_() + step, cursor, _ = restore_checkpoint(checkpoint, opt, memory, {"test": "cpu_shards"}) + assert (step, cursor) == (50, 400) + for name, p in net.named_parameters(): + assert torch.equal(local(p), saved[name]) + assert not torch.cuda.is_initialized() + barrier() + if directory: + directory.cleanup() + print("PASS: 2 CPU ranks, BF16 + FP32 masters, non-domain-7 exact, sharded save/restore, consumed cursor") + finally: + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_native_training.py b/releases/bridge-native-v3/code/scripts/test_bridge_native_training.py new file mode 100644 index 0000000000000000000000000000000000000000..85b85716d90b66f0b4dcf2007c3add68279c006f --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_native_training.py @@ -0,0 +1,203 @@ +"""CPU regression coverage for native labels, masks, domain updates and resume.""" +from __future__ import annotations + +import copy +from pathlib import Path +import tempfile +from types import SimpleNamespace as NS +import unittest +from unittest.mock import patch + +import numpy as np +import torch +from torch import nn + +from scripts.native_stage2.data import make_window, WindowStream, packed_sample +from scripts.native_stage2.evaluate import action_metrics, gate500 +from scripts.native_stage2.model import NativeWAM, native_config, parameter_group +from scripts.native_stage2.optim import NativeAdamW +from scripts.native_stage2.checkpoint import save_checkpoint, restore_checkpoint, verify_roundtrip +from scripts.native_stage2.base import map_key + + +def window(length=50, start=16): + rng = np.random.default_rng(812) + states = rng.normal(0, .02, (length, 8)).astype(np.float32) + states[:, 7] = .5 + actions = np.zeros((length, 7), np.float32) + actions[::2, 6] = 1 + frames = rng.integers(0, 256, (length, 256, 256, 3), dtype=np.uint8) + return make_window(states, actions, frames, start, "", 42) + + +class TinyNet(nn.Module): + def __init__(self): + super().__init__() + self.llm2vae = nn.Linear(2, 2, dtype=torch.bfloat16) + self.behavior_test = nn.Linear(2, 2, dtype=torch.bfloat16) + self.action2llm = nn.Module() + self.action2llm.fc = nn.Embedding(32, 4, dtype=torch.bfloat16) + self.action_modality_embed = nn.Parameter(torch.zeros(2, dtype=torch.bfloat16)) + + +class NativeTrainingTests(unittest.TestCase): + def test_short_tail_and_three_contracts(self): + sample = window(length=35, start=31) + self.assertEqual(tuple(sample["action"].shape), (32, 10)) + self.assertEqual(int(sample["native_action_valid"].sum()), 3) + self.assertEqual(int(sample["native_vision_valid"].sum()), 1) + self.assertEqual(tuple(sample["cte_actions"].shape), (7, 4, 7)) + self.assertEqual(tuple(sample["proprio"].shape), (10,)) + self.assertEqual(float(sample["action"][3:].abs().sum()), 0) + + def test_suffix_never_enters_prefix_features(self): + rng = np.random.default_rng(123) + states = rng.normal(0, .01, (50, 8)).astype(np.float32) + actions = np.zeros((50, 7), np.float32) + frames = np.zeros((50, 256, 256, 3), np.uint8) + before = make_window(states, actions, frames, 31, "x", 1) + states[32:] += 1 + frames[32:] = 255 + actions[32:, 6] = 1 + after = make_window(states, actions, frames, 31, "x", 1) + for key in ("cte_actions", "cte_frames", "proprio"): + torch.testing.assert_close(before[key], after[key], atol=0, rtol=0) + np.testing.assert_array_equal(before["initial_image"], after["initial_image"]) + for index in (15, 16, 31, 32): + item = make_window(states, actions, frames, index, "x", 1) + self.assertEqual(item["cte_actions"].shape[0] // 4, index // 16) + + def test_sampler_restores_consumed_cursor(self): + metadata = {1: {"length": 49}, 2: {"length": 66}} + stream = WindowStream(metadata, [1, 2], 20260926, 2) + expected = [stream.sample(i, 1) for i in range(80)] + resumed = WindowStream(metadata, [1, 2], 20260926, 2) + self.assertEqual(expected[24:], [resumed.sample(i, 1) for i in range(24, 80)]) + self.assertTrue(all(expected[i][1] >= 16 for i in range(1, 80, 2))) + continuous = WindowStream(metadata, [1, 2], 1, 1, pilot=False) + seen = [continuous.sample(i, 0) for i in range(113)] + self.assertEqual(len(set(seen)), 113) + + def test_pack_wam_and_normalize_once(self): + from cosmos_framework.data.generator.action.transforms import ActionTransformPipeline + sample = window() + transform = ActionTransformPipeline(max_action_dim=64, append_viewpoint_info=False, + append_duration_fps_timestamps=False, append_resolution_info=False) + batch = packed_sample(sample, transform) + torch.testing.assert_close(batch["action"][0][0][:, :10], sample["action"], rtol=0, atol=0) + self.assertEqual(float(batch["action"][0][0][:, 10:].abs().sum()), 0) + self.assertEqual(batch["sequence_plan"][0].condition_frame_indexes_vision, [0]) + self.assertEqual(batch["sequence_plan"][0].condition_frame_indexes_action, []) + + def test_masked_action_and_video_loss_and_pbd(self): + from cosmos_framework.model.zeva import gaussian_prior_nll + model = object.__new__(NativeWAM) + nn.Module.__init__(model) + model.tensor_kwargs_fp32 = dict(device="cpu", dtype=torch.float32) + model.native_masks = dict(action=[torch.arange(32) < 3], vision=[torch.arange(9) < 3]) + rf = NS(train_time_weight=lambda t, kw: torch.ones_like(t)) + action = torch.zeros(32, 64, requires_grad=True) + target = torch.ones(32, 64) + kwargs = dict(pred=[action], target=[target], condition_mask=[torch.zeros(32, 1)], timesteps=torch.ones(1, 1), + has_valid_tokens=True, rectified_flow=rf, raw_action_dim=[10], sample_weights=None) + first, _ = model._compute_flow_matching_loss(**kwargs) + target[3:] = 1000 + target[:, 10:] = 1000 + second, _ = model._compute_flow_matching_loss(**kwargs) + self.assertEqual(float(first.detach()), float(second.detach())) + second.backward() + self.assertEqual(float(action.grad[3:].abs().sum()), 0) + self.assertEqual(float(action.grad[:, 10:].abs().sum()), 0) + self.assertGreater(float(action.grad[:3, :10].abs().sum()), 0) + vision = torch.zeros(48, 9, 2, 2, requires_grad=True) + condition = torch.zeros(9, 1, 1) + condition[0] = 1 + loss, _ = model._compute_flow_matching_loss(pred=[vision], target=[torch.ones_like(vision)], + condition_mask=[condition], timesteps=torch.ones(1, 1), has_valid_tokens=True, rectified_flow=rf) + loss.backward() + self.assertGreater(float(vision.grad[:, 1:3].abs().sum()), 0) + self.assertEqual(float(vision.grad[:, 3:].abs().sum()), 0) + mean, std = torch.zeros(1, 32, 10, requires_grad=True), torch.ones(1, 32, 10) + prior_target = torch.ones_like(mean) + valid = model.native_masks["action"][0][None] + one = gaussian_prior_nll(prior_target, mean, std, valid) + prior_target[:, 3:] = -999 + two = gaussian_prior_nll(prior_target, mean, std, valid) + torch.testing.assert_close(one, two, rtol=0, atol=0) + + def test_real_bf16_updates_non7_exact_and_atomic_resume(self): + torch.manual_seed(9) + net = TinyNet() + opt = NativeAdamW(net) + opt.initialize_state() + before = net.action2llm.fc.weight.detach().clone() + for step in range(1, 51): + for p in net.parameters(): + p.grad = torch.ones_like(p) + opt.step_native(step) + opt.check_domains() + self.assertFalse(torch.equal(before[7], net.action2llm.fc.weight[7])) + self.assertTrue(torch.equal(before[:7], net.action2llm.fc.weight[:7])) + memory = NS(head=nn.Linear(2, 2)) + identity = {"base": "pinned-original", "test": 1} + with tempfile.TemporaryDirectory() as directory: + path = save_checkpoint(directory, 50, opt, memory, 400, identity, {"phase": "pilot"}) + self.assertTrue(verify_roundtrip(path, opt, identity)["optimizer_exact"]) + expected = {n: p.clone() for n, p in net.named_parameters()} + torch_expected = torch.rand(3) + for p in net.parameters(): + p.data.zero_() + step, cursor, progress = restore_checkpoint(path, opt, memory, identity) + self.assertEqual((step, cursor, progress["phase"]), (50, 400, "pilot")) + torch.testing.assert_close(torch.rand(3), torch_expected, rtol=0, atol=0) + for name, p in net.named_parameters(): + torch.testing.assert_close(p, expected[name], rtol=0, atol=0) + with self.assertRaises(FileExistsError): + save_checkpoint(directory, 50, opt, memory, 400, identity, {}) + manifest = path / "manifest.json" + manifest.unlink() + with self.assertRaises(FileNotFoundError): + restore_checkpoint(path, opt, memory, identity) + + def test_config_and_trainable_classification(self): + cfg = native_config(Path('/base'), Path('/vae'), 2) + self.assertEqual(cfg.max_action_dim, 64) + self.assertEqual(cfg.behavior_stage2.action_dim, 10) + self.assertTrue(cfg.vision_gen) + self.assertFalse(cfg.diffusion_expert_config.load_weights_from_pretrained) + self.assertEqual(parameter_group('language_model.model.layers.0.self_attn.k_norm_und_for_gen.weight'), 'generation') + self.assertIsNone(parameter_group('language_model.model.layers.0.self_attn.q_proj.weight')) + self.assertEqual(map_key('transformer.action_proj_in.fc.weight'), 'action2llm.fc.weight') + + def test_padding_is_zeroed_before_generation_without_clean_conditioning(self): + from cosmos_framework.model.generator.omni_mot_model import OmniMoTModel + model = object.__new__(NativeWAM) + nn.Module.__init__(model) + model.native_masks = dict(action=[torch.arange(32) < 3], vision=[torch.arange(9) < 3]) + packed = NS(action=NS(tokens=[torch.ones(32, 64)], condition_mask=[torch.zeros(32, 1)]), + vision=NS(tokens=[torch.ones(48, 9, 2, 2)])) + with patch.object(OmniMoTModel, 'denoise', return_value={'preds_action': [torch.ones(32, 64)]}): + result = model.denoise(data_batch_packed=packed) + self.assertEqual(float(packed.action.tokens[0][3:].abs().sum()), 0) + self.assertEqual(float(packed.action.tokens[0][:, 10:].abs().sum()), 0) + self.assertEqual(float(packed.vision.tokens[0][:, 3:].abs().sum()), 0) + self.assertEqual(float(packed.action.condition_mask[0].sum()), 0) + self.assertEqual(float(result['preds_action'][0][:, 10:].abs().sum()), 0) + + def test_gripper_index_and_gate_failures(self): + sample = window() + metrics = action_metrics(sample['action'].numpy(), sample) + self.assertLess(max(metrics['normalized_error']), 1e-6) + self.assertEqual(metrics['gripper']['open_close']['correct'], metrics['gripper']['open_close']['count']) + summary = {split: dict(action_error=1., sampled_error=1., gripper={k: dict(accuracy=.8, count=4) + for k in ('open_close', 'close_open')}) for split in ('train', 'development')} + base = dict(summary=summary, records=[]) + current = copy.deepcopy(base) + current['summary']['train']['action_error'] = .89 + self.assertTrue(gate500(base, current, True)['passed']) + current['summary']['development']['gripper']['close_open']['accuracy'] = .7 + self.assertFalse(gate500(base, current, True)['passed']) + + +if __name__ == '__main__': + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_recovery_v2.py b/releases/bridge-native-v3/code/scripts/test_bridge_recovery_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..040aa377d0b698716ba66aa7145fc2082189914e --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_recovery_v2.py @@ -0,0 +1,123 @@ +"""CPU contract tests; no policy weights, simulator or gradient training.""" +from __future__ import annotations + +import json +import unittest +from pathlib import Path +from types import SimpleNamespace + +import numpy as np +import torch + +from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import normalize_actions +from cosmos_framework.scripts.action_policy_server_robocasa365_zeva import RobolabPolicyService +from scripts.bridge_recovery_contract import ( + CTE_PREPROCESS_ID, bridge_feature_source, cte_identity, cte_pixels, encode_cte_single_frame, + legacy_normalizer, normalize_reached_delta, reached_delta_raw, require_matching_stage2, +) +from scripts.widowx_policy_server import WidowXService +from scripts.widowx_rollout import CausalHistory + + +def tearDownModule(): + # Upstream inference-server import globally disables autograd. Restore the + # test runner so Stage-1 backward tests remain independent in one process. + torch.set_grad_enabled(True) + + +class RecordingEncoder(torch.nn.Module): + def __init__(self): + super().__init__() + self.anchor = torch.nn.Parameter(torch.zeros(()), requires_grad=False) + self.seen = [] + + def encode(self, value): + self.seen.append((tuple(value.shape), value.dtype, float(value.min()), float(value.max()))) + return value.new_zeros((1, 48, 1, value.shape[-2] // 16, value.shape[-1] // 16)) + + +class RecoveryContractTests(unittest.TestCase): + def test_legacy_normalizer_matches_existing_training_transform(self): + spec = legacy_normalizer() + self.assertFalse(spec['fitted_on_current_train_split']) + rng = np.random.default_rng(198) + raw = np.column_stack((rng.normal(0, .07, (128, 6)), rng.integers(0, 2, 128))).astype(np.float32) + np.testing.assert_array_equal(normalize_reached_delta(raw), normalize_actions(raw)) + + def test_commands_are_not_written_to_history_and_effect_is_complete_only_at_16(self): + frame = np.zeros((256, 256, 3), np.uint8) + history = CausalHistory(frame) + command = np.array([.09, -.06, .04, 0, 0, 0, 1], np.float32) + before = np.zeros(6, np.float32) + after = np.array([.001, -.002, .003, .004, -.005, .006], np.float32) + for step in range(1, 17): + reached = reached_delta_raw(before, after, command[6]) + history.append_reached_delta(reached, frame) + request = history.request(frame) + self.assertEqual(request['cte_preprocess_id'], CTE_PREPROCESS_ID) + self.assertEqual(int(request['cte_transition_valid'].sum()), 4 * (step // 4)) + self.assertEqual(request['cte_pending_control_steps'], step % 4) + self.assertEqual(len(request['cte_boundary_images']), 1 + step // 4) + if step == 16: + self.assertEqual(len(request['cte_transition_actions']), 4) + self.assertFalse(np.allclose(request['cte_transition_actions'][0, 0, :6], + normalize_reached_delta(command)[:6])) + np.testing.assert_allclose(request['cte_transition_actions'][0, 0], + normalize_reached_delta(reached), atol=0, rtol=0) + + def test_cte_image_branch_does_not_replace_static_retrieval_or_policy(self): + recording = RecordingEncoder() + service = object.__new__(WidowXService) + service.model = recording + service._cte = SimpleNamespace(cfg=SimpleNamespace(image_channels=48)) + image = np.arange(256 * 256 * 3, dtype=np.uint32).reshape(256, 256, 3).astype(np.uint8) + bridge = service._encode_bridge_cte_frame(image) + static = RobolabPolicyService._encode_cte_frame(service, image) + self.assertEqual(tuple(bridge.shape), (48, 16, 16)) + self.assertEqual(tuple(static.shape), (48, 30, 52)) + self.assertEqual(recording.seen[0][0], (1, 3, 1, 256, 256)) + self.assertEqual(recording.seen[0][1], torch.bfloat16) + self.assertEqual(recording.seen[1][0], (1, 3, 1, 480, 832)) + self.assertEqual(recording.seen[1][1], torch.float32) + self.assertIs(WidowXService._encode_cte_frame, RobolabPolicyService._encode_cte_frame) + with self.assertRaisesRegex(ValueError, 'raw RGB uint8'): + cte_pixels(np.zeros((480, 832, 3), np.uint8), 'cpu') + + def test_offline_and_online_pixel_ops_match_exactly(self): + rng = np.random.default_rng(20) + image = rng.integers(0, 256, (256, 256, 3), dtype=np.uint8) + offline = torch.from_numpy(image).permute(2, 0, 1).unsqueeze(0).to(torch.bfloat16).div(127.5).sub(1) + torch.testing.assert_close(cte_pixels(image, 'cpu'), offline, atol=0, rtol=0) + + class IdentityShape: + def __call__(self, pixels): + self.pixels = pixels.clone() + return pixels.new_zeros((1, 48, 1, 16, 16)) + + encoder = IdentityShape() + encode_cte_single_frame(encoder, image, 'cpu') + torch.testing.assert_close(encoder.pixels[:, :, 0], offline, atol=0, rtol=0) + + def test_mismatched_stage2_binding_is_rejected(self): + checkpoint = Path('.artifacts/bridge_cte_stage1_20260924/checkpoints/cte_step_000020000.pt') + payload = torch.load(checkpoint, map_location='cpu', weights_only=False) + identity = cte_identity(payload, checkpoint, checkpoint.parent.parent / 'split.json') + matched = {key: identity[key] for key in ( + 'cte_checkpoint_sha256', 'normalizer_sha256', 'cte_preprocess_id', + 'policy_preprocess_id', 'static_retrieval_preprocess_id', 'action_contract_id', + 'split_sha256', 'vae_sha256')} + require_matching_stage2(matched, identity) + matched['cte_checkpoint_sha256'] = 'old_robocasa_cte' + with self.assertRaisesRegex(ValueError, 'does not match'): + require_matching_stage2(matched, identity) + future_source = bridge_feature_source(identity) + old_source = json.loads(Path('.artifacts/ipec_full_v2/features/manifest.json').read_text()) + self.assertNotEqual(future_source['fingerprint'], old_source['fingerprint']) + self.assertFalse(future_source['materialized_cache']) + changed = dict(payload, contract_fingerprint='incorrect') + with self.assertRaisesRegex(ValueError, 'fingerprint'): + cte_identity(changed, checkpoint, checkpoint.parent.parent / 'split.json') + + +if __name__ == '__main__': + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_stage2_pilot.py b/releases/bridge-native-v3/code/scripts/test_bridge_stage2_pilot.py new file mode 100644 index 0000000000000000000000000000000000000000..fcf81cb80582f51ccae74f9c5fbfbfe5cc542599 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_stage2_pilot.py @@ -0,0 +1,122 @@ +"""Real small-bundle integrity and temporal availability tests (CPU only).""" +import json +from pathlib import Path +import unittest +import tempfile + +import torch + +from scripts.bridge_stage2_data import BridgePilotDataset, read_bundle +from scripts.bridge_recovery_contract import sha256_file + + +class BridgePilotTests(unittest.TestCase): + @staticmethod + def gate_fixture(path): + path.mkdir(exist_ok=True) + (path / 'checkpoints').mkdir() + (path / 'engineering_50.json').write_text(json.dumps(dict(passed=True, step=50, bit_nonempty_fraction=.8))) + (path / 'checkpoints/step_000000050.verified.json').write_text(json.dumps(dict(exact_model_roundtrip=True))) + for partition in ('train', 'development'): + for task in range(2): + for rank in range(2): + for tag, step, loss in (('start', 0, .1), ('end', 50, .09)): + (path / f'probe_{partition}_task{task}_{tag}_{step}_rank{rank}.json').write_text( + json.dumps(dict(action_loss=loss, x0_mae=[.1]*7))) + + def test_500_step_gate_accepts_only_complete_finite_probes(self): + from scripts.follow_bridge_stage2_pilot import check_smoke + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + self.gate_fixture(root) + self.assertEqual(len(check_smoke(root)), 8) + (root / 'probe_train_task0_end_50_rank0.json').unlink() + with self.assertRaisesRegex(ValueError, 'eight fixed'): + check_smoke(root) + + def test_500_step_gate_stops_regression_and_empty_bit(self): + from scripts.follow_bridge_stage2_pilot import check_smoke + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + self.gate_fixture(root) + (root / 'probe_train_task0_end_50_rank0.json').write_text(json.dumps(dict(action_loss=1., x0_mae=[.1]*7))) + with self.assertRaisesRegex(ValueError, 'regression'): + check_smoke(root) + (root / 'engineering_50.json').write_text(json.dumps(dict(passed=True, step=50, bit_nonempty_fraction=.1))) + with self.assertRaisesRegex(ValueError, 'real BIT'): + check_smoke(root) + + def test_disjoint_support_and_causal_availability(self): + bundle = Path('.artifacts/bridge_stage2_pilot_v2') + manifest = read_bundle(bundle) + groups = manifest['contract']['episode_ids'] + bank = torch.load(bundle / 'static_bank.pt', weights_only=True) + self.assertEqual(len(groups['train']), 32) + self.assertEqual(set(bank['support_episode_ids']), set(groups['support'])) + checked = 0 + for partition in ('train', 'development'): + for episode in groups[partition]: + cache = torch.load(bundle / 'features' / partition / f'episode_{episode:06d}.pt', weights_only=True) + self.assertNotIn(episode, cache['global_source_episode_ids']) + self.assertTrue(set(cache['global_source_episode_ids']) <= set(groups['support'])) + for i,start in enumerate(cache['starts']): + mask = cache['behavior_effect_valid'][i] + self.assertEqual(int(mask.sum()), min(4, int(start)//16)) + self.assertTrue(bool((cache['effect_end_indices'][i][mask] <= start).all())) + torch.testing.assert_close(cache['behavior_global'][i], cache['behavior_global'][0], atol=0, rtol=0) + checked += 1 + self.assertEqual(checked, 40) + + def test_real_training_windows_have_nonempty_bit_and_real_tail_masks(self): + dataset = BridgePilotDataset('.artifacts/bridge_stage2_pilot_v2') + nonempty = 0 + for i in range(len(dataset)): + sample = dataset[i] + episode,start = map(int, sample['widowx_episode_start']) + self.assertTrue(bool(sample['widowx_action_valid'].any())) + nonempty += bool(sample['behavior_effect_valid'].any()) + self.assertEqual(bool(sample['behavior_effect_valid'].any()), start >= 16) + self.assertTrue(torch.isfinite(sample['behavior_global']).all()) + self.assertGreaterEqual(nonempty / len(dataset), .75) + + def test_fixed_probes_cover_two_tasks_and_nonempty_bit_with_switches(self): + directory = Path('.artifacts/bridge_stage2_pilot_v2/probes_v1') + manifest = json.loads((directory / 'manifest.json').read_text()) + self.assertEqual(len(manifest['records']), 8) + for record in manifest['records']: + path = directory / record['file'] + self.assertEqual(sha256_file(path), record['sha256']) + sample = torch.load(path, weights_only=False) + self.assertTrue(bool(sample['behavior_effect_valid'][0].any())) + self.assertGreater(record['gripper_switches'], 0) + self.assertEqual(tuple(sample['action'][0][0].shape), (32, 64)) + self.assertEqual(tuple(sample['behavior_effect'][0].shape), (1, 4, 128)) + self.assertEqual(tuple(sample['behavior_global'][0].shape), (1, 256)) + self.assertGreater(sample['text_token_ids'][0][0].numel(), 0) + + def test_real_new_features_reach_memory_receivers_and_mask_invalid_effects(self): + from cosmos_framework.model.zeva.policy_injection import PolicyInjectionConfig, PolicyInjectionPrior + torch.set_num_threads(2) + with torch.random.fork_rng(devices=[]), torch.enable_grad(): + torch.manual_seed(9) + model = PolicyInjectionPrior(PolicyInjectionConfig(action_dim=7)) + model.init_weights() + sample = BridgePilotDataset('.artifacts/bridge_stage2_pilot_v2')[1] + inputs = [sample[key].unsqueeze(0).clone().requires_grad_() for key in + ('behavior_global', 'behavior_phase', 'behavior_effect')] + valid = sample['behavior_effect_valid'].unsqueeze(0) + mean, std = model(*inputs, valid) + (mean.square().mean()+std.square().mean()).backward() + for value in inputs: + self.assertGreater(float(value.grad.abs().sum()), 0) + self.assertEqual(float(inputs[-1].grad[~valid].abs().sum()), 0) + changed = inputs[-1].detach().clone() + changed[~valid] = 1e5 + with torch.no_grad(): + changed_mean, changed_std = model(inputs[0], inputs[1], changed, valid) + torch.testing.assert_close(mean, changed_mean, atol=0, rtol=0) + torch.testing.assert_close(std, changed_std, atol=0, rtol=0) + + +if __name__ == '__main__': + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_bridge_static_bank.py b/releases/bridge-native-v3/code/scripts/test_bridge_static_bank.py new file mode 100644 index 0000000000000000000000000000000000000000..bf3df0ffa995f8dc42d9008967af2b6f7ff1545f --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_bridge_static_bank.py @@ -0,0 +1,62 @@ +"""CPU unit tests for support selection and per-trajectory temporal pooling.""" +import unittest +from pathlib import Path +import tempfile + +import torch + +from scripts.build_bridge_static_bank import choose_support, immutable_json, pool_trajectory + + +class StaticBankTests(unittest.TestCase): + def test_immutable_json_roundtrip_tuples_and_reject_changed_content(self): + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / 'contract.json' + immutable_json(path, dict(grid=(4, 6))) + immutable_json(path, dict(grid=(4, 6))) + with self.assertRaises(ValueError): + immutable_json(path, dict(grid=(5, 6))) + + def test_selection_is_unique_reproducible_and_excludes_query(self): + episodes = [dict(episode_index=i, length=20, tasks=['put carrot on plate']) for i in range(20)] + first, eligible = choose_support(episodes, {1, 2, 3}, 10, 27) + second, _ = choose_support(episodes, {1, 2, 3}, 10, 27) + self.assertEqual(first, second) + ids = [e['episode_index'] for e in first] + self.assertEqual(len(set(ids)), 10) + self.assertFalse(set(ids) & {1, 2, 3}) + self.assertEqual(eligible, 17) + + def test_empty_ambiguous_and_incomplete_episodes_are_ineligible(self): + episodes = [dict(episode_index=0, length=17, tasks=[' do thing. ']), + dict(episode_index=1, length=17, tasks=[' . ']), + dict(episode_index=2, length=16, tasks=['do thing']), + dict(episode_index=3, length=17, tasks=['a', 'b'])] + chosen, eligible = choose_support(episodes, set(), 1, 0) + self.assertEqual(eligible, 1) + self.assertEqual(chosen[0]['episode_index'], 0) + with self.assertRaises(ValueError): + choose_support(episodes, set(), 2, 0) + + def test_pooling_ignores_padding_and_does_not_merge_trajectories(self): + retrieval = torch.zeros(3, 128) + retrieval[0, 0], retrieval[1, 1] = 1, 1 + retrieval[2] = float('nan') + state = torch.stack([torch.ones(256), torch.full((256,), 3.), torch.full((256,), float('nan'))]) + key, value = pool_trajectory(retrieval, state, torch.tensor([True, True, False])) + torch.testing.assert_close(key.norm(), torch.tensor(1.)) + torch.testing.assert_close(key[:2], torch.full((2,), 2**-.5)) + torch.testing.assert_close(value, torch.full((256,), 2.)) + other_key, other_value = pool_trajectory(retrieval[:1], state[:1], torch.tensor([True])) + self.assertFalse(torch.equal(key, other_key)) + self.assertFalse(torch.equal(value, other_value)) + + def test_invalid_pool_rejected(self): + with self.assertRaises(ValueError): + pool_trajectory(torch.zeros(1, 128), torch.zeros(1, 256), torch.tensor([False])) + with self.assertRaises(ValueError): + pool_trajectory(torch.zeros(1, 128), torch.zeros(1, 256), torch.tensor([True])) + + +if __name__ == '__main__': + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_fp32_master_adamw.py b/releases/bridge-native-v3/code/scripts/test_fp32_master_adamw.py new file mode 100644 index 0000000000000000000000000000000000000000..dd477be9a1bd8f315a1fa9dc4ea2880569a568c0 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_fp32_master_adamw.py @@ -0,0 +1,81 @@ +"""CPU regression tests; no model downloads or production artifacts required.""" +import copy +import unittest + +import torch +from scripts.fp32_master_adamw import FP32MasterAdamW + + +class MasterAdamWTest(unittest.TestCase): + def test_checkpoint_loaded_after_optimizer_creation(self): + p = torch.nn.Parameter(torch.ones(3, dtype=torch.bfloat16)) + opt = FP32MasterAdamW([p], lr=1e-5, weight_decay=0.) + self.assertFalse(opt.state) + with torch.no_grad(): + p.fill_(5.) # Trainer loads base weights here. + p.grad = torch.zeros_like(p) + opt.step() + torch.testing.assert_close(p, torch.full_like(p, 5.)) + + def test_matches_fp32_torch_adamw(self): + for amsgrad in (False, True): + p = torch.nn.Parameter(torch.linspace(-1, 1, 17).to(torch.bfloat16)) + ref = torch.nn.Parameter(p.detach().float().clone()) + opt = FP32MasterAdamW([p], lr=1e-4, betas=(0.9, .99), weight_decay=.05, amsgrad=amsgrad) + expected = torch.optim.AdamW([ref], lr=1e-4, betas=(.9, .99), weight_decay=.05, amsgrad=amsgrad, foreach=False) + for step in range(20): + grad = torch.sin(torch.arange(17) + step).to(torch.bfloat16) + p.grad, ref.grad = grad.clone(), grad.float() + opt.step(); expected.step() + torch.testing.assert_close(opt.state[p]["master_param"], ref, rtol=1e-6, atol=1e-7) + torch.testing.assert_close(p, ref.to(torch.bfloat16)) + + def test_resume_preserves_sub_bf16_master_and_next_update(self): + p = torch.nn.Parameter(torch.ones(3, dtype=torch.bfloat16)) + opt = FP32MasterAdamW([p], lr=1e-4, weight_decay=0.) + p.grad = torch.ones_like(p); opt.step() + state = copy.deepcopy(opt.state_dict()) + self.assertFalse(torch.equal(opt.state[p]["master_param"], p.float())) + q = torch.nn.Parameter(torch.full_like(p, 7.)) + resumed = FP32MasterAdamW([q], lr=1e-4, weight_decay=0.) + resumed.load_state_dict(state) + for key in ("master_param", "exp_avg", "exp_avg_sq"): + self.assertEqual(resumed.state[q][key].dtype, torch.float32) + torch.testing.assert_close(resumed.state[q][key], opt.state[p][key], rtol=0, atol=0) + for step in range(10): + p.grad = q.grad = torch.full_like(p, step + .5) + opt.step(); resumed.step() + torch.testing.assert_close(p, q, rtol=0, atol=0) + torch.testing.assert_close(opt.state[p]["master_param"], resumed.state[q]["master_param"], rtol=0, atol=0) + + def test_no_grad_is_untouched(self): + p = torch.nn.Parameter(torch.ones(3, dtype=torch.bfloat16)) + opt = FP32MasterAdamW([p], lr=1e-2) + with torch.no_grad(): p.fill_(9.) + opt.step() + self.assertFalse(opt.state) + torch.testing.assert_close(p, torch.full_like(p, 9.)) + + def test_reject_legacy_state(self): + p = torch.nn.Parameter(torch.ones(3, dtype=torch.bfloat16)) + opt = FP32MasterAdamW([p]); opt.initialize_state() + state = copy.deepcopy(opt.state_dict()) + state["state"][0].pop("master_param") + with self.assertRaisesRegex(ValueError, "lacks FP32 masters"): + opt.load_state_dict(state) + + def test_dcp_save_does_not_modify_state(self): + from torch.distributed.checkpoint.state_dict import get_optimizer_state_dict + model = torch.nn.Linear(2, 2, bias=False).to(torch.bfloat16) + p = model.weight + opt = FP32MasterAdamW(model.parameters()); opt.initialize_state() + before = copy.deepcopy(opt.state_dict()) + for _ in range(2): + state = get_optimizer_state_dict(model, opt) + self.assertIn("master_param", state["state"]["weight"]) + torch.testing.assert_close(opt.state[p]["step"], before["state"][0]["step"], rtol=0, atol=0) + torch.testing.assert_close(opt.state[p]["master_param"], before["state"][0]["master_param"], rtol=0, atol=0) + + +if __name__ == "__main__": + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_wandb_fallback.py b/releases/bridge-native-v3/code/scripts/test_wandb_fallback.py new file mode 100644 index 0000000000000000000000000000000000000000..7285c0aedc5ba83c5a17020da6b09dda2f6f036e --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_wandb_fallback.py @@ -0,0 +1,62 @@ +"""CPU-only regression tests for W&B fallback with Cosmos's frozen config.""" +import unittest +from unittest.mock import Mock, patch + +import wandb +from cosmos_framework.utils.config import Config, JobConfig + +from scripts.train_widowx_zeva import with_wandb_offline_fallback + + +def frozen_config(mode='online'): + config = Config( + model={}, optimizer={}, scheduler={}, dataloader_train=None, + dataloader_val=None, + job=JobConfig(project='Zeva', group='widowx', name='ipec_personal', + wandb_mode=mode), + ) + config.freeze() + return config + + +class WandbFallbackTest(unittest.TestCase): + def test_online_success_does_not_retry(self): + initialize = Mock(return_value='online') + config = frozen_config() + self.assertEqual(with_wandb_offline_fallback(initialize)(config, None), 'online') + initialize.assert_called_once_with(config, None) + + def test_retry_preserves_identity_and_frozen_config(self): + initialize = Mock(side_effect=[wandb.errors.CommError('network failure'), 'offline']) + config = frozen_config() + with patch('wandb.teardown') as teardown: + self.assertEqual(with_wandb_offline_fallback(initialize)(config, None), 'offline') + teardown.assert_called_once_with() + retry = initialize.call_args.args[0] + self.assertEqual(retry.job.wandb_mode, 'offline') + self.assertEqual(retry.job.path_local, config.job.path_local) + self.assertIs(retry.checkpoint, config.checkpoint) + self.assertEqual(config.job.wandb_mode, 'online') + self.assertTrue(config._is_frozen and config.job._is_frozen) + + def test_offline_failure_is_not_retried(self): + initialize = Mock(side_effect=wandb.errors.CommError('offline failure')) + with self.assertRaises(wandb.errors.CommError): + with_wandb_offline_fallback(initialize)(frozen_config('offline'), None) + self.assertEqual(initialize.call_count, 1) + + def test_unrelated_error_is_not_hidden(self): + initialize = Mock(side_effect=RuntimeError('training failure')) + with self.assertRaises(RuntimeError): + with_wandb_offline_fallback(initialize)(frozen_config(), None) + self.assertEqual(initialize.call_count, 1) + + def test_failed_retry_propagates(self): + initialize = Mock(side_effect=wandb.errors.CommError('unavailable')) + with self.assertRaises(wandb.errors.CommError): + with_wandb_offline_fallback(initialize)(frozen_config(), None) + self.assertEqual(initialize.call_count, 2) + + +if __name__ == '__main__': + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_widowx_execution.py b/releases/bridge-native-v3/code/scripts/test_widowx_execution.py new file mode 100644 index 0000000000000000000000000000000000000000..1ae087695614fca39eb09ae83990bf1f3778fed7 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_widowx_execution.py @@ -0,0 +1,136 @@ +"""Exercise the real rollout loop on a CPU-only fake env/policy transport. + +Run with the SimplerEnv Python; no renderer, GPU, or policy model is created. +""" +import asyncio +import json +from pathlib import Path +import sys +import tempfile +from types import SimpleNamespace +import unittest +from unittest.mock import patch + +import msgpack +import numpy as np + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import eval_widowx_simpler as rollout + + +class FakeEnvironment: + def __init__(self): + self.unwrapped = self + self._max_episode_steps = 80 + self.actions = [] + self.closed = False + + def reset(self, seed): + self.seed = seed + return {}, {} + + def get_language_instruction(self): + return 'put carrot on plate' + + def step(self, command): + self.actions.append(command.copy()) + return {}, 0.0, False, len(self.actions) >= self._max_episode_steps, {'success': False} + + def close(self): + self.closed = True + + +class FakeTransport: + def __init__(self, memory_mode='bank_off'): + self.memory_mode = memory_mode + self.requests = [] + self.metadata_sent = False + + async def __aenter__(self): + return self + + async def __aexit__(self, *args): + pass + + async def send(self, message): + self.requests.append(msgpack.unpackb(message, object_hook=rollout.unpack)) + + async def recv(self): + if not self.metadata_sent: + self.metadata_sent = True + return msgpack.packb({'memory_mode': self.memory_mode}) + chunk = np.zeros((32, 7), np.float32) + # Different offsets have different values, so the test can detect + # executing the first four predictions repeatedly within a long chunk. + chunk[:, 0] = np.linspace(-0.5, 0.5, 32) + chunk[:, 6] = 1.0 + return msgpack.packb({'action': chunk}, default=rollout.pack) + + +def arguments(directory, horizon): + return SimpleNamespace( + port=1, seed_start=7, episodes=1, render_device='cuda:0', max_steps=150, + max_seconds=None, video_dir=None, checkpoint='step_000290000.pt', + proprio_convention='bridge_tool', trace_dir=str(Path(directory) / 'traces'), + output=str(Path(directory) / 'result.json'), exec_horizon=horizon, + memory_mode='bank_off', + ) + + +class ExecutionHorizonTests(unittest.TestCase): + def test_real_loop_executes_requested_horizon_and_truncates_last_chunk(self): + for horizon in (3, 4, 16, 32): + with self.subTest(horizon=horizon), tempfile.TemporaryDirectory() as directory: + args = arguments(directory, horizon) + env, transport = FakeEnvironment(), FakeTransport() + measured_step = np.array([0.002, -0.001, 0.003, 0.004, -0.002, 0.006], np.float32) + + def measured_pose(environment, convention): + result = np.zeros(9, np.float32) + result[:6] = len(environment.actions) * measured_step + return result + + with patch.object(rollout.simpler_env, 'make', return_value=env), \ + patch.object(rollout.websockets, 'connect', return_value=transport), \ + patch.object(rollout, 'proprio', side_effect=measured_pose), \ + patch.object(rollout, 'get_image_from_maniskill2_obs_dict', + return_value=np.zeros((256, 256, 3), np.uint8)): + asyncio.run(rollout.evaluate(args)) + self.assertTrue(env.closed) + self.assertEqual(len(env.actions), 150) + expected_query_steps = list(range(0, 150, horizon)) + self.assertEqual(len(transport.requests), len(expected_query_steps)) + for request, query_step in zip(transport.requests, expected_query_steps): + self.assertEqual(request['inference_seed'], 70000 + query_step) + completed = 4 * (query_step // 4) + self.assertEqual(int(request['cte_transition_valid'].sum()), completed) + self.assertEqual(request['cte_completed_control_steps'], completed) + self.assertEqual(request['cte_pending_control_steps'], query_step % 4) + from scripts.bridge_recovery_contract import ACTION_CONTRACT_ID, normalize_reached_delta + self.assertEqual(request['cte_action_contract_id'], ACTION_CONTRACT_ID) + actual = request['cte_transition_actions'][request['cte_transition_valid']] + expected = normalize_reached_delta(np.r_[measured_step, 1.0]) + np.testing.assert_allclose(actual, np.broadcast_to(expected, actual.shape), rtol=1e-6, atol=1e-6) + trace = json.loads((Path(args.trace_dir) / 'episode_07.json').read_text()) + self.assertEqual([x['step'] for x in trace], list(range(1, 151))) + self.assertEqual([x['query_step'] for x in trace], + [(i // horizon) * horizon for i in range(150)]) + self.assertEqual([x['chunk_offset'] for x in trace], + [i % horizon for i in range(150)]) + report = json.loads(Path(args.output).read_text()) + self.assertEqual(report['exec_horizon'], horizon) + self.assertEqual(report['episodes'][0]['steps'], 150) + self.assertEqual(report['memory_mode'], 'bank_off') + + def test_wrong_memory_mode_is_rejected_before_environment_creation(self): + with tempfile.TemporaryDirectory() as directory: + args = arguments(directory, 16) + with patch.object(rollout.websockets, 'connect', return_value=FakeTransport('on')), \ + patch.object(rollout.simpler_env, 'make') as make: + with self.assertRaisesRegex(RuntimeError, 'memory mode mismatch'): + asyncio.run(rollout.evaluate(args)) + make.assert_not_called() + + +if __name__ == '__main__': + unittest.main() diff --git a/releases/bridge-native-v3/code/scripts/test_widowx_full.py b/releases/bridge-native-v3/code/scripts/test_widowx_full.py new file mode 100644 index 0000000000000000000000000000000000000000..7ee1b1733ba88dfd85fa54a6a0c343b407187635 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/test_widowx_full.py @@ -0,0 +1,220 @@ +"""CPU regression tests for full-trajectory masks, replay and retention.""" +import json +import os +import socket +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +import numpy as np +import torch +from torch.utils.data import DataLoader + +from scripts.widowx_data_resume import WidowXIterableDataset +from scripts.widowx_masked_loss import batch_vectors, mask_loss_conditions +from scripts.widowx_rollout import CausalHistory + + +class ToyWindows: + def get_shuffle_blocks(self): + return [[0, 2], [2, 5], [7, 1], [8, 4], [12, 3]] + + def __len__(self): + return 15 + + def __getitem__(self, index): + return {'index': torch.tensor(index), 'video': torch.zeros(3,33,16,16,dtype=torch.uint8), + 'text_token_ids': torch.tensor([1,2]), 'action': torch.zeros(32,64)} + + +class ToyRankLoader: + def __init__(self, collate_fn=None): + self.dataset = WidowXIterableDataset(ToyWindows()) + self.dataset_name = 'toy' + self.dataloader = DataLoader(self.dataset, batch_size=1, num_workers=1, + persistent_workers=True, collate_fn=collate_fn) + + def __iter__(self): + return iter(self.dataloader) + + def __len__(self): + return len(self.dataset) + + +class FullDatasetTests(unittest.TestCase): + def test_all_phases_and_short_episodes_are_included(self): + from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import WidowXBridgeV3Dataset + with tempfile.TemporaryDirectory() as directory: + root = Path(directory); (root/'meta').mkdir() + lengths = [1, 4, 5, 10, 33, 36, 65] + (root/'meta/info.json').write_text(json.dumps({'features':{'observation.images.image_0':{}},'fps':5})) + (root/'meta/episodes.jsonl').write_text('\n'.join(json.dumps({'episode_index':i,'length':n}) for i,n in enumerate(lengths))) + (root/'meta/tasks.jsonl').write_text(json.dumps({'task_index':0,'task':'put carrot on plate'})) + ds = WidowXBridgeV3Dataset(str(root), window_mode='full') + self.assertEqual(set(ep for ep,_ in ds.windows), set(range(len(lengths)))) + self.assertIn((5, 32), ds.windows) + def load(ep): + n = lengths[ep] + ds._rows[ep] = {'action':np.zeros((n,7),np.float32), 'observation.state':np.zeros((n,8),np.float32), 'task_index':np.zeros(n,np.int64)} + ds._frames[ep] = np.arange(n,dtype=np.uint8)[:,None,None,None] * np.ones((n,16,16,3),np.uint8) + ds._load = load + for index, (ep, start) in enumerate(ds.windows): + sample = ds[index]; n = lengths[ep] + self.assertEqual(sample['action'].shape, (32,7)) + self.assertEqual(sample['video'].shape, (3,33,16,16)) + self.assertEqual(int(sample['widowx_action_valid'].sum()), min(32,n-start)) + self.assertEqual(int(sample['widowx_vision_valid'].sum()), (min(33,n-start)-1)//4+1) + self.assertEqual(int(sample['video'][0,-1,0,0]), min(start+32,n-1)) + + def test_action_padding_has_zero_gradient(self): + from cosmos_framework.model.generator.algorithm.loss.flow_matching import compute_flow_matching_loss + class RF: + def train_time_weight(self, timestep, kw): return torch.ones_like(timestep) + pred = torch.ones(32,7,requires_grad=True) + target = torch.zeros_like(pred); target[3:] = 1000 + original_condition = torch.zeros(32,1) + condition = mask_loss_conditions([original_condition], [torch.arange(32)<3]) + loss,_ = compute_flow_matching_loss([pred],[target],condition,torch.ones(1,1),True,RF(),{},[7],True) + self.assertAlmostEqual(float(loss.detach()),1.) + loss.backward() + self.assertEqual(int(torch.count_nonzero(pred.grad[3:])),0) + self.assertGreater(float(pred.grad[:3].abs().sum()),0) + self.assertEqual(int(torch.count_nonzero(original_condition)),0) + + def test_vision_padding_and_empty_future_loss(self): + from cosmos_framework.model.generator.algorithm.loss.flow_matching import compute_flow_matching_loss + class RF: + def train_time_weight(self,t,kw): return torch.ones_like(t) + for real in (1,5,9): + pred=torch.ones(2,9,2,2,requires_grad=True); target=torch.zeros_like(pred) + c=torch.zeros(9,1,1);c[0]=1 + cond=mask_loss_conditions([c],[torch.arange(9) 1: + dist.init_process_group("nccl", device_id=device, timeout=timedelta(minutes=10)) + torch.set_num_threads(2) + torch.backends.cuda.matmul.allow_tf32 = True + torch.backends.cudnn.benchmark = False + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.cuda.manual_seed(args.seed) + info, train, val = load_metadata(args.dataset, args.seed, args.val_fraction) + cfg = CausalTransitionEncoderConfig(action_dim=7, image_channels=48) + model = CausalTransitionEncoder(cfg).to(device) + # Unused cross_norm modules exist in the public architecture. DDP detects + # those without silently freezing any actually used CTE parameters. + optimizer = torch.optim.AdamW((p for p in model.parameters() if p.requires_grad), + lr=args.lr, betas=(0.9, 0.95), weight_decay=args.weight_decay) + dataset = BridgeCTEDataset(args.dataset, info, train) + val_dataset = BridgeCTEDataset(args.dataset, info, val) + base_sampler = PairedEpisodeSampler(train, args.batch_size, world, rank, args.seed) + files = [ROOT / "scripts" / n for n in ("train_bridge_cte.py", "bridge_cte_data.py", "bridge_cte_loss.py")] + files += [ROOT / "cosmos_framework/model/zeva" / n for n in ("causal_transition_encoder.py", "cte_losses.py")] + contract = dict(version="bridge_cte_stage1_v1", dataset=str(Path(args.dataset).resolve()), + metadata={n: digest_file(Path(args.dataset) / "meta" / n) for n in ("info.json", "episodes.jsonl", "tasks.jsonl")}, + vae_path=str(Path(args.vae).resolve()), vae_sha256=digest_file(args.vae), + code_sha256={str(p.relative_to(ROOT)): digest_file(p) for p in files}, + action_contract="bridge_q01_q99_xyzrpy_clipped_gripper_open_positive_v1", + frame_encoding="single_frame_rgb_native256x256_wan22_bf16_v1", image_key="observation.images.image_0", + boundary_stride=4, effect_raw_controls=16, fps=5, + full_trajectories=True, cte_initialization="random_no_release_weights", + loss="release_effect_v3_mse_diagnostic_only_bridge_masked_global_task_v1", + model_config=cfg.to_dict(), loss_config=asdict(CTELossConfig()), + seed=args.seed, val_fraction=args.val_fraction, world_size=world, + per_rank_batch=args.batch_size, lr=args.lr, warmup_steps=args.warmup_steps, + weight_decay=args.weight_decay, sampler="exhaustive_anchors_paired_partner_v1") + args.output = args.output.resolve() + if rank == 0: + args.output.mkdir(parents=True, exist_ok=True) + if (args.output / "manifest.json").exists() and not args.resume: + raise FileExistsError("Run already exists; explicitly --resume or choose a new output directory") + if shutil.disk_usage(args.output).free < args.min_free_gb * 2**30 + 1024**3: + raise OSError("Not enough disk headroom for a new CTE run") + if dist.is_initialized(): + dist.barrier() + step, epoch, cursor = 0, 0, 0 + resume_rng = None + initialization_hash = model_digest(model) if rank == 0 else None + if args.resume: + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=False) + if checkpoint.get("format") != "bridge_cte_stage1_v1" or checkpoint.get("contract_fingerprint") != fingerprint(contract): + raise ValueError("Checkpoint/data/code/batch/optimizer contract differs; refusing ambiguous resume") + model.load_state_dict(checkpoint["model"], strict=True) + optimizer.load_state_dict(checkpoint["optimizer"]) + step, epoch, cursor = checkpoint["step"], checkpoint["epoch"], checkpoint["batch_cursor"] + resume_rng = checkpoint["rng_states"][rank] + del checkpoint + config = dict(contract=contract, args=vars(args) | {"output": str(args.output)}, + train_episodes=len(train), validation_episodes=len(val), + train_unknown_instruction=sum(e["semantic_id"] < 0 for e in train), + steps_per_anchor_epoch=base_sampler.total_batches, global_episode_batch=args.batch_size * world, + trainable_parameters=sum(p.numel() for p in model.parameters() if p.requires_grad), + initial_random_model_sha256=initialization_hash) + if rank == 0: + atomic_json(args.output / "manifest.json", config) + atomic_json(args.output / "split.json", dict(train=[e["episode_index"] for e in train], + validation=[e["episode_index"] for e in val])) + logger = init_wandb(args, config) + else: + logger = None + if dist.is_initialized(): + dist.barrier() + encoder = FrozenFrameEncoder(args.vae, device, args.vae_microbatch) + ddp = DistributedDataParallel(model, device_ids=[local_rank], find_unused_parameters=True, + broadcast_buffers=False) if world > 1 else model + if resume_rng is not None: + restore_rng(resume_rng) + print(f"RANK_READY rank={rank} pid={os.getpid()} cuda={local_rank} trainable={config['trainable_parameters']} " + f"resume_step={step} max_allocated_GiB={torch.cuda.max_memory_allocated()/2**30:.3f}", flush=True) + + def record(kind, values): + if rank != 0: + return + record = dict(kind=kind, timestamp=datetime.now().astimezone().isoformat(), step=step, + anchor_epoch=epoch + cursor / base_sampler.total_batches, **values) + with (args.output / "metrics.jsonl").open("a") as stream: + stream.write(json.dumps(record, allow_nan=False) + "\n") + atomic_json(args.output / "status.json", record) + if logger is not None: + logger.log({f"{kind}/{k}": v for k, v in values.items()} | {"global_step": step}, step=step) + print(json.dumps(record, allow_nan=False), flush=True) + + if not args.resume: + save_checkpoint(model, optimizer, args, contract, step, epoch, cursor, world, rank) + if not args.skip_initial_validation: + record("validation", validate(model, encoder, val_dataset, args, world, rank, device)) + requested_stop = False + + def handle_stop(signum, frame): + nonlocal requested_stop + requested_stop = True + print(f"STOP_REQUESTED rank={rank} signal={signum}; finishing current update and saving", flush=True) + + signal.signal(signal.SIGTERM, handle_stop) + signal.signal(signal.SIGINT, handle_stop) + model.train() + last_log_time, last_log_step = time.perf_counter(), step + while step < args.max_steps: + sampler = PairedEpisodeSampler(train, args.batch_size, world, rank, args.seed, epoch, cursor) + loader = build_loader(dataset, sampler, args, rank) + for raw in loader: + optimizer.zero_grad(set_to_none=True) + inputs = encoder(raw) + batch = move_batch(raw, device) + with torch.autocast("cuda", dtype=torch.bfloat16): + output = ddp(inputs, batch["actions"], batch["valid"], batch["transition_valid"]) + losses = bridge_cte_loss(output, batch["actions"], batch["valid"], batch["semantic_ids"], batch["episode_ids"]) + if not torch.isfinite(losses["total"]): + raise FloatingPointError(f"Nonfinite loss at step {step + 1}, rank {rank}") + losses["total"].backward() + grad_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0, error_if_nonfinite=True) + lr = args.lr * min(1.0, (step + 1) / args.warmup_steps) + for group in optimizer.param_groups: + group["lr"] = lr + optimizer.step() + model.update_ema_target() + step, cursor = step + 1, cursor + 1 + if step <= 3 or step % args.log_every == 0: + values = reduce_metrics(losses | {"grad_norm": grad_norm}, device) + now = time.perf_counter() + values.update(lr=lr, seconds_per_step=(now-last_log_time)/(step-last_log_step), + gpu_max_allocated_gb=torch.cuda.max_memory_allocated()/2**30, + gpu_reserved_gb=torch.cuda.memory_reserved()/2**30) + record("train", values) + last_log_time, last_log_step = now, step + stop_flag = torch.tensor(int(requested_stop), device=device) + if dist.is_initialized(): + dist.all_reduce(stop_flag, op=dist.ReduceOp.MAX) + stop = bool(stop_flag.item()) or step >= args.max_steps + if step % args.save_every == 0 or stop: + save_checkpoint(model, optimizer, args, contract, step, epoch, cursor, world, rank) + if step % args.validate_every == 0 and not stop: + record("validation", validate(model, encoder, val_dataset, args, world, rank, device)) + # Validation time is not reported as optimizer-step throughput. + last_log_time, last_log_step = time.perf_counter(), step + if stop: + record("stopped", dict(checkpoint_step=step, reason="signal" if stop_flag.item() else "max_steps")) + if logger is not None: + logger.finish() + if dist.is_initialized(): + dist.destroy_process_group() + return + epoch, cursor = epoch + 1, 0 + if rank == 0: + print(f"ANCHOR_EPOCH_COMPLETE epoch={epoch} train_episodes={len(train)} all_anchors_seen=true", flush=True) + + +if __name__ == "__main__": + main() diff --git a/releases/bridge-native-v3/code/scripts/train_bridge_stage2_pilot.py b/releases/bridge-native-v3/code/scripts/train_bridge_stage2_pilot.py new file mode 100644 index 0000000000000000000000000000000000000000..002e837c44171c22c84311beb23fb4dfb277b5e1 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/train_bridge_stage2_pilot.py @@ -0,0 +1,43 @@ +"""Use the existing trainer compatibility path with the isolated pilot recipe.""" +import runpy +import os +from pathlib import Path +import subprocess +from scripts.bridge_stage2_config import register +from scripts.bridge_stage2_monitor import install_diagnostics + + +def check_exclusive_devices(): + """Fail closed if another job appeared after the launcher's idle check. + + Never send signals. Other ranks of this exact torchrun parent are allowed. + """ + visible = set(os.environ['CUDA_VISIBLE_DEVICES'].split(',')) + rows = subprocess.check_output(['nvidia-smi', '--query-gpu=index,uuid', '--format=csv,noheader'], text=True) + selected = {uuid.strip() for row in rows.splitlines() for index, uuid in [row.split(',')] + if index.strip() in visible} + if len(selected) != 2: + raise ValueError('This bounded pilot requires exactly two verified devices') + rows = subprocess.check_output(['nvidia-smi', '--query-compute-apps=gpu_uuid,pid', '--format=csv,noheader'], text=True) + shared_baseline = __import__('json').loads(os.environ.get('BRIDGE_PILOT_SHARED_BASELINE', '{}')) + for row in rows.splitlines(): + uuid, pid = row.split(',') + if uuid.strip() not in selected: + continue + try: + stat = Path(f'/proc/{int(pid)}/stat').read_text() + except FileNotFoundError: + continue + parent = int(stat.rsplit(')', 1)[1].split()[1]) + if int(pid) in shared_baseline.get(uuid.strip(), []): + continue + if parent != os.getppid() and int(pid) != os.getpid(): + raise RuntimeError(f'GPU became occupied by unrelated PID {pid.strip()}; refusing to start') + + +if __name__ == '__main__': + if '--dryrun' not in __import__('sys').argv: + check_exclusive_devices() + register() + install_diagnostics() + runpy.run_module('scripts.train_widowx_zeva', run_name='__main__') diff --git a/releases/bridge-native-v3/code/scripts/train_widowx_zeva.py b/releases/bridge-native-v3/code/scripts/train_widowx_zeva.py new file mode 100644 index 0000000000000000000000000000000000000000..71e23c2f76b872cef1f52383633e83fcd7476ae0 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/train_widowx_zeva.py @@ -0,0 +1,84 @@ +"""Launch the real Cosmos/Zeva trainer with the WidowX experiment registered.""" +import runpy +import sys +from functools import wraps +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) +from scripts.widowx_config import register + + +def with_wandb_offline_fallback(init_wandb): + """Keep training and local metrics if online W&B initialization fails.""" + @wraps(init_wandb) + def initialize(config, model): + import wandb + + try: + return init_wandb(config, model) + except wandb.errors.Error as error: + if config.job.wandb_mode != 'online': + raise + # Keep the user's project, name and persisted run ID. Do not + # suppress unrelated training failures or a failed offline retry. + # Cosmos freezes its config before callbacks run. Evolve a local + # copy for logging rather than mutating the training config. + import attrs + from omegaconf import DictConfig, OmegaConf + + if isinstance(config.job, DictConfig): + offline_job = OmegaConf.merge(config.job, {'wandb_mode': 'offline'}) + else: + offline_job = attrs.evolve(config.job, wandb_mode='offline') + offline_config = attrs.evolve(config, job=offline_job) + print( + 'WIDOWX_WANDB_OFFLINE_FALLBACK ' + f'error_type={type(error).__name__}; saving metrics locally', + flush=True, + ) + # A failed init can leave the run ID registered in wandb-core. + # Restart this process's SDK backend before reusing that ID. + wandb.teardown() + return init_wandb(offline_config, model) + + return initialize + + +if __name__ == '__main__': + # Cosmos still uses the public alias removed in wandb 0.30. + import wandb + if not hasattr(wandb.util, 'generate_id'): + from wandb.sdk.lib.runid import generate_id + wandb.util.generate_id = generate_id + from cosmos_framework.utils import wandb_util + wandb_util.init_wandb = with_wandb_offline_fallback(wandb_util.init_wandb) + # The installed model forwards this optional argument to an older loss + # helper. Preserve the exact unweighted loss; reject weighted usage. + import inspect + import cosmos_framework.model.generator.omni_mot_model as model_module + # The production FusedAdam uses Transformer Engine, which is optional and + # absent in this venv. Preserve its FP32-master semantics with the local + # PyTorch implementation before Hydra instantiates the optimizer. + import cosmos_framework.utils.generator.optimizer as optimizer_module + from scripts.fp32_master_adamw import FP32MasterAdamW + + _optimizer_cls = optimizer_module._optimizer_cls + + def _optimizer_cls_compat(params, optimizer_type, **kwargs): + if str(optimizer_type).lower() == 'fusedadam': + return FP32MasterAdamW(params, **kwargs) + return _optimizer_cls(params, optimizer_type, **kwargs) + + optimizer_module._optimizer_cls = _optimizer_cls_compat + original_loss = model_module.compute_flow_matching_loss + if 'sample_weights' not in inspect.signature(original_loss).parameters: + def unweighted_loss_compat(*args, sample_weights=None, **kwargs): + if sample_weights is not None: + raise ValueError('Installed loss helper does not support sample weights') + return original_loss(*args, **kwargs) + model_module.compute_flow_matching_loss = unweighted_loss_compat + from scripts.widowx_masked_loss import install + install() + register() + runpy.run_module('cosmos_framework.scripts.train', run_name='__main__') diff --git a/releases/bridge-native-v3/code/scripts/watch_widowx_eval.py b/releases/bridge-native-v3/code/scripts/watch_widowx_eval.py new file mode 100644 index 0000000000000000000000000000000000000000..fe3856912c4a3d4166ac3fe93629e182cea3b476 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/watch_widowx_eval.py @@ -0,0 +1,150 @@ +"""Evaluate Zeva deltas continuously, or run one explicitly selected checkpoint.""" +import argparse +import json +import os +import socket +from pathlib import Path +import subprocess +import time +import urllib.request + +ROOT=Path(__file__).resolve().parents[1] +# Allow corrected runs to use an isolated artifact directory while preserving +# the historical default for existing watcher processes. +RUN=Path(os.environ.get('WIDOWX_RUN_DIR', str(ROOT/'.artifacts/widowx'))) +PYTHON='/home/gpu4/tianyi/cosmos-framework/.venv/bin/python' +SIM_PYTHON='/home/gpu4/miniconda3/envs/simpler_env/bin/python' +PORT=18765 +EVAL_GPU=os.environ.get('WIDOWX_EVAL_GPU','3') +RENDER_GPU=os.environ.get('WIDOWX_RENDER_GPU', EVAL_GPU) + +def run_one(checkpoint, episodes=10, port=PORT, record_traces=False, max_steps=None, num_steps=4, seed_start=0, exec_horizon=4, guidance=3.0, memory_mode='on'): + # Do not mistake an unrelated local service's health endpoint for ours. + # Fail before spending time/VRAM loading the policy on an occupied port. + with socket.socket() as probe: + probe.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + probe.bind(('127.0.0.1', port)) + out=RUN/'eval'; out.mkdir(parents=True,exist_ok=True) + gpu_uuid=subprocess.check_output(['nvidia-smi','-i',EVAL_GPU,'--query-gpu=uuid', + '--format=csv,noheader'],text=True).strip() + if not gpu_uuid.startswith('GPU-') or '\n' in gpu_uuid: + raise ValueError('WIDOWX_EVAL_GPU must select exactly one physical GPU') + render_uuid=subprocess.check_output(['nvidia-smi','-i',RENDER_GPU,'--query-gpu=uuid', + '--format=csv,noheader'],text=True).strip() + if not render_uuid.startswith('GPU-') or '\n' in render_uuid: + raise ValueError('WIDOWX_RENDER_GPU must select exactly one physical GPU') + env=os.environ.copy() + env.update(CUDA_VISIBLE_DEVICES=gpu_uuid,PYTHONPATH=str(ROOT)+':/home/gpu4/tianyi/cosmos-framework', + WIDOWX_POLICY_OUTPUT_DIR=str(out/'server_runtime'), + QWEN_VLM_PATH='/home/gpu4/tianyi/models/Qwen3-VL-8B-Instruct', + WAN_VAE_PATH='/home/gpu4/tianyi/models/wan22_vae/Wan2.2_VAE.pth', + HF_HUB_OFFLINE='1',TOKENIZERS_PARALLELISM='false') + simenv=env.copy() + simenv.update(CUDA_VISIBLE_DEVICES=render_uuid,PYTHONPATH='/opt/benchmarks/SimplerEnv', + VK_ICD_FILENAMES='/etc/vulkan/icd.d/nvidia_icd.json', + MS2_ASSET_DIR='/opt/benchmarks/SimplerEnv/ManiSkill2_real2sim/data') + subprocess.run([SIM_PYTHON,str(ROOT/'scripts/check_sapien_gpu.py'), + '--expected-uuid',render_uuid],env=simenv,check=True) + with (out/(checkpoint.stem+'.server.log')).open('a') as log: + server=subprocess.Popen([PYTHON,str(ROOT/'scripts/widowx_policy_server.py'), + '--delta',str(checkpoint),'--port',str(port),'--num-steps',str(num_steps), + '--guidance',str(guidance),'--memory-mode',memory_mode], + env=env,cwd='/home/gpu4/tianyi/cosmos-framework',stdout=log,stderr=subprocess.STDOUT) + try: + deadline=time.monotonic()+600 + while True: + if server.poll() is not None: raise RuntimeError(f'policy server exited {server.returncode}') + try: + with urllib.request.urlopen(f'http://127.0.0.1:{port}/healthz',timeout=3) as r: + if r.status==200: break + except Exception: pass + if time.monotonic()>deadline: raise TimeoutError('policy server startup') + time.sleep(3) + trace_args = ['--trace-dir', str(out/'traces'/checkpoint.stem)] if record_traces else [] + limit_args = ['--max-steps', str(max_steps)] if max_steps is not None else [] + with (out/(checkpoint.stem+'.episodes.log')).open('a') as eval_log: + subprocess.run([SIM_PYTHON,str(ROOT/'scripts/eval_widowx_simpler.py'), + '--checkpoint',str(checkpoint),'--output',str(out/(checkpoint.stem+'.json')), + '--video-dir',str(out/'videos'/checkpoint.stem), + '--episodes',str(episodes),'--port',str(port),'--seed-start',str(seed_start), + '--exec-horizon',str(exec_horizon), + '--memory-mode',memory_mode, + *trace_args,*limit_args],env=simenv,check=True, + stdout=eval_log,stderr=subprocess.STDOUT) + report=json.loads((out/(checkpoint.stem+'.json')).read_text()) + if report.get('status') != 'complete' or len(report.get('episodes', [])) != episodes: + raise RuntimeError('evaluation did not produce the requested number of complete episodes') + report['inference_num_steps'] = num_steps + report['guidance'] = guidance + report['physical_gpu_uuid'] = gpu_uuid + report['render_gpu_uuid'] = render_uuid + report['memory_mode'] = memory_mode + report_path = out/(checkpoint.stem+'.json') + temporary = report_path.with_suffix('.tmp') + temporary.write_text(json.dumps(report, indent=2)) + temporary.replace(report_path) + print('EVAL_COMPLETE '+json.dumps(dict(checkpoint=str(checkpoint), + episodes=episodes,successes=sum(bool(x['success']) for x in report['episodes']), + success_rate=report['success_rate'])),flush=True) + finally: + server.terminate() + try: server.wait(timeout=30) + except subprocess.TimeoutExpired: server.kill(); server.wait() + +def main(): + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--once', action='store_true', help='evaluate one checkpoint and exit; never starts training') + parser.add_argument('--checkpoint', type=Path, help='explicit checkpoint for --once') + parser.add_argument('--episodes', type=int, default=10) + parser.add_argument('--port', type=int, default=PORT) + parser.add_argument('--record-traces', action='store_true') + parser.add_argument('--num-steps', type=int, default=4, help='UniPC denoising steps per prediction') + parser.add_argument('--seed-start', type=int, default=0, help='first environment and inference seed') + parser.add_argument('--exec-horizon', type=int, default=4, choices=range(1,33)) + parser.add_argument('--guidance', type=float, default=3.0) + parser.add_argument('--memory-mode',choices=('on','bank_off'),default='on') + parser.add_argument('--max-steps', type=int, default=None, + help='maximum environment control steps per episode') + args=parser.parse_args() + if args.episodes < 1 or not 1 <= args.port <= 65535 or (args.max_steps is not None and args.max_steps < 1): + parser.error('episodes and max-steps must be positive; port must be in [1,65535]') + if args.num_steps < 1 or args.seed_start < 0: + parser.error('num-steps must be positive and seed-start must be nonnegative') + if args.once != (args.checkpoint is not None): + parser.error('--once and --checkpoint must be supplied together') + (RUN/'eval').mkdir(parents=True,exist_ok=True) + if args.once: + checkpoint=args.checkpoint.resolve() + if not checkpoint.is_file(): + parser.error(f'checkpoint does not exist: {checkpoint}') + if (RUN/'eval'/(checkpoint.stem+'.json')).exists(): + parser.error('a result already exists for this checkpoint; use a separate WIDOWX_RUN_DIR') + print('EVALUATING_ONCE '+json.dumps(dict(checkpoint=str(checkpoint), + episodes=args.episodes,gpu=EVAL_GPU,port=args.port, + inference_num_steps=args.num_steps,seed_start=args.seed_start,max_steps=args.max_steps, + memory_mode=args.memory_mode,render_gpu=RENDER_GPU)),flush=True) + try: + run_one(checkpoint, args.episodes, args.port, args.record_traces, args.max_steps, args.num_steps, args.seed_start, args.exec_horizon, args.guidance, args.memory_mode) + except Exception as e: + (RUN/'eval'/(checkpoint.stem+'.error.json')).write_text( + json.dumps(dict(status='failed',error=repr(e),time=time.time()))) + raise + return + while True: + # Evaluate the newest snapshot first so a long backlog cannot delay the + # most useful current-policy result; older 2k snapshots are backfilled. + for checkpoint in sorted((RUN/'checkpoints').glob('step_*.pt'), reverse=True): + if int(checkpoint.stem.split('_')[1]) % 2000: + continue # Startup save/resume probes are not scheduled evaluations. + if (RUN/'eval'/(checkpoint.stem+'.json')).exists(): continue + try: + print('EVALUATING',checkpoint,flush=True) + run_one(checkpoint, args.episodes, args.port, args.record_traces, args.max_steps, args.num_steps, args.seed_start, args.exec_horizon, args.guidance, args.memory_mode) + except Exception as e: + failure=RUN/'eval'/(checkpoint.stem+'.error.json') + failure.write_text(json.dumps(dict(status='failed',error=repr(e),time=time.time()))) + print('EVAL_FAILED',repr(e),flush=True) + time.sleep(30) + time.sleep(10) + +if __name__=='__main__': main() diff --git a/releases/bridge-native-v3/code/scripts/widowx_checkpoint.py b/releases/bridge-native-v3/code/scripts/widowx_checkpoint.py new file mode 100644 index 0000000000000000000000000000000000000000..99e4ea5dd50a294008f1851b07ab317b257d20de --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_checkpoint.py @@ -0,0 +1,208 @@ +"""Resumable Zeva deltas with data cursors; checkpoints are NEVER auto-deleted.""" +import os +import time +import shutil +import warnings +from pathlib import Path +import torch +import torch.distributed as dist +from cosmos_framework.checkpoint.dcp import DistributedCheckpointer + + +def _is_rank0() -> bool: + return not dist.is_available() or not dist.is_initialized() or dist.get_rank() == 0 + + +def _full_cpu_param(param): + """Collect one possibly-FSDP parameter on every rank, returning CPU data.""" + # DTensor.full_tensor() is collective; every rank must execute it in the + # same parameter order, even though only rank 0 retains the result. + if hasattr(param, 'full_tensor'): + param = param.full_tensor() + return param.detach().to(device='cpu').clone() + +class WidowXDeltaCheckpointer(DistributedCheckpointer): + def _directory(self): + path = Path(os.environ['WIDOWX_RUN_DIR']) / 'checkpoints' + path.mkdir(parents=True, exist_ok=True) + return path + + def save(self, model, optimizer, scheduler, grad_scaler, iteration): + world_size = dist.get_world_size() if dist.is_available() and dist.is_initialized() else 1 + rank0 = _is_rank0() + optimizers = getattr(optimizer, 'optimizers', [optimizer]) + trainable = {id(p) for opt in optimizers for group in opt.param_groups for p in group['params']} + params = {} + # All ranks participate in DTensor all-gathers. Only rank 0 writes a + # full delta, so the artifact is independent of the world size. + for name, param in model.named_parameters(): + if id(param) not in trainable: + continue + value = _full_cpu_param(param) + if rank0: + params[name] = value + if rank0 and not params: + raise RuntimeError('No optimizer parameters selected for checkpoint') + + # Convert the sharded optimizer state to a rank-0 CPU state. This is + # the FSDP2-supported path and preserves FP32 FusedAdam master weights. + try: + from torch.distributed.checkpoint.state_dict import StateDictOptions, get_optimizer_state_dict + + optimizer_state = get_optimizer_state_dict( + model, + optimizers, + options=StateDictOptions(full_state_dict=True, cpu_offload=True, ignore_frozen_params=True), + ) + except Exception: + # Keep a useful single-rank fallback for older framework builds. + if world_size > 1: + raise + optimizer_state = optimizer.state_dict() if rank0 else None + + rng_states = [torch.get_rng_state()] + cuda_rng_states = [[state.cpu() for state in torch.cuda.get_rng_state_all()]] + if world_size > 1: + gathered_rng = [None for _ in range(world_size)] + gathered_cuda_rng = [None for _ in range(world_size)] + dist.all_gather_object(gathered_rng, torch.get_rng_state()) + dist.all_gather_object( + gathered_cuda_rng, + [state.cpu() for state in torch.cuda.get_rng_state_all()], + ) + rng_states = gathered_rng + cuda_rng_states = gathered_cuda_rng + + directory = self._directory() + path = directory / f'step_{iteration:09d}.pt' + from scripts.widowx_contract import training_contract + cursor = getattr(model, '_widowx_data_cursor', None) + cursors = [cursor] + if world_size > 1: + cursors = [None] * world_size + dist.all_gather_object(cursors, cursor) + payload = dict(format='zeva_widowx_delta_v3', iteration=iteration, model=params, + optimizer=optimizer_state, scheduler=scheduler.state_dict(), + grad_scaler=grad_scaler.state_dict(), rng=rng_states, + cuda_rng=cuda_rng_states, base=os.environ['BASE_CHECKPOINT_PATH'], + data_cursors=cursors, data_contract=training_contract()) + if rank0: + if path.exists(): + raise FileExistsError(f'Refusing to overwrite an existing checkpoint: {path}') + if shutil.disk_usage(directory).free < 2 * 1024**3: + raise OSError('Less than 2 GiB free for checkpoint; no checkpoints were auto-deleted') + # Use a unique temporary name and retry transient filesystem errors. A + # fixed ``.tmp`` path can be left behind by an interrupted save and + # PyTorch's zip writer then aborts the whole distributed job on the + # next checkpoint. + last_error = None + for attempt in range(3): + temporary = directory / f'{path.name}.tmp.{os.getpid()}.{attempt}' + try: + if temporary.exists(): + temporary.unlink() + torch.save(payload, temporary) + if temporary.stat().st_size < 1024: + raise IOError(f'checkpoint file is unexpectedly small: {temporary}') + temporary.replace(path) + last_error = None + break + except (OSError, RuntimeError) as exc: + last_error = exc + try: + temporary.unlink() + except FileNotFoundError: + pass + if attempt < 2: + time.sleep(2 ** attempt) + if last_error is not None: + raise RuntimeError(f'failed to save checkpoint after 3 attempts: {path}') from last_error + print(f'WIDOWX_CHECKPOINT step={iteration} path={path}', flush=True) + # Retention is user-controlled. Never prune even evaluated snapshots. + if world_size > 1: + dist.barrier() + + def load(self, model, optimizer=None, scheduler=None, grad_scaler=None): + iteration = super().load(model, optimizer, scheduler, grad_scaler) + paths = sorted(self._directory().glob('step_*.pt')) + choice = os.environ.get('WIDOWX_RESUME', 'auto') + if choice == 'none': + if paths: + raise ValueError('Fresh training requires a new/empty checkpoint directory; existing files are protected') + return iteration + if choice == 'auto' and not paths: + return iteration + selected = paths[-1] if choice == 'auto' else Path(choice).resolve() + payload = torch.load(selected, map_location='cpu', weights_only=False) + if Path(payload['base']).resolve() != Path(os.environ['BASE_CHECKPOINT_PATH']).resolve(): + raise ValueError('Delta checkpoint uses a different base model') + from scripts.widowx_contract import training_contract + from scripts import widowx_data_resume + contract = training_contract() + if payload.get('data_contract') != contract: + if os.environ.get('WIDOWX_ALLOW_LEGACY_RESUME') != '1': + raise ValueError('Checkpoint data contract is missing/different; use a fresh run, not silent resume') + warnings.warn('Explicit legacy/data-change resume: optimizer is restored but sample continuity is NOT guaranteed') + cursors = payload.get('data_cursors') + rank = dist.get_rank() if dist.is_available() and dist.is_initialized() else 0 + world = dist.get_world_size() if dist.is_available() and dist.is_initialized() else 1 + if cursors and any(c is not None for c in cursors): + if len(cursors) != world: + if os.environ.get('WIDOWX_ALLOW_DATA_RESHARD') != '1': + raise ValueError('GPU count changed; exact data resume is unavailable. Explicitly opt into data reshuffling.') + next_epoch = max(c[0] for c in cursors if c is not None) + 1 + widowx_data_resume.PENDING_CURSOR = [next_epoch, 0, 0, rank, world] + warnings.warn('GPU count changed: beginning a NEW shuffled data epoch, not exact sample resume') + else: + widowx_data_resume.PENDING_CURSOR = cursors[rank] + named = dict(model.named_parameters()) + with torch.no_grad(): + for name, value in payload['model'].items(): + p = named[name] + if hasattr(p, 'device_mesh') and hasattr(p, 'placements'): + # Re-shard a rank-0 full tensor into this rank's DTensor + # placement. The full tensor is available on every rank + # because the checkpoint is a shared local file. + from torch.distributed.tensor import DTensor, Replicate + + full = DTensor.from_local( + value.to(device=p.device), + p.device_mesh, + [Replicate()] * len(p.placements), + run_check=False, + ) + local = full.redistribute(p.device_mesh, p.placements).to_local() + p.to_local().copy_(local) + else: + p.copy_(value.to(device=p.device, dtype=p.dtype)) + if optimizer is not None and payload.get('optimizer') is not None: + optimizer_state = payload['optimizer'] + try: + from torch.distributed.checkpoint.state_dict import StateDictOptions, set_optimizer_state_dict + + set_optimizer_state_dict( + model, + getattr(optimizer, 'optimizers', [optimizer]), + optimizer_state, + options=StateDictOptions(full_state_dict=True, broadcast_from_rank0=True), + ) + except Exception: + if world > 1: + raise + optimizer.load_state_dict(optimizer_state) + if scheduler is not None: scheduler.load_state_dict(payload['scheduler']) + if grad_scaler is not None: grad_scaler.load_state_dict(payload['grad_scaler']) + rng = payload['rng'] + cuda_rng = payload['cuda_rng'] + if isinstance(rng, list) and rng and torch.is_tensor(rng[0]): + rank = dist.get_rank() if dist.is_available() and dist.is_initialized() else 0 + rng = rng[min(rank, len(rng) - 1)] + cuda_rng = cuda_rng[min(rank, len(cuda_rng) - 1)] + torch.set_rng_state(rng) + # Each torchrun process owns one active CUDA device. Physical device + # order can change on restart without mapping RNG to the wrong GPU. + if torch.cuda.is_available(): + device = torch.cuda.current_device() + torch.cuda.set_rng_state(cuda_rng[min(device, len(cuda_rng)-1)], device=device) + print(f'WIDOWX_RESUMED step={payload["iteration"]} path={selected}', flush=True) + return int(payload['iteration']) diff --git a/releases/bridge-native-v3/code/scripts/widowx_config.py b/releases/bridge-native-v3/code/scripts/widowx_config.py new file mode 100644 index 0000000000000000000000000000000000000000..8c8568ee2057ee0440134aec5f8fb4428228d957 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_config.py @@ -0,0 +1,46 @@ +"""Incremental WidowX adaptation of the released Stage-2 Zeva policy.""" +import copy + +def register(): + from hydra.core.config_store import ConfigStore + from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_droid_nano import action_policy_droid_nano + from cosmos_framework.configs.base.experiment.action.posttrain_config.action_policy_robocasa365_atomic5_zeva import action_policy_robocasa365_atomic5_zeva + from cosmos_framework.data.generator.action.datasets.widowx_bridge_v3_dataset import get_action_widowx_sft_dataset + from cosmos_framework.utils.lazy_config import LazyCall as L + from scripts.widowx_checkpoint import WidowXDeltaCheckpointer + c = copy.deepcopy(action_policy_robocasa365_atomic5_zeva) + c.job.update(project='zeva', group='widowx', name='bridge_smoke', wandb_mode='offline') + c.dataloader_train = copy.deepcopy(action_policy_droid_nano.dataloader_train) + c.dataloader_train._target_ = 'scripts.widowx_data_resume.make_packing_loader' + c.dataloader_train.max_samples_per_batch = 1 + dl = c.dataloader_train.dataloader + dl.batch_size = 1 + dl.num_workers = 1 + dl.in_order = True + dl.datasets = dict(widowx=dict(ratio=1, dataset=L(get_action_widowx_sft_dataset)( + root='${oc.env:WIDOWX_DATASET}', feature_cache='${oc.env:WIDOWX_FEATURE_CACHE}', + max_episodes='${oc.env:WIDOWX_MAX_EPISODES,null}', + tokenizer_config='${model.config.vlm_config.tokenizer}', max_action_dim=64, + resolution='256'))) + c.optimizer.keys_to_select = ['action2llm', 'llm2action', 'action_modality_embed', + 'behavior_adapter', 'behavior_global_projector', 'behavior_pbd', 'proprio'] + c.optimizer.lr = 1e-5 + # Keep the release recipe's FusedAdam hyperparameters. The launcher swaps + # the unavailable Transformer-Engine implementation for FP32MasterAdamW, + # which has the same FP32-master update semantics. + c.optimizer.optimizer_type = 'FusedAdam' + c.scheduler.cycle_lengths = [2147483647] + c.scheduler.f_start = [1.0] + c.scheduler.f_max = [1.0] + c.scheduler.f_min = [1.0] + c.trainer.max_iter = 2147483647 + c.checkpoint.save_iter = 10000 + c.checkpoint.type = L(WidowXDeltaCheckpointer)() + c.model.config.compile.enabled = False + c.model.config.ema.enabled = False + # Let the runtime infer the FSDP shard degree from WORLD_SIZE. The old + # smoke override (shard=1, replicate=1) was valid only for one GPU and + # rejects a multi-rank launch in ParallelDims. + c.model.config.parallelism.data_parallel_shard_degree = -1 + c.model.config.parallelism.data_parallel_replicate_degree = 1 + ConfigStore.instance().store(group='experiment', package='_global_', name='action_policy_widowx_zeva', node=c) diff --git a/releases/bridge-native-v3/code/scripts/widowx_contract.py b/releases/bridge-native-v3/code/scripts/widowx_contract.py new file mode 100644 index 0000000000000000000000000000000000000000..a133892d1536747882cbf8a8e0f5feef687aace3 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_contract.py @@ -0,0 +1,107 @@ +"""Versioned, inexpensive provenance checks (not a full dataset integrity scan).""" +import hashlib +import json +import os +from pathlib import Path + +FEATURE_VERSION = 'widowx_causal_prefix_v2' +DATA_VERSION = 'widowx_all_starts_masked_v2' + + +def digest_file(path): + h = hashlib.sha256() + with Path(path).open('rb') as stream: + for block in iter(lambda: stream.read(1024 * 1024), b''): + h.update(block) + return h.hexdigest() + + +def signature(path): + path = Path(path).resolve() + if path.is_dir(): + return {'path': str(path), 'files': [signature(p) for p in sorted(path.rglob('*')) if p.is_file()]} + stat = path.stat() + # Large immutable model shards use size/mtime; small metadata uses SHA256. + return {'path': str(path), 'size': stat.st_size, 'mtime_ns': stat.st_mtime_ns, + 'sha256': digest_file(path) if stat.st_size < 32 * 1024**2 else None} + + +def feature_contract(root): + root = Path(root).resolve() + release = Path('/home/gpu4/tianyi/zeva-release/weights') + return dict(version=FEATURE_VERSION, dataset=str(root), + metadata={n: digest_file(root / 'meta' / n) for n in ('info.json', 'episodes.jsonl', 'tasks.jsonl')}, + image_key='observation.images.image_0', boundary_stride=4, + action_contract='bridge_q01_q99_xyzrpy_clipped_gripper_open_positive_v1', + cte_frame_encoding='single_frame_rgb_resize_480x832_wan_v1', + retrieval_prompt='release_robocasa_json_20fps_v1', + base=signature(os.environ.get('BASE_CHECKPOINT_PATH', release / 'stage2')), + cte=signature(release / 'stage1/zeva_cte.pt'), + bank=signature(release / 'stage1/train_memory_effect_v3.pt'), + retrieval=signature(release / 'stage3/best.pt'), + vae=signature(os.environ.get('WAN_VAE_PATH', '/home/gpu4/tianyi/models/wan22_vae/Wan2.2_VAE.pth'))) + + +def fingerprint(contract): + return hashlib.sha256(json.dumps(contract, sort_keys=True, separators=(',', ':')).encode()).hexdigest() + + +def ensure_manifest(root, directory): + directory = Path(directory) + contract = feature_contract(root) + expected = fingerprint(contract) + path = directory / 'manifest.json' + if path.exists(): + payload = json.loads(path.read_text()) + if payload.get('fingerprint') != expected or payload.get('contract') != contract: + raise ValueError(f'Feature cache contract changed; use a NEW cache directory: {directory}') + else: + if any(directory.glob('episode_*.pt')): + raise ValueError('Unversioned cache cannot be silently certified; use a new cache directory') + directory.mkdir(parents=True, exist_ok=True) + temporary = path.with_name(f'manifest.{os.getpid()}.tmp') + temporary.write_text(json.dumps(dict(fingerprint=expected, contract=contract), indent=2)) + temporary.replace(path) + return expected + + +def read_manifest(root, directory): + path = Path(directory) / 'manifest.json' + if not path.is_file(): + raise ValueError(f'Missing versioned feature manifest: {path}') + payload = json.loads(path.read_text()) + actual = feature_contract(root) + if payload.get('fingerprint') != fingerprint(actual) or payload.get('contract') != actual: + raise ValueError('Dataset/model feature fingerprint mismatch; rebuild into a new cache directory') + return payload['fingerprint'] + + +def training_contract(): + if os.environ.get('BRIDGE_STAGE2_BUNDLE'): + from scripts.bridge_stage2_data import read_bundle + bundle = Path(os.environ['BRIDGE_STAGE2_BUNDLE']).resolve() + manifest = read_bundle(bundle) + repo = Path(__file__).resolve().parents[1] + source_files = ('scripts/bridge_stage2_data.py', 'scripts/bridge_stage2_config.py', + 'scripts/train_bridge_stage2_pilot.py', + 'scripts/bridge_stage2_checkpoint.py', 'scripts/widowx_data_resume.py', + 'scripts/widowx_checkpoint.py', 'scripts/widowx_masked_loss.py', + 'scripts/fp32_master_adamw.py', 'scripts/train_widowx_zeva.py', + 'scripts/bridge_stage2_pilot.toml', + 'cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py') + return dict(version='bridge_stage2_pilot_train_v2', bundle=str(bundle), + feature_fingerprint=manifest['fingerprint'], + anchor_policy=manifest['contract']['anchor_policy'], + shuffle_seed=42, horizon=32, + train_episode_ids=manifest['contract']['episode_ids']['train'], + training_source_sha256={name: digest_file(repo / name) for name in source_files}, + base_signature=signature(os.environ['BASE_CHECKPOINT_PATH']), + probe_manifest_sha256=digest_file(bundle / 'probes_v1/manifest.json'), + warmstart_sha256=digest_file(os.environ['BRIDGE_STAGE2_WARMSTART'])) + root = Path(os.environ['WIDOWX_DATASET']).resolve() + cache = Path(os.environ['WIDOWX_FEATURE_CACHE']) + mode = os.environ.get('WIDOWX_WINDOW_MODE', 'full') + limit = os.environ.get('WIDOWX_MAX_EPISODES') + return dict(version=DATA_VERSION, dataset=str(root), window_mode=mode, stride=4, horizon=32, + max_episodes=int(limit) if limit else None, shuffle_seed=42, + feature_fingerprint=read_manifest(root, cache) if mode == 'full' else 'legacy_unversioned') diff --git a/releases/bridge-native-v3/code/scripts/widowx_data_resume.py b/releases/bridge-native-v3/code/scripts/widowx_data_resume.py new file mode 100644 index 0000000000000000000000000000000000000000..781788a0add04c9c00cd3fca0cd578637235a121 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_data_resume.py @@ -0,0 +1,72 @@ +"""Resume the last CONSUMED sample, not the worker's prefetched position.""" +from collections import deque +import torch +from torch.utils.data import IterableDataset, get_worker_info + +PENDING_CURSOR = None + + +class WidowXIterableDataset(IterableDataset): + def __init__(self, dataset, seed=42): + self._dataset = dataset + self.seed = seed + self.shard_rank = 0 + self.shard_world_size = 1 + self.resume_cursor = None + + def __len__(self): + return len(self._dataset) + + def __iter__(self): + worker = get_worker_info() + if worker is not None and worker.num_workers != 1: + raise ValueError('WidowX exact cursor resume currently requires one worker per rank') + blocks = self._dataset.get_shuffle_blocks() + rank, world = self.shard_rank, self.shard_world_size + epoch, block_pos, offset = 0, 0, 0 + if self.resume_cursor is not None: + epoch, block_pos, offset, saved_rank, saved_world = map(int, self.resume_cursor) + if (rank, world) != (saved_rank, saved_world): + raise ValueError('Data cursor topology changed; exact resume requires the same GPU count') + while True: + order = torch.randperm(len(blocks), generator=torch.Generator().manual_seed(self.seed + epoch)).tolist()[rank::world] + if not order: + raise ValueError('More ranks than episodes') + for position in range(block_pos, len(order)): + start, length = blocks[order[position]] + for j in range(offset if position == block_pos else 0, length): + sample = self._dataset[start + j] + sample['widowx_data_cursor'] = torch.tensor([epoch, position, j + 1, rank, world], dtype=torch.int64) + yield sample + epoch, block_pos, offset = epoch + 1, 0, 0 + + +def make_packing_loader(*args, **kwargs): + from cosmos_framework.data.generator.joint_dataloader import PackingDataLoader + + class ResumablePackingLoader(PackingDataLoader): + def set_start_iteration(self, iteration): + super().set_start_iteration(iteration) + global PENDING_CURSOR + if PENDING_CURSOR is None: + return + if self.max_samples_per_batch != 1: + raise ValueError('Exact WidowX cursor currently requires one sample per packed batch') + inner = self.dataloader_list[0] + loader = inner.dataloader + # Cosmos prewarms before loading checkpoints. Discard those + # buffered samples and restart only our own DataLoader workers. + iterator = getattr(loader, '_iterator', None) + if iterator is not None: + iterator._shutdown_workers() + loader._iterator = None + inner.dataset.resume_cursor = PENDING_CURSOR + rng = torch.get_rng_state() + self.buffers = [deque()] + self.dataloaders = [iter(inner)] + self._prewarm_dataloaders() + torch.set_rng_state(rng) + print(f'WIDOWX_DATA_RESUMED cursor={PENDING_CURSOR}', flush=True) + PENDING_CURSOR = None + + return ResumablePackingLoader(*args, **kwargs) diff --git a/releases/bridge-native-v3/code/scripts/widowx_masked_loss.py b/releases/bridge-native-v3/code/scripts/widowx_masked_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..ddde698bcf7d62233aaf33f6fccb1beca00b643c --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_masked_loss.py @@ -0,0 +1,79 @@ +"""WidowX-scoped tail masks; never turn padded targets into clean conditions.""" +from contextvars import ContextVar +from functools import wraps +import os +import torch + +_MASKS = ContextVar('widowx_training_masks', default=None) + + +def batch_vectors(value): + if torch.is_tensor(value): + if value.ndim == 1: + return [value] + return [v.reshape(-1) for v in value] + return [torch.as_tensor(v).reshape(-1) for v in value] + + +def mask_loss_conditions(conditions, masks): + if len(conditions) != len(masks): + raise ValueError('Tail mask batch size mismatch') + result = [] + for condition, valid in zip(conditions, masks): + if len(condition) != valid.numel(): + raise ValueError('Tail mask time axis mismatch') + valid = valid.to(device=condition.device, dtype=torch.bool).reshape(condition.shape[0], *([1] * (condition.ndim - 1))) + result.append(torch.where(valid, condition, torch.ones_like(condition))) + return result + + +def install(): + import cosmos_framework.model.generator.omni_mot_model as module + cls = module.OmniMoTModel + if getattr(cls, '_widowx_masked_loss_installed', False): + return + original_train, original_flow = cls.training_step, cls._compute_flow_matching_loss + original_prior = module.gaussian_prior_nll + + @wraps(original_train) + def training_step(self, data_batch, iteration): + masks = None + if 'widowx_action_valid' in data_batch: + masks = dict(action=batch_vectors(data_batch['widowx_action_valid']), + vision=batch_vectors(data_batch['widowx_vision_valid'])) + token = _MASKS.set(masks) + try: + result = original_train(self, data_batch, iteration) + if 'widowx_data_cursor' in data_batch: + self._widowx_data_cursor = batch_vectors(data_batch['widowx_data_cursor'])[-1].cpu().tolist() + if os.environ.get('WIDOWX_TRACE_BATCHES') == '1': + samples = [v.cpu().tolist() for v in batch_vectors(data_batch['widowx_episode_start'])] + print(f'WIDOWX_BATCH iteration={iteration} samples={samples} ' + f'action_valid={[int(v.sum()) for v in masks["action"]]} ' + f'vision_valid={[int(v.sum()) for v in masks["vision"]]} ' + f'next_cursor={self._widowx_data_cursor}', flush=True) + return result + finally: + _MASKS.reset(token) + + @wraps(original_flow) + def flow(self, *args, **kwargs): + masks = _MASKS.get() + if masks is not None: + if args: + raise ValueError('WidowX masked flow requires named arguments') + kind = 'action' if kwargs.get('raw_action_dim') is not None else 'vision' + kwargs['condition_mask'] = mask_loss_conditions(kwargs['condition_mask'], masks[kind]) + kwargs['normalize_by_active'] = True + return original_flow(self, *args, **kwargs) + + @wraps(original_prior) + def prior(target, mean, std, valid=None): + masks = _MASKS.get() + if masks is not None: + valid = torch.stack(masks['action']).to(device=target.device, dtype=torch.bool) + return original_prior(target, mean, std, valid) + + cls.training_step, cls._compute_flow_matching_loss = training_step, flow + module.gaussian_prior_nll = prior + cls._widowx_masked_loss_installed = True diff --git a/releases/bridge-native-v3/code/scripts/widowx_policy_server.py b/releases/bridge-native-v3/code/scripts/widowx_policy_server.py new file mode 100644 index 0000000000000000000000000000000000000000..d3cfa55d489f3e535a3b2dee76e52e360d47e9d7 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_policy_server.py @@ -0,0 +1,167 @@ +"""Zeva WidowX server: load release weights and optional trained delta.""" +import argparse +import json +import os +from pathlib import Path +import numpy as np +import torch +from cosmos_framework.scripts.action_policy_server_robocasa365_zeva import ( + RobolabPolicyService, RobolabServerArgs, _load_openpi_websocket_policy_server, + _resize_rgb_uint8, _extract_observation_image) +from cosmos_framework.model.zeva import ( + CausalTransitionEncoder, CausalTransitionEncoderConfig, normalize_cte_state_dict) +from scripts.bridge_recovery_contract import ( + ACTION_CONTRACT_ID, CTE_PREPROCESS_ID, cte_identity, + encode_cte_single_frame, require_matching_stage2, sha256_file, +) + +class WidowXService(RobolabPolicyService): + def __init__(self, args, memory_mode='on', stage2_binding=None, stage2_delta=None): + if memory_mode not in ('on', 'bank_off'): + raise ValueError('memory_mode must be on or bank_off') + self._bridge_cte_identity = None + checkpoint_path = getattr(args, 'cte_checkpoint', None) + if checkpoint_path is not None and Path(checkpoint_path).is_file(): + cte_payload = torch.load(checkpoint_path, map_location='cpu', weights_only=False) + if cte_payload.get('format') == 'bridge_cte_stage1_v1': + split = Path(checkpoint_path).parent.parent / 'split.json' + if not split.is_file(): + raise ValueError(f'Bridge CTE split identity is missing: {split}') + identity = cte_identity(cte_payload, checkpoint_path, split) + if stage2_binding is None: + raise ValueError('Bridge CTE requires a Stage-2 feature binding; release Stage-2 is incompatible') + require_matching_stage2(stage2_binding, identity) + if stage2_delta is None or stage2_binding.get('stage2_delta_sha256') != sha256_file(stage2_delta): + raise ValueError('Stage-2 binding must identify the exact policy delta') + if memory_mode == 'on': + expected_bank = stage2_binding.get('task_context_bank_sha256') + expected_head = stage2_binding.get('static_retrieval_head_sha256') + if not expected_bank or expected_bank != sha256_file(args.task_context_bank): + raise ValueError('Stage-2 binding does not match the task-context bank') + if not expected_head or expected_head != sha256_file(args.static_task_context_checkpoint): + raise ValueError('Stage-2 binding does not match the static retrieval head') + self._bridge_cte_identity = identity + self._memory_mode = memory_mode + super().__init__(args) + + def _init_zeva(self, args): + if self._memory_mode == 'on': + return super()._init_zeva(args) + # The ablation removes only the EXTERNAL task-context bank. Real + # within-episode phase/effect history and trained policy weights remain. + # Neither the RoboCasa bank nor its retrieval head is loaded here. + if args.cte_checkpoint is None or self.model.net.behavior_pbd is None: + raise ValueError('bank_off still requires the CTE and Zeva policy heads') + device = next(self.model.parameters()).device + payload = torch.load(args.cte_checkpoint, map_location='cpu', weights_only=False) + config = dict(payload['model_config']) + state = payload['model'] + if any(key.endswith('mixer.weight_ih_l0') for key in state): + config['use_mamba'] = False + elif any(key.endswith('mixer.A_log') for key in state): + config['use_mamba'] = True + self._cte = CausalTransitionEncoder(CausalTransitionEncoderConfig(**config)).to(device) + self._cte.load_state_dict(normalize_cte_state_dict(state)) + self._cte.eval() + if self._cte.cfg.action_dim != self.cfg.action_dim: + raise ValueError('CTE and policy action dimensions differ') + self._task_context = torch.zeros((1, self.model.net.behavior_pbd.cfg.global_dim), device=device) + self._static_task_context_enabled = False + self._bit_mode = args.bit_mode + self._zeva_enabled = True + print('WIDOWX_MEMORY_MODE bank_off: no external bank/head loaded; ' + 'global=zero; CTE/BIT and all policy weights preserved', flush=True) + + def _encode_bridge_cte_frame(self, image): + """Stage-1 Bridge CTE pixels only; static retrieval keeps its release path.""" + device = next(self.model.parameters()).device + return encode_cte_single_frame(self.model.encode, image, device) + + def _causal_interaction_features(self, obs, image): + if 'cte_transition_valid' not in obs: + return super()._causal_interaction_features(obs, image) + if self._bridge_cte_identity is None: + if obs.get('cte_action_contract_id') == ACTION_CONTRACT_ID: + raise ValueError('Reached-delta history cannot be passed to the release RoboCasa CTE') + elif (obs.get('cte_action_contract_id') != ACTION_CONTRACT_ID + or obs.get('cte_preprocess_id') != CTE_PREPROCESS_ID): + raise ValueError('Online CTE action/visual contract differs from its Bridge Stage-1 checkpoint') + rgb = np.asarray(obs['cte_boundary_images']) + actions = np.asarray(obs['cte_transition_actions'], dtype=np.float32) + mask = np.asarray(obs['cte_transition_valid'], dtype=bool) + if actions.shape != (len(rgb)-1,4,7) or mask.shape != actions.shape[:-1]: + raise ValueError('Invalid causal history / transition mask') + if not np.isfinite(actions).all(): + raise ValueError('Non-finite causal history') + if len(mask) and (not mask[:-1].all() or np.any(mask[-1,1:] > mask[-1,:-1])): + raise ValueError('Only a causal partial final transition is allowed') + encode_frame = self._encode_bridge_cte_frame if self._bridge_cte_identity else self._encode_cte_frame + frames = torch.stack([encode_frame(frame) for frame in rgb]).unsqueeze(0) + a = torch.as_tensor(actions, device=frames.device).unsqueeze(0) + valid = torch.ones(frames.shape[:2], dtype=torch.bool, device=frames.device) + transition_valid = torch.as_tensor(mask, device=frames.device).unsqueeze(0) + with torch.autocast('cuda', dtype=torch.bfloat16): + encoded = self._cte(frames, a, valid, transition_valid) + completed = encoded['effect_post'][0][encoded['effect_complete'][0]].float() + history = torch.zeros((1,4,self._cte.cfg.effect_dim), device=frames.device) + history_valid = torch.zeros((1,4), dtype=torch.bool, device=frames.device) + take = min(4, len(completed)) + if take: + history[0,-take:] = completed[-take:] + history_valid[0,-take:] = True + if self._bit_mode == 'zero': + history.zero_() + elif self._bit_mode == 'shuffled' and take > 1: + history[0,-take:] = history[0,-take:].flip(0) + global_feature = self._task_context_from_initial_observation(rgb[0], str(obs['prompt'])) + return global_feature, encoded['phase'][:,-1].float(), history, history_valid + + def _build_sample(self, obs): + image = _resize_rgb_uint8(_extract_observation_image(obs), (256,256)) + video = torch.zeros((3,33,256,256), dtype=torch.uint8) + video[:,0] = torch.from_numpy(image.copy()).permute(2,0,1) + p = np.asarray(obs['observation/proprio'], dtype=np.float32) + if p.shape != (9,) or not np.isfinite(p).all(): raise ValueError('invalid WidowX proprio') + sample = dict(ai_caption=obs['prompt'],video=video,action=torch.zeros(32,7), + conditioning_fps=torch.tensor(5),mode='wam',domain_id=torch.tensor(7), + viewpoint='ego_view',proprio=torch.from_numpy(p)) + sample = self._transform(sample, '256') + if isinstance(sample['ai_caption'],dict): sample['ai_caption'] = json.dumps(sample['ai_caption']) + return sample + +def main(): + p=argparse.ArgumentParser(); p.add_argument('--delta'); p.add_argument('--port',type=int,default=18765) + p.add_argument('--cte-checkpoint',default='/home/gpu4/tianyi/zeva-release/weights/stage1/zeva_cte.pt') + p.add_argument('--stage2-binding',help='JSON proving exact Stage-2 feature/delta compatibility for a Bridge CTE') + p.add_argument('--num-steps',type=int,default=4,help='number of UniPC denoising steps per prediction') + p.add_argument('--guidance',type=float,default=3.0) + p.add_argument('--memory-mode',choices=('on','bank_off'),default='on') + a=p.parse_args(); root=Path('/home/gpu4/tianyi/zeva-release/weights') + if a.num_steps < 1: + p.error('--num-steps must be positive') + service=WidowXService(RobolabServerArgs( + checkpoint_path=str(root/'stage2'),allow_dcp_checkpoint=True, + output_dir=Path(os.environ.get('WIDOWX_POLICY_OUTPUT_DIR', f'/tmp/widowx_server_{a.port}')), + experiment='action_policy_robocasa365_atomic5_zeva', + experiment_overrides=['model.config.tokenizer.vae_path='+os.environ['WAN_VAE_PATH'], + 'model.config.vlm_config.tokenizer.pretrained_model_name='+os.environ['QWEN_VLM_PATH']], + task_context_bank=root/'stage1/train_memory_effect_v3.pt',cte_checkpoint=Path(a.cte_checkpoint), + static_task_context_checkpoint=root/'stage3/best.pt',domain_name='bridge_orig_lerobot', + image_height=256,image_width=256,resolution='256',conditioning_fps=5,action_dim=7,use_state=False, + num_steps=a.num_steps,guidance=a.guidance), memory_mode=a.memory_mode, + stage2_binding=json.loads(Path(a.stage2_binding).read_text()) if a.stage2_binding else None, + stage2_delta=a.delta) + if a.delta: + payload=torch.load(a.delta,map_location='cpu',weights_only=False) + named=dict(service.model.named_parameters()) + with torch.no_grad(): + for name,value in payload['model'].items(): + param=named[name] + if hasattr(param,'to_local'): param=param.to_local() + param.copy_(value) + print('LOADED_DELTA',payload['iteration'],flush=True) + print(f'WIDOWX_EVAL_MEMORY_MODE={a.memory_mode}',flush=True) + _load_openpi_websocket_policy_server()(policy=service,host='127.0.0.1',port=a.port, + metadata={'memory_mode':a.memory_mode}).serve_forever() + +if __name__=='__main__': main() diff --git a/releases/bridge-native-v3/code/scripts/widowx_rollout.py b/releases/bridge-native-v3/code/scripts/widowx_rollout.py new file mode 100644 index 0000000000000000000000000000000000000000..4555e308cb0fef9b478bb590562343000ac2f789 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_rollout.py @@ -0,0 +1,34 @@ +"""Control-rate history independent of how often the policy is queried.""" +import numpy as np +from scripts.bridge_recovery_contract import ( + ACTION_CONTRACT_ID, CTE_PREPROCESS_ID, normalize_reached_delta, +) + + +class CausalHistory: + def __init__(self, first_image): + self.frames = [first_image] + self.transitions = [] + self.partial = [] + + def append_reached_delta(self, measured_reached_delta_raw, next_image): + """Append one completed observed transition; never accept a command.""" + self.partial.append(normalize_reached_delta(measured_reached_delta_raw)) + if len(self.partial) == 4: + self.transitions.append(np.stack(self.partial)) + self.frames.append(next_image) + self.partial = [] + + def request(self, current_image): + # Only actual four-control boundaries entered Stage-1 training. Keep + # partial controls pending rather than pretending the present image is + # the next completed boundary or a finished 16-control effect. + if np.asarray(current_image).shape != np.asarray(self.frames[0]).shape: + raise ValueError("Current and initial CTE camera images differ in shape") + return dict(cte_boundary_images=np.stack(self.frames), + cte_transition_actions=np.asarray(self.transitions, np.float32).reshape(-1, 4, 7), + cte_transition_valid=np.ones((len(self.transitions), 4), bool), + cte_action_contract_id=ACTION_CONTRACT_ID, + cte_preprocess_id=CTE_PREPROCESS_ID, + cte_completed_control_steps=4 * len(self.transitions), + cte_pending_control_steps=len(self.partial)) diff --git a/releases/bridge-native-v3/code/scripts/widowx_smoke.toml b/releases/bridge-native-v3/code/scripts/widowx_smoke.toml new file mode 100644 index 0000000000000000000000000000000000000000..e725cd952c6b1558f6cdb62eebbfe73b11a89ce0 --- /dev/null +++ b/releases/bridge-native-v3/code/scripts/widowx_smoke.toml @@ -0,0 +1,26 @@ +[job] +task = "vfm" +experiment = "action_policy_widowx_zeva" +project = "zeva" +group = "widowx" +name = "bridge_smoke" +wandb_mode = "offline" +[model] +precision = "bfloat16" +[model.parallelism] +data_parallel_shard_degree = -1 +data_parallel_replicate_degree = 1 +[model.activation_checkpointing] +mode = "full" +[model.tokenizer] +vae_path = "${oc.env:WAN_VAE_PATH}" +[optimizer] +lr = 1e-5 +[dataloader_train] +max_samples_per_batch = 1 +[trainer] +max_iter = 2147483647 +logging_iter = 10 +[checkpoint] +load_path = "${oc.env:BASE_CHECKPOINT_PATH}" +save_iter = 10000 diff --git a/releases/bridge-native-v3/code/zeva_bridge_recovery_agent_plan_v2.md b/releases/bridge-native-v3/code/zeva_bridge_recovery_agent_plan_v2.md new file mode 100644 index 0000000000000000000000000000000000000000..1b56a43973193b50c6413f0e80044520640456e9 --- /dev/null +++ b/releases/bridge-native-v3/code/zeva_bridge_recovery_agent_plan_v2.md @@ -0,0 +1,257 @@ +# ZeVA / Bridge 接续复现任务书 v2:保留现有训练,先修兼容性 + +## 0. 依据、目标和执行边界 + +依据:用户贴出的 agent 审计快照,而非本任务书作者直接读取的服务器状态。快照记录 CTE 约 21,430 steps,最后完整 checkpoint 为 20k;14k / 20k validation total 为 0.348 / 0.366;磁盘可用约 16 GB。执行前必须刷新状态,不能把快照当作实时状态。 + +当前选定主线:IPEC Bridge 的 reached-state-delta 7D 表示、256×256 单帧 Wan VAE、现有 CTE 架构、现有 legacy 分位缩放与 gripper 二值化。目的是先得到接口一致、可诊断的目标域迁移版本,不把它描述成作者原配置逐项复现。 + +本文件更新旧 Stage 1 建议:不以是否使用 480×832、90/5/5 划分、预先 VAE 缓存或 10k 步上限,作为现有权重科学有效性的必要条件。保留已有实验事实,先解决动作、视觉、特征版本和加载契约;不能通过改名假装旧实验满足未执行的规范。 + +**默认执行范围**:只读审计;在隔离分支/目录补充兼容性代码、测试与离线诊断;最多使用一张确认空闲且未被其他任务占用的 GPU,默认总墙钟预算 2 小时,预算到则报告已完成和未完成项。该预算是执行限制,不是耗时预测。不能抢占其他任务。 + +**默认不授权**:终止现有作业、删除任何 checkpoint / 数据 / 大文件、启动新的梯度训练、全量缓存、Stage 2 正式训练、PIM 正式评测。对这些动作输出准确对象、预估资源和命令,等用户显式批准。用户若授权停止现有 CTE,只能停止经核实属于该 run 的 launcher / job,不能按名称批量杀 Python。 + +新建 `.artifacts/bridge_zeva_recovery_v2/` 或实际可写的隔离输出目录,不覆盖 `.artifacts/bridge_cte_stage1_20260924/` 和 `.artifacts/ipec_full/`。不得假设训练文件的当前行号仍然有效;按函数定位。 + +## 1. P0:先审计运行、存储和产物 + +1. 记录时间与时区、运行 job / launcher / rank PID、启动命令、GPU 型号与分配、实际 step 和该 step 是 microbatch 还是 optimizer update、最近 checkpoint、日志增长速度、剩余空间和 quota。 +2. 查明默认约 21 亿步从何而来,以及是否有监督进程自动重启、checkpoint 保留策略、scheduler 的实际 horizon。 +3. 不自动启动新训练。建议用户授权保存或确认已有完整 checkpoint 后,优雅停止这一个无界 CTE 作业。 +4. 检查已有 10k/12k/14k/16k/20k 或其他实际存在的 checkpoint,记录可加载性;不存在就写不存在,不能假定每个 step 都有文件。优先保护原最低 loss 对应 checkpoint 和最近完整 checkpoint。 +5. 保存小型 provenance:完整配置、源码 diff、git commit、normalization 常数、split、metrics、优化器/EMA/scaler/sampler/RNG 状态是否包含在 checkpoint 中。不能把不含 optimizer 的模型文件称为可精确 resume。 +6. 先统计 checkpoint 大小 S,再决定是否还能保存新 checkpoint。建议保留余量至少为 max(30 GiB, 2*S+5 GiB),这是可修改的保守预算,不是官方要求。空间不足时不要强写最后一次 checkpoint;优先保护并验证已有完整版本。 +7. 不在仅余约 16 GB 的卷上创建全量 VAE cache。只估算大小或写预算内验证子集到用户允许的卷。迁移文件需要用户许可,复制后核验 hash,不能擅自删除原件。 + +产物:`run_snapshot.json`、`checkpoint_inventory.json`、`storage_plan.md`、`source_snapshot.patch`。 + +## 2. 保留什么,修复什么 + +| 项目 | 本轮决策 | +|---|---| +| 256×256 CTE 图像 | 保留,在线 CTE 改成相同处理;不连带修改 policy / retrieval 图像路径 | +| Legacy Q01/Q99 和 clipping | 先精确保留,序列化并审计来源、比例;不在旧 checkpoint 下替换 normalizer | +| 98%/2% train/val | 保留用于当前 run 诊断;不能事后从已见 train 造出独立 test | +| 8 卡和已经训练的 20k steps | 记录事实,不因此判废;不继续无界跑 | +| 未预先缓存 VAE | 不是模型正确性的否定证据;缓存是效率/复现手段 | +| Command 写入 reached-delta CTE | 必须修复 | +| 480×832 在线 CTE 输入 | 必须与当前 256×256 checkpoint 对齐 | +| CTE / bank / Stage 2 版本混用 | 必须阻止,维度相同不等于语义兼容 | +| 离线诊断、delta 加载证据缺失 | 补齐后才决定下一阶段训练 | + +## 3. P1:锁定动作契约,分开两条数据流 + +定义命令 u_t 与 CTE 的历史输入 r_t: + +``` +policy 输出 → policy decoder / unnormalize / control conversion → u_t → env.step + ↓ + 执行前 robot state、执行后 robot state、实际关联的 gripper 指令 + ↓ + 还原 Bridge 坐标和旋转约定 → r_t → legacy CTE normalize + ↓ + CTE completed history +``` + +r_t 的前六维是已完成区间的 Bridge-style reached pose 差分;第七维沿用经过核实的 gripper 语义,不计算 gripper 状态差来顶替命令/重标开闭标签。 + +### 3.1 离线核验 + +- 复现报告中的 action[:6] 与 state[t+1,:6]-state[t,:6] 对应,按任务/episode 记录分维误差、时间偏移和末端行处理。 +- 验证源 gripper 的 0/1 开闭含义,记录转换前后的开闭例子。`g>0.5 → +1` 是数值映射,不自动证明 +1 在模拟器中也是相同语义。 +- 调查离线夹爪是否做过依赖后续标签的平滑/二值化;在线不能读取未来。若仅在切换边界存在差异,报告并为下一版设计因果可用的重标规则;不能宣称逐元素完全匹配而不测试。 +- 保留 source action、legacy normalized action、clipping flag,不能重复归一化或再次 relabel。 + +### 3.2 在线状态来源 + +- 先查看本地 observation 字段与 robot proprioception 接口;需要时可用观测到的 joint positions + 经校验 FK 获取真实末端 pose。 +- 不使用 controller.target_pose、命令累积的目标位置或未来模型预测冒充 measured/reached pose。 +- 校验 base/world reference frame、TCP/link offset、单位、旋转表示、Euler 顺序与分支、四元数顺序、时间采样时刻。 +- Bridge 的 Euler 分量差不能直接替换成 quaternion 分量差、axis-angle 或 SO(3) logarithm;这会改变旧 CTE 的输入定义。跨 ±pi 的处理也必须与离线定义一致;若原表示确有缺陷,另开新 contract 和训练版本。 +- 额外使用机器人自身状态必须写入评测协议,比较模型应有相同可用输入;禁止用物体真值 pose、目标 pose、未来 reward / success 作为 CTE 的捷径输入。 +- 本地若无法获得并校验所需 reached state,标记 `BLOCKED_ONLINE_STATE_CONTRACT`。CTE 离线工作可以继续,但不能用 command 悄悄替代完成在线验收。 + +### 3.3 时间组织 + +每个原始控制步保存 before/after 观测时间与真实 command,再计算 r_t。每 4 个已完成动作构建 transition,每 4 个完整 transition 构建 effect,沿用当前模型定义。episode reset 清理历史与 pending,未满窗口不伪造完整 effect。少于 16 个控制步的 rollout 不能验收 effect/BIT 已起作用。 + +### 3.4 Legacy normalizer + +将代码中实际常数与逻辑原样导出为 `action_normalizer_legacy_v0.json`: + +``` +kind: per_dim_quantile_clip +source: legacy_source_code +fitted_on_current_train_split: false +q01: <实际六维数组> +q99: <实际六维数组> +clip_range: [-1, 1] +gripper: <实际阈值和开闭约定> +``` + +计算仅用原训练 split 的审计统计,但本轮不要替换旧 normalizer。报告来源可追溯性及分维、分任务、分阶段 clipping 比例。2.1% 总体裁剪率本身不构成失败判据。无法追溯来源不自动证明测试泄漏,但必须诚实记录不确定性。 + +不把裁剪后的数据声称可精确逆变换;policy 反归一化映射端点是既定 decoding 规则,不是恢复原极端值。CTE 和 policy normalizer 使用不同名字/API,即便目前系数相同也不混淆输入物理语义。 + +## 4. P1:锁定视觉契约,保护 policy / retrieval 路径 + +本轮 CTE 固定训练时实际使用的单视角 256×256 路径,记录相机、RGB 顺序、crop/resize、插值、归一化、VAE 权重 hash、wrapper、latent scale/mean/std、dtype、单帧 cache reset 与 latent shape。 + +分别定义: + +``` +cte_preprocess_id +policy_preprocess_id +static_retrieval_preprocess_id +``` + +不得为了修复 CTE,修改全局 image_size,导致已有 policy 也从其原分辨率变成 256×256。尽量从原始同一 RGB 分流,而非先走 policy resize 再缩回 CTE 输入。 + +参考 ZeVA server 中 `_task_context_from_initial_observation()` 也调用 `_encode_cte_frame()`。因此要拆分函数或增加显式分支,不能直接全局替换硬编码而让静态检索头输入悄悄改变。 + +以同一组保存下来的真实 Bridge 帧做 golden fixtures,分别通过离线和在线 CTE preprocess 比较 latent,再比较 CTE phase/effect。采用同设备/同dtype的参考结果确定数值容差;BF16与FP32差异单独报告。证明同一输入走两条代码路径等价,不要求真实 Bridge 图像与仿真图像数值相等。 + +## 5. P2:先诊断已有 checkpoint,不增加梯度训练 + +优先评估实际存在的 14k / 20k,并加一个较早 checkpoint 或可重建的随机初始化作为对照。14k 暂时只是 val-total 候选最佳,不直接指定 winner。 + +冻结原 validation episode 清单。第一轮可固定其中 128~256 条且分层覆盖任务/轨迹长度/夹爪事件;对比时使用相同样本、相同窗口和候选集合。最终可扩展至全部现有 validation。 + +### 5.1 重查本地 loss + +比对 `scripts/bridge_cte_loss.py` 与固定参考 commit 的 `cte_losses.py`。确认 local 实现是否删减/重加权 loss,跨 GPU task gather 是否有预期梯度,是否正确排除 self-pairs / singleton classes,空 effect 是否返回零却被误解释为完美预测,以及 padding 是否参与分母。记录 contrastive 真正候选数与正样本数;gradient accumulation 不自动扩大单次 InfoNCE 候选集。 + +不能在单卡评估时改变候选池大小,然后把得到的 NCE loss 和8卡训练验证日志直接比较。原日志2.283→0.348→0.366是已有事实,重新评估报告另列协议。 + +### 5.2 必报指标 + +- total 与原始全部分项;每类 loss 有效样本数;训练/验证 gap;真实 optimizer steps、samples_seen、LR。 +- effect_outcome_pre → 固定 visual-delta target 的固定候选 Recall@1/5;post 分支作为诊断而非预测能力的唯一证明。 +- 分别打乱运动六维、夹爪一维、整段 action,保留其余条件;优先同任务/相近起始状态的不同 episode 替换,减少明显 OOD corruption。没有足够此类数据时如实记录。 +- 分析 effect_pre / outcome_pre 的差异;effect_post 是视觉结果分支,固定图像时本来就不直接依赖 action,不得把它不变判成 bug。 +- `effect_post_raw` 的分维 std、非对角 cosine 分布、中心化 effective rank;按任务/动作阶段汇总。低样本数下 rank 上限受样本数约束,不能用一个绝对阈值机械验收。 +- phase 进度指标对照随机初始化/时间进度基线;这不是人工语义阶段准确率,不能从单调性就证明“抓取阶段对齐”。 +- task retrieval query/gallery 跨原始 episode,报告标签可评估覆盖率与类别不平衡基线。 +- 夹爪开/闭与切换窗口分层的 next_action error,以及运动/夹爪分别 ablate 的指标。夹爪参与 loss 不代表稀少的闭合/打开事件学得好。 + +固定 visual-delta target 的 projection buffer hash 要一致。EMA target 变化会让 `vision` loss 跨 checkpoint 的解释变复杂,不能用它单独挑选模型。 + +### 5.3 结论级别 + +允许:`ENGINEERING_PASS`、`OFFLINE_LEARNING_EVIDENCE`、`CTE_USABLE_FOR_STAGE2_PILOT`。 + +不能仅凭单一 loss 或输入 shuffle 宣称严格因果识别。reached delta 已含该动作区间实际运动信息,shuffle 效应只能说明依赖/关联,不是控制命令的反事实预测能力。 + +若两份权重都健康且指标接近,优先选择较早、在预先指定主指标上不劣的 checkpoint,记录统计不确定性;不要随意重组 composite score 追逐最优结果。若诊断异常,先定位,再提出不超过2000个额外更新、带墙钟上限的新训练分支供用户批准,而非继续当前无界作业。 + +## 6. P2:划分和留出集的正确处理 + +98%/2% 可用于当前 run 诊断,不强制立即90/5/5重训。把原val一直用于checkpoint选择,就不能再称它为最终独立 test。 + +不要从已经参与过 CTE 训练的98%里抽5%,沿用当前权重后称它“heldout”。还要核实旧 ipec_full Stage2、normalizer、static bank、retrieval head 是否看过相同 episode。独立性必须按所有可影响模型的阶段计算,不能只查 CTE loader。 + +将来正式报告可选:新的从未使用数据;或为一条新且独立的实验完整重跑新的train/val/test协议。当前pilot报告标明只有现有验证集,不伪造独立测试结果。 + +## 7. P3:CTE产物导出与特征版本固定 + +选定 CTE 后保存组合 manifest,至少包含: + +``` +cte checkpoint hash / model config +VAE hash / cte_preprocess_id +action_contract_id / normalizer hash +split hash / source dataset revision +R=4 / K=4 / fps=5 +code commit + dirty diff hash +``` + +先按需要导出少量训练与验证 episode 的 frozen CTE features。包含 episode_id、boundary raw indices、phase/state/retrieval、effect_post、effect_start/end raw indices、complete mask。记录 effect 的 availability index:t_end 之前不能被policy读到。 + +用同一轨迹的若干在线前缀重算,与完整轨迹导出的因果可用字段比较。不能把episode全轨迹平均特征假装当前时刻可用的history。 + +不必导出全量 VAE latent 才能进入小规模 Stage2;确定性的 on-the-fly 编码和有hash的按需缓存均可。训练库与验证特征物理隔离,磁盘预算先于批量导出。 + +如需构建新的 static task-context bank,先找到本地实际 builder 和原条目定义。找不到时明确是新设计,不能声称原始作者 builder 已复现。不能把新CTE的128维key/256维value直接与旧retrieval head或旧policy混用。 + +## 8. P3:旧 ipec_full Stage 2 的兼容性和 delta 审计 + +已有44个被选中参数张量不是44个标量,也不能据此估计可训练参数量。输出完整参数名、numel、dtype、是否进入optimizer、是否真实更新。冻结的主干没有grad/没有更新,应以代码及参数差异证据确认。 + +记录以下完整依赖: + +``` +base checkpoint 精确来源、revision/hash +Stage2 delta 的实际保存语义:replacement tensors 还是 arithmetic differences +Stage2配置、policy动作decoder和normalizer、proprio定义 +训练时的CTE checkpoint / features hash +static bank hash / retrieval head hash +policy、CTE、retrieval三条视觉契约 +``` + +加载顺序:正确 base → 匹配架构 → 按真实保存格式合并 delta。若文件保存完整参数值就覆盖,不是做加法。对selected keys严格核对expected/missing/unexpected/shape;未选中的主干由base提供,不要求partial delta自身包含全部网络。加载完成后对相同输入与原训练导出/已知推理参考比对。 + +新CTE与旧CTE即便输出维度相同,也可能有不同latent坐标和语义。只能在已确认特征生产者完全一致时直接使用旧Stage2;否则旧delta作为初始化,必须在新固定CTE特征下重新适配相关模块,并同步刷新bank/retrieval接口。不能只重新导出cache就宣称旧策略已读懂新latent。 + +旧Stage2还需排查:训练时是否真正使用了非零、正确来源的behavior_*;归一化/动作64维padding mask;gripper decoder;domain_id;proprio字段、单位与坐标;policy图像与训练是否一致。 + +## 9. 下一轮训练的建议顺序(另行授权,不默认执行) + +### 9.1 先做有界 Stage2 小样本检查 + +CTE离线证据及输入契约通过后,固定一个checkpoint,不再同时更新CTE。用16~32条训练episode,先50-step工程smoke,再最多500 optimizer updates的小样本拟合;每50~100步输出action各维和gripper切换指标、可训练参数梯度与更新量,另设墙钟上限。具体batch和GPU数由资源审计决定,不能保证8B模型单卡可训练。 + +首先沿用已选择的action/proprio/behavior注入模块,不自动解冻整个Qwen。若明显无法拟合,要先检查数据、mask、normalizer、噪声时间步和delta加载。通过正确性检查后仍不足,再提出扩展generation branch或LoRA的独立pilot;不把扩展称为当前官方配置的原样复现。 + +### 9.2 SimplerEnv smoke + +用户批准后用3~5个完整episode检查接线,不称正式成功率。检查命令方向与夹爪、真实reached pose、每4步transition、每16步effect valid、reset、action queue的已执行/未执行区分。 + +CTE在线可用的robot state须写入输入协议。若对照策略原先只看RGB,公平比较必须控制新增proprio通道,不能把额外状态优势解释成记忆收益。 + +### 9.3 进入小规模性能pilot + +接线通过后才跑500~2000个额外Stage2 updates的有界pilot。使用开发episode/seed选择配置,保留正式评测协议与测试种子不调参。先建立有基本控制能力的策略再加PIM。 + +只有matched学习对照才能支持memory贡献:相同base、数据、可训练参数预算、输入和控制协议的有记忆/无记忆训练。将已训memory策略的注入关掉只是test-time ablation,不等于独立训练的no-memory baseline;两类结果分开报告。 + +### 9.4 最后做PIM + +先BIT单attempt,再PIM多attempt。相同task instance、重试预算、最大步数、输入信息、采样种子策略;BIT重置、PIM跨attempt保留且新episode清空。将PIM shadow、真实注入与success replay开关分别记录。禁止episode记忆串扰和将测试历史偷塞进离线静态库。 + +## 10. 本地修改定位表 + +| 用户报告中的文件 | 优先任务 | +|---|---| +| scripts/train_bridge_cte.py | 审计步数/调度/保存;后续增加显式max_updates、wallclock、磁盘、resume边界;提取共享视觉adapter | +| scripts/bridge_cte_data.py | 导出既有split、时间索引与完整窗口;不悄悄重划分 | +| scripts/bridge_cte_loss.py | 对比参考loss、DDP gather和验证候选数,补原始分项与有效数量 | +| cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py | legacy normalizer序列化、动作/夹爪来源、policy与CTE语义分离 | +| scripts/eval_widowx_simpler.py | command执行后从measured pose构建reached-delta历史,记录gripper和时间 | +| action_policy_server_robocasa365_zeva.py 或本地WidowX server | 将CTE改为256契约,隔离policy/retrieval视觉路径,校验feature版本 | +| scripts/widowx_checkpoint.py | delta实际语义、base hash、完整重建检查 | + +新增模块命名由本地规范决定;不得编造已有CLI参数。先实现实际接口再在报告中给出可运行命令。 + +## 11. 本轮报告交付 + +输出一个统一 `report.md`,包含: + +1. 最新运行与磁盘快照;是否仍运行;未授权的动作一律写未执行。 +2. 旧实验完整身份和保留清单;14k是否实际存在;checkpoint可加载性。 +3. legacy normalizer、动作、三条视觉、split、base+delta、CTE feature来源的hash与未决问题。 +4. 14k/20k等实际候选的固定验证原始指标、分任务/夹爪事件统计和不确定性。 +5. 每项契约/因果前缀/序列/重载测试结果;未运行不能写通过。 +6. 当前是能运行、离线表示有证据,还是已可进入目标域Stage2 pilot;不混为论文复现成功。 +7. 下一个最小实验:明确训练哪些参数、多少更新、多少数据、需要几张空闲GPU、wallclock、预计磁盘及停止条件。等待用户确认,不自行扩大。 + +## 12. 参考依据(需要与本地diff对照) + +- [S1] ZeVA commit `72f6d8e79f647aee988fa3fc4694170f03f1e04c`:`cosmos_framework/model/zeva/causal_transition_encoder.py`。 +- [S2] 同commit:`cosmos_framework/model/zeva/cte_losses.py`。 +- [S3] 同commit:`cosmos_framework/scripts/action_policy_server_robocasa365_zeva.py`。 +- [S4] Cosmos commit `ee58e41467f33c49ddde08b4d0ef4923876a95ac`:`cosmos_framework/data/generator/action/datasets/bridge_orig_lerobot_dataset.py`,含Bridge坐标/末端参考点处理;不代表应将本轮7D路径替换为其10D loader。 +- [S5] 同Cosmos commit:`cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_droid_nano.py`,公开DROID训练模块范围包含generation branch,不能将本地仅头部/adapter训练误称等同于这一配方。 +- [S6] 用户提供的两个agent审计片段,属于本地实验快照而非本文件已直接核验的代码。 + +**本轮优先目标:让现有CTE有完整身份、获得离线学习证据,并让在线历史与它的输入定义一致。不是追求更多训练step,也不是为了旧模板重训全部内容。** diff --git a/releases/bridge-native-v3/handoff_manifest.json b/releases/bridge-native-v3/handoff_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..dc08a3e47020cb961c20928f8b3153592223f0c3 --- /dev/null +++ b/releases/bridge-native-v3/handoff_manifest.json @@ -0,0 +1,956 @@ +{ + "format": "zeva_bridge_handoff_v1", + "release_prefix": "releases/bridge-native-v3", + "base": { + "repo": "nvidia/Cosmos3-Nano", + "revision": "e59a53c25979a090fa8706c9acc0c254a6e89b92" + }, + "framework_revision": "ee58e41467f33c49ddde08b4d0ef4923876a95ac", + "dataset": { + "repo": "IPEC-COMMUNITY/bridge_orig_lerobot", + "revision": "0e9d76d07e9df3ea3eba257b2520d4913833fad2", + "metadata_sha256": { + "info.json": "14fc7b0ae473266a2c7ee461cfb6d3d621f03ec4f51611cda07498d17eb57291", + "episodes.jsonl": "39043e8ffb580c02e9b884abd67f31dd5d1b87cdb763332b7957a1101e4c6952", + "tasks.jsonl": "2a832f97957188860ab3e95f5096385bffe0e5b03140531897e3e8d281fac625" + } + }, + "vae": { + "repo": "Wan-AI/Wan2.2-TI2V-5B", + "revision": "921dbaf3f1674a56f47e83fb80a34bac8a8f203e", + "filename": "Wan2.2_VAE.pth", + "sha256": "20eb789667fa5e60e7516bf509512f6cb61f01b0aa0695eadaea930c13892b36" + }, + "cte": { + "file": "memory/cte_30000_inference.pt", + "source_checkpoint_sha256": "5c94378ea87b875dd709d46cf7941cdb5ca33584df071fef254311c6bbab912e", + "export_sha256": "1c97e63f1e3da119098a68fc441f02332891fa4c7281a3c26d98dea304a5800b", + "model_tensor_sha256": "bba43ba8b89c9853978df3b00be250997b169b913c3705994c141e78a08e95f4", + "model_tensor_count": 177, + "exact_model_tensor_roundtrip": true, + "optimizer_exported": false, + "rng_exported": false, + "source_checkpoint_unchanged": true + }, + "bank": { + "file": "memory/static_bank_3000/static_bank.pt", + "sha256": "bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb", + "fingerprint": "80b06645732acd6f1ac1396439c1094ce58081916ddd9a76f9deacd35a1c6869", + "entries": 3000 + }, + "training_ready": false, + "runtime_shape_trace": "NOT_RUN", + "retrieval_head": "NOT_TRAINED", + "gate_50": "NOT_RUN", + "gate_500": "NOT_RUN", + "continuous": "NOT_STARTED", + "missing_training_components": [], + "source_git_commit": "df25844189715ff5d20f3203b880c1d526a557f7", + "source_tree_identity": "file hashes include intentional uncommitted overlay changes", + "all_old_local_checkpoints_preserved": true, + "native_entrypoint": "python -m scripts.run_bridge_stage2_native", + "implementation_status": "IMPLEMENTED_GPU_VALIDATION_NOT_RUN", + "pending_validation": [ + "full GPU forward/backward", + "real SimplerEnv controller acceptance", + "retrieval head alignment", + "50-step gate", + "500-step gate", + "continuous training" + ], + "memory_origin": { + "release": "releases/bridge-native-v2", + "revision": "4634e5b11f9c33a780d260eb0c3486193989a99e", + "manifest_sha256": "ec60d8d06617d9f27e9d3d81115d8bfce22bf12394269571502efe1f720fc786" + }, + "files": { + "README.md": { + "sha256": "57c1c90c859a38e100db59bcc588c041dc0074a574ae78b7c39f77f3c770cceb", + "bytes": 8568 + }, + "code/ATTRIBUTIONS.md": { + "sha256": "cc059c9b163ad96d92edbdd1f23e08e1c2b6e25f2be607722f37efcac6399a87", + "bytes": 3039051 + }, + "code/LICENSE": { + "sha256": "6bd3fdb9356edb6e4c1f00ad9cd6639a1cf06ca0a415a5071fd70d68799209e6", + "bytes": 2694 + }, + "code/NOTICE": { + "sha256": "0a3ebe37fb632d02a6a4d1cfce96109bb026b7833d8a3f0853091bb303c21ad9", + "bytes": 1929 + }, + "code/README.md": { + "sha256": "bff98c49b08631fa2f7748c0ec90103733c02c6bbf89e973bfe4784530e0f89b", + "bytes": 5103 + }, + "code/configs/bridge_stage2_native_contract.json": { + "sha256": "87c4b20181e7749f31d94fb45334f41ab17c5e50ec7c5a5bb7d1cacf72027a34", + "bytes": 2827 + }, + "code/cosmos_framework/__init__.py": { + "sha256": "f3b22dd4168fce13908dccf7499185e364602842f939497bfa2a358a7e1477c3", + "bytes": 152 + }, + "code/cosmos_framework/configs/base/config.py": { + "sha256": "39d44d470b8294e00a683135dac2f51486b61031cf4b76e046cd28d084b3ecdf", + "bytes": 4614 + }, + "code/cosmos_framework/configs/base/defaults/model_config.py": { + "sha256": "d6070424d4fd9e0e16d51ba7e083142c8c22087ce5440f10efb071a611d03032", + "bytes": 19547 + }, + "code/cosmos_framework/configs/base/defaults/vlm.py": { + "sha256": "0c97a8f10096a26631665da5552c4cc3282917a7ac087a8a867159488fb3220e", + "bytes": 542 + }, + "code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva.py": { + "sha256": "e3669d934091bd5d472f57a39442f5308864acc2c95d432c17fb222e5067dcca", + "bytes": 2265 + }, + "code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim.py": { + "sha256": "93a88683a8bd796622e2c5797b9e5b8c7d9e7792a62790c12c176ba4782a2018", + "bytes": 2140 + }, + "code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_pim_inference.py": { + "sha256": "3dd3167d79c9e21626f871efdd0543fa3b0236ef032556ac8bab05ce8864c09e", + "bytes": 1298 + }, + "code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_test.py": { + "sha256": "e0a4f8a3c643014da605de5b7b9bbe63bcbfe1da1d65525e5f2396d4ebbf1b1b", + "bytes": 576 + }, + "code/cosmos_framework/configs/base/experiment/action/posttrain_config/action_policy_robocasa365_atomic5_zeva_transition_memory.py": { + "sha256": "c2c6011bac6a20569e2ca8911412c0e7dfb6aca6e77445135496df1d0dace773", + "bytes": 2881 + }, + "code/cosmos_framework/data/__init__.py": { + "sha256": "4032724b98ed267185b12b8ec78dd9bcb0423ab1c89a6f0dad99397fd51159d9", + "bytes": 75 + }, + "code/cosmos_framework/data/generator/__init__.py": { + "sha256": "4032724b98ed267185b12b8ec78dd9bcb0423ab1c89a6f0dad99397fd51159d9", + "bytes": 75 + }, + "code/cosmos_framework/data/generator/action/__init__.py": { + "sha256": "4032724b98ed267185b12b8ec78dd9bcb0423ab1c89a6f0dad99397fd51159d9", + "bytes": 75 + }, + "code/cosmos_framework/data/generator/action/datasets/__init__.py": { + "sha256": "6d9ab31b3f8f55d0859606dd90289531ee75ab3142ba64385c6dc5ba28f026ba", + "bytes": 793 + }, + "code/cosmos_framework/data/generator/action/datasets/robocasa365_lerobot_dataset.py": { + "sha256": "d96552126e42bf36ab70f465e9ddf5d008b7c525fccb683a83f91b3f83008454", + "bytes": 15524 + }, + "code/cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py": { + "sha256": "d0be22029a2c2ffe1c3ffcc5bfd2403f640f249c0c5a825b00205e278514390b", + "bytes": 8810 + }, + "code/cosmos_framework/data/generator/action/domain_utils.py": { + "sha256": "7895b78e1110bebf53c76491aff14957a6de1b6fe987653c4de4f650316b01c7", + "bytes": 2561 + }, + "code/cosmos_framework/data/generator/action/normalizer_stats/robocasa365_target_action_stats.json": { + "sha256": "70991bc2c90f4eef6478a2051f30103a6d1c35cfcc12872f7b3a5c5f60438673", + "bytes": 1247 + }, + "code/cosmos_framework/data/generator/action/transforms.py": { + "sha256": "064c4f3f8c99ea59a1e76caeeaa4a828a5293532e1b41e0dc9df888f3f7baf7c", + "bytes": 33047 + }, + "code/cosmos_framework/data/generator/joint_dataloader.py": { + "sha256": "ee7a49576277c62d941ff95e709e9e63c7e0365b69abb939f0eb359a174b69f6", + "bytes": 57930 + }, + "code/cosmos_framework/data/generator/sequence_packing/modality.py": { + "sha256": "75efb9cdc25deb2226e7f477322da27f56f83beb7227fbdb670a21bcbaf3474a", + "bytes": 11387 + }, + "code/cosmos_framework/data/generator/sequence_packing/packers.py": { + "sha256": "91c07794e659d0c7abb17f007f480939107f77baeccbb28fa084e36db0a86a31", + "bytes": 24420 + }, + "code/cosmos_framework/data/generator/sequence_packing/sequence.py": { + "sha256": "e6789e73747cca69de06187f20a72a31de2ed91918fe420d2034cd3c89282cdb", + "bytes": 55405 + }, + "code/cosmos_framework/inference/common/public_model_config.py": { + "sha256": "a827f51c8cb175b23460dc605893e86776369a3802ae66b157a99375d15dacad", + "bytes": 18779 + }, + "code/cosmos_framework/model/generator/mot/cosmos3_vfm_network.py": { + "sha256": "78ab8f3367f1189284f9a545af358088ad4dc3e8cbdc89a304e5952d02d7c8a4", + "bytes": 76700 + }, + "code/cosmos_framework/model/generator/omni_mot_model.py": { + "sha256": "6aab8a77c9917124e0f9fdd50df6985d7a915adbd2f090e27bcc489e525d0866", + "bytes": 305526 + }, + "code/cosmos_framework/model/generator/utils/data_and_condition.py": { + "sha256": "6742341e437f58f1ba4502a03267713ef70234fa3c0d5afde06e75ee1d15f5d8", + "bytes": 8052 + }, + "code/cosmos_framework/model/zeva/__init__.py": { + "sha256": "ec90094139dabc227ec9da77174a401978370c614e8c68ccd76c19dc1e10e3da", + "bytes": 1821 + }, + "code/cosmos_framework/model/zeva/attempt_artifacts.py": { + "sha256": "05b9570a31eb77dc4b227122bbff37540383d8a27972df6edeec03932b3b716c", + "bytes": 3023 + }, + "code/cosmos_framework/model/zeva/attempt_artifacts_test.py": { + "sha256": "1792b8ecdc6af16525d710a5aabbfddd076671c0b6872972b65d80dc598765f1", + "bytes": 870 + }, + "code/cosmos_framework/model/zeva/attempt_protocol.py": { + "sha256": "0b5e161766c3c1124f5d79b34fbd17d4268f558d2c534926148349db018b775c", + "bytes": 2977 + }, + "code/cosmos_framework/model/zeva/attempt_protocol_test.py": { + "sha256": "c90e1d789d2235360c459c147658111a36d1c08bb1356126a6c09ea87bf4f7f7", + "bytes": 1812 + }, + "code/cosmos_framework/model/zeva/brief_interaction_trace.py": { + "sha256": "9bd6e3e76610116eae5b4d3378171dab99b63ccf06e10bf9a36f3bcd9f99e121", + "bytes": 678 + }, + "code/cosmos_framework/model/zeva/causal_prompt.py": { + "sha256": "5ceb77d21acce8b14c9f58396729bc760368b5467c1fbd37f6f4e6fce50fa2d5", + "bytes": 379 + }, + "code/cosmos_framework/model/zeva/causal_transition_encoder.py": { + "sha256": "7c3afcb1458f75898e79499ad94718f9a1357d89f7a6dd3be89a7148e231f331", + "bytes": 18012 + }, + "code/cosmos_framework/model/zeva/causal_transition_encoder_test.py": { + "sha256": "b64ad021a4c7c99cd718e71f87228f771bbed4cf8c9648379c53923c64fa89a4", + "bytes": 1257 + }, + "code/cosmos_framework/model/zeva/checkpoint_io.py": { + "sha256": "97ece9515342be323d1b1fa8c52eb0f5f4e04aa751ec8c03db39f4543ae7b60f", + "bytes": 823 + }, + "code/cosmos_framework/model/zeva/checkpoint_io_test.py": { + "sha256": "9f0967c8f037365d71385d54824bedc4bc74f8a164dc99d93e1326d764781b3a", + "bytes": 1044 + }, + "code/cosmos_framework/model/zeva/cte_losses.py": { + "sha256": "7b792dd3cef46382405223bc40b4b6aa6470ea6432bcd701c3af2eb62d463e62", + "bytes": 7670 + }, + "code/cosmos_framework/model/zeva/experimental/__init__.py": { + "sha256": "47b2ebab98c66bc0eaf058366decbbfc2e8c4451efeb67a04ce5deb12c75b96b", + "bytes": 80 + }, + "code/cosmos_framework/model/zeva/experimental/robocasa_transition_memory.py": { + "sha256": "38a28e404f59960f77c527cb716ab882c2944ac16c86f4d55cc3095e5c7b4d3b", + "bytes": 1460 + }, + "code/cosmos_framework/model/zeva/experimental/transition_memory.py": { + "sha256": "4fe07bcf71edfab06b9c32fd059e24321d525a07f27ef98ed3c762a4f19d6930", + "bytes": 10405 + }, + "code/cosmos_framework/model/zeva/experimental/transition_memory_policy_adapter.py": { + "sha256": "8b82715dfb90738f71362fe8ef62e5a18726e4e992137698cdb14b8a9aa86bd1", + "bytes": 5346 + }, + "code/cosmos_framework/model/zeva/experimental/transition_memory_runtime.py": { + "sha256": "3c1694bb96f2176c6eb3e80a38806827771caa7532bf1d07378babcae3ef9654", + "bytes": 3704 + }, + "code/cosmos_framework/model/zeva/experimental/transition_memory_test.py": { + "sha256": "9c8e9e33852bd6372c6f4743bd79dbc5fa33398f78fa9af187ed9eb9f0fdffa4", + "bytes": 6813 + }, + "code/cosmos_framework/model/zeva/persistent_interaction_memory.py": { + "sha256": "7e155ef95ba47da122e951598ad8edc269377cfc6a3f909d1a3daad290532396", + "bytes": 17159 + }, + "code/cosmos_framework/model/zeva/persistent_interaction_memory_test.py": { + "sha256": "676a33e70bf0f487673e52cd43b935a1b0526dfc05ce6f6e99dbb6dba6f0fc4e", + "bytes": 4563 + }, + "code/cosmos_framework/model/zeva/phase_conditioned_retrieval.py": { + "sha256": "24a5f8b1b64f8ead5f3dcc307599c0a07a1fae2489c79e6ab7a35d95abb3bc6a", + "bytes": 293 + }, + "code/cosmos_framework/model/zeva/policy_injection.py": { + "sha256": "5e52fcb07b1083f367a65e213527fff422a87a19e56007a9999024c3116badce", + "bytes": 8122 + }, + "code/cosmos_framework/model/zeva/policy_injection_test.py": { + "sha256": "0836e831f910b5b6097b75acf381f6c57c8b7be6fc5d9f79288089b1615bb4ed", + "bytes": 2231 + }, + "code/cosmos_framework/model/zeva/static_task_context_retrieval.py": { + "sha256": "c6c96a11d47ce3427505a67acd772fcbb28a0b0f3f8dde274ae6c342baed9214", + "bytes": 4070 + }, + "code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva.py": { + "sha256": "57d0c40da05050684538509a947ab99dbbf8b5e9253925e6b2da4b3e740da252", + "bytes": 47488 + }, + "code/cosmos_framework/scripts/action_policy_server_robocasa365_zeva_pim.py": { + "sha256": "1f47ea7ca8c3300b9ae932b64cdd576f1528741ab723188e928409a03563197d", + "bytes": 104753 + }, + "code/cosmos_framework/scripts/eval_zeva_robocasa365.py": { + "sha256": "9757b13b79926ad3ae958316d29ede030d00a11d82bab14ff14d026c0786f132", + "bytes": 13565 + }, + "code/cosmos_framework/scripts/eval_zeva_robocasa365_pim.py": { + "sha256": "6baec3635d0562a02aa09aad4a1537b601d83d182451a158a25851a30663e826", + "bytes": 38852 + }, + "code/docs/bridge_cte_stage1.md": { + "sha256": "cd0a1d48d06a55dc00d8cda9606a4a52dfbdbf06c48806a5cc77d859e1347e2c", + "bytes": 10004 + }, + "code/docs/bridge_handoff_message_zh.md": { + "sha256": "374b57a9ed520f2bcd4cfa29b2872d6a01df9d0523a026ae08a0e939eba4ec4d", + "bytes": 4408 + }, + "code/docs/bridge_memory_plan.md": { + "sha256": "46b5fe43c38791753f3d2fbe1708ac4a1d758d157133d4c2962687c091f0feca", + "bytes": 8704 + }, + "code/docs/bridge_native_handoff.md": { + "sha256": "e2ace99561f512adc0e4b63c05ceac609702b4407f4ac73136d3543a702c9653", + "bytes": 8548 + }, + "code/docs/bridge_native_training.md": { + "sha256": "34216a837e287677b97f0f6cc665cea7360c81542a96d2436da2bab828321d0d", + "bytes": 5837 + }, + "code/docs/bridge_static_bank_3000.md": { + "sha256": "edd13f70c9f988e5a74054b1ce2022d64d1be5a8a72157ebc2b5f7b004588b59", + "bytes": 4000 + }, + "code/docs/reproduce.md": { + "sha256": "97e389d35c0a43c114be216759a71887c2e4d5d43ce8e34ea7414fcfa318f7b8", + "bytes": 2640 + }, + "code/docs/zeva_pim.md": { + "sha256": "7c039670da4dac47040b9fdb67985c5d217e656e8f07fe54313775ff9307ca4a", + "bytes": 3428 + }, + "code/examples/launch_sft_action_policy_robocasa365_atomic5_zeva_pim.sh": { + "sha256": "2c6cfac0ed050a6477d84580546a208b1ccc58f1e1e607fc5ebb219772690fd6", + "bytes": 1757 + }, + "code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva.toml": { + "sha256": "b93dcc8533ed6da68b9c1562657d676aba9fd7a0030e9b32d99469c102d8ba05", + "bytes": 917 + }, + "code/examples/toml/sft_config/action_policy_robocasa365_atomic5_zeva_pim.toml": { + "sha256": "3c66ca82e2f77d75f21c2a6a1d5b7f00a6ff79657f20f33e41cc4a6b4c2ec840", + "bytes": 942 + }, + "code/experiment_manifests/eval_zeva_robocasa365_pim_formal32.py": { + "sha256": "f2b0091f8647fd19529f880b1ca7c64b6321924b617478e5c9a052b7e561c9b7", + "bytes": 16221 + }, + "code/experiment_manifests/pim_gate_off_equivalence.py": { + "sha256": "26bd9450be795ed456e98867fb18e3fdc0b7380e1295c8625b1b098770034d5d", + "bytes": 8918 + }, + "code/experiment_manifests/verify_pim_evolve_case.py": { + "sha256": "7b5af05b850794db0ac1700a735a58d47585e0b91d4bcf8503fd5f937289e4a2", + "bytes": 5025 + }, + "code/scripts/WIDOWX.md": { + "sha256": "7b7e78a7777addab150d990177a2649d722b471f17c5ba94b35eb9366c512fff", + "bytes": 15550 + }, + "code/scripts/action_normalizer_legacy_v0.json": { + "sha256": "a8c20660c594523fdeaaeba0cd106937f67c2b71d736aa6efd4200c3f5843594", + "bytes": 1104 + }, + "code/scripts/audit_ipec_base_delta_v2.py": { + "sha256": "ddcf132df209dde72de57c40505c0373275e04ff86c5cdae2f0f00c1726c0dad", + "bytes": 5972 + }, + "code/scripts/audit_widowx_data_contract.py": { + "sha256": "6aaa11dc13f0f4df120d6e73c04c82bded85f819411b844447ecb5c7d35aeaad", + "bytes": 7513 + }, + "code/scripts/audit_widowx_env_contract.py": { + "sha256": "7654b38732f960a5361d010f80b2cd70aef1418f4cfd01489060f2cc38199a36", + "bytes": 2345 + }, + "code/scripts/audit_widowx_overfit.py": { + "sha256": "1f94c5ee2cdc3565840043696b7733da22d2bc87a80d912af56586d39b91d5df", + "bytes": 9365 + }, + "code/scripts/audit_widowx_runtime.py": { + "sha256": "7fab3b682eb86b15d2067601c3e433bdb61336a2448b7e66740f4d1f1f86e28b", + "bytes": 7096 + }, + "code/scripts/bridge_cte_data.py": { + "sha256": "dd26fb489961f3d71d5493a35a1657ed56b2c167b19da22a4a3cf8ea263f01b8", + "bytes": 8907 + }, + "code/scripts/bridge_cte_loss.py": { + "sha256": "13bdac4724cdc82942c4e1e7d8740d0544ea273330e82a73902b4e99ac915ab8", + "bytes": 3424 + }, + "code/scripts/bridge_handoff.py": { + "sha256": "221e89f9429de269391a7b8c482edfa428c4b7f07a514ec870cd61c40bf92b64", + "bytes": 25708 + }, + "code/scripts/bridge_native_contract.py": { + "sha256": "11b45e489307a8895d2dd794176689ad65fc2f32f25bba67274ebc0fccd3dba9", + "bytes": 7614 + }, + "code/scripts/bridge_recovery_contract.py": { + "sha256": "23a5eba6e33ece86e5f0d7802f35fef5515b9102df7f22ee759c8a30fb10b144", + "bytes": 8349 + }, + "code/scripts/bridge_stage2_checkpoint.py": { + "sha256": "0a181472f8c60444e36b0ad8fa5f6aca7ff355d5d8cc3663eaeabbb8c00fc919", + "bytes": 5019 + }, + "code/scripts/bridge_stage2_config.py": { + "sha256": "57738d7f02088d08c21bb6b93c4c2cadb7e201f06969880434876a2183988539", + "bytes": 2495 + }, + "code/scripts/bridge_stage2_data.py": { + "sha256": "b6eee2c627c18936589f98134039f936595f6c3cebcbb078e9aee5db53de263b", + "bytes": 4749 + }, + "code/scripts/bridge_stage2_monitor.py": { + "sha256": "4e377bd5ac77ba9dc0f55ad43871117436c5ddbf296969fb7c6ca0d028fba16e", + "bytes": 17201 + }, + "code/scripts/bridge_stage2_pilot.toml": { + "sha256": "fe925e5de8dc80b8992c40d653aa52815d8856e3d258b1575d5e05e508a27097", + "bytes": 561 + }, + "code/scripts/bridge_stage2_probes.py": { + "sha256": "d8ab53e7bdcfc7f1ad991ca5ffac86b192f0dd752f5bdf47952336bcfcbf5b3c", + "bytes": 3984 + }, + "code/scripts/build_bridge_static_bank.py": { + "sha256": "2a1dd0141566fe8c200a9826dbd47d10499b85feb4f4781d3677dad8d61cf9f7", + "bytes": 23568 + }, + "code/scripts/check_bridge_cte_golden_v2.py": { + "sha256": "c0e95cd642df037e831f7d8d9d01177e4371d6727d0bd2d9ed088b71c67be565", + "bytes": 8289 + }, + "code/scripts/check_sapien_gpu.py": { + "sha256": "a1b303af2a4eadb1b1049d95ccec70cdb8df6b278fa948d9ba455fe213057e23", + "bytes": 1193 + }, + "code/scripts/check_simpler_reached_state_v2.py": { + "sha256": "dda8770601adc6abdb83e7d9d58c0ab28c9e804716e5ae2f657640f17449726e", + "bytes": 1859 + }, + "code/scripts/diagnose_bridge_cte_v2.py": { + "sha256": "e3863e0b7d3dd7fff65fb0242021ce8e6cba944b77ffafe34602f5d6a90b7f2e", + "bytes": 22350 + }, + "code/scripts/diagnose_bridge_stage2_reload.py": { + "sha256": "0d6b92a40411b99f1e64abdecc55efcd859b6cc8133c0229513801d942e17271", + "bytes": 9859 + }, + "code/scripts/eval_widowx_simpler.py": { + "sha256": "6da29b9ea82455bc63260297bbe7798b87646af749ca87b709b151cb687570e8", + "bytes": 11772 + }, + "code/scripts/extract_bridge_specialized.py": { + "sha256": "7fde639cc3e15c32d9f0f907b7bd048f514cb1861578c04a7a994805a662652e", + "bytes": 5235 + }, + "code/scripts/follow_bridge_stage2_pilot.py": { + "sha256": "4183fa012aeaf84b62166209859a3562e92d5157c4e84c46e27a09722a18ba36", + "bytes": 4867 + }, + "code/scripts/fp32_master_adamw.py": { + "sha256": "b88ecb0537db52132bb324c8a60bf696baaa9d83c6ed2ea2367785e0481ddbf8", + "bytes": 5288 + }, + "code/scripts/native_stage2/__init__.py": { + "sha256": "e298e61dc925a4e8a3404d78ad4fc712891a41559000ca0540cf0b9b05d3a813", + "bytes": 74 + }, + "code/scripts/native_stage2/base.py": { + "sha256": "083ef62e17c7f38b9fb4c169d9082c284842b6a5414cb786d4c032215f9ffd72", + "bytes": 9862 + }, + "code/scripts/native_stage2/checkpoint.py": { + "sha256": "437efb9d3c1c2185b24f20c907a09079c942fce591d6081fa099ff0c9c6e32f3", + "bytes": 6496 + }, + "code/scripts/native_stage2/common.py": { + "sha256": "3ed7362d12733207b4b96a76f104f90200d17694da793b1b0533f0ad3df5efc3", + "bytes": 2670 + }, + "code/scripts/native_stage2/data.py": { + "sha256": "9f9b6fe279b6dc55519114ffee7d434b5e8053b0d53e5be5d3430e6d44205cc4", + "bytes": 8777 + }, + "code/scripts/native_stage2/evaluate.py": { + "sha256": "b760548cdd457b39d99782552a6e11ce4a719305c1e809e47ac188fdf1769dd7", + "bytes": 7310 + }, + "code/scripts/native_stage2/memory.py": { + "sha256": "a3054a7defb760e1433ba6c4a5d39d7be31a479d6678343dc985782ee0f083d1", + "bytes": 9397 + }, + "code/scripts/native_stage2/model.py": { + "sha256": "cc385acb73419f8c2b6dfd060af073d6faec50fc5b08eabc129a447ced855697", + "bytes": 8434 + }, + "code/scripts/native_stage2/online.py": { + "sha256": "1e766b9ddbfe3d08904a4a2ac6a9319edf4193974f9c2f1c500140e532808718", + "bytes": 7204 + }, + "code/scripts/native_stage2/optim.py": { + "sha256": "15d0416113867ce8b376cf0373dfabb135abfac35cfde023b0bc95dd2dff4182", + "bytes": 5228 + }, + "code/scripts/native_stage2/train.py": { + "sha256": "7211ed654a885374b850c70ce46ac1694b6dbd94fa7963e7d04827079e19a537", + "bytes": 13316 + }, + "code/scripts/prepare_bridge_stage2_pilot.py": { + "sha256": "8afbc41faf914beb88d71541f2fc768ba65ae1d7f73ea28c02f0496ce4b80267", + "bytes": 12239 + }, + "code/scripts/prepare_widowx_features.py": { + "sha256": "237dbfd6eec44fdce8cbf4c5240d12711597660ae401f6377d2f4f4269d24114", + "bytes": 6466 + }, + "code/scripts/report_bridge_stage2_pilot.py": { + "sha256": "df09cd2c6b37d2af10919a3bc16d967fd52aad74bc2fa865554e55dd4b17d663", + "bytes": 11381 + }, + "code/scripts/run_bridge_cte_stage1.sh": { + "sha256": "caf31286e3b7debdfce4da5d72ac11b26cfc87b39c68b68d583d315f541f7d85", + "bytes": 970 + }, + "code/scripts/run_bridge_stage2_native.py": { + "sha256": "7bbca7fa269b55f51636b21fe96fc20c7408c69b58163b6bee4e69ded7ef7dd5", + "bytes": 8729 + }, + "code/scripts/run_bridge_stage2_pilot.py": { + "sha256": "a5a528b6d675b028efd3adba30034569bb091995288408ddc7e18cb736b68d6a", + "bytes": 9244 + }, + "code/scripts/run_ipec_full_training.sh": { + "sha256": "e787f9541cacd5c34672a6b93ec5f5c37a6a8c9b12d0ffbc77bcbf91b97e8765", + "bytes": 2779 + }, + "code/scripts/run_widowx_memory_ablation.py": { + "sha256": "daaf171747c5b6207bf4dd5dfaa579bb1cbc733b7ac870d70e9963aa4d408429", + "bytes": 5054 + }, + "code/scripts/run_widowx_training.sh": { + "sha256": "4dfa042f8b47a129b211c43f48a92d9843861bb4e06eba3ebbad38137e8f12b4", + "bytes": 1623 + }, + "code/scripts/smoke_train_bridge_data.py": { + "sha256": "2f835b6409e6a15ee54e3941a4a33fa44651be7ed230d8ac20c36862272e7ff6", + "bytes": 5092 + }, + "code/scripts/snapshot_bridge_recovery_v2.py": { + "sha256": "fbcb43c344d6eb403a55017c51477e0bb0c19c6b81e164b3a2519b1b5ee8e26e", + "bytes": 7703 + }, + "code/scripts/test_bridge_cte_stage1.py": { + "sha256": "49faf71a60437710e36cda9aba62a85b3a9b3d045e70d999174da564dc76e588", + "bytes": 9163 + }, + "code/scripts/test_bridge_handoff.py": { + "sha256": "22a12e9f0c221d7bf416a866f8d5af672202faf2b04cb28b79517188a412099f", + "bytes": 5355 + }, + "code/scripts/test_bridge_native_contract.py": { + "sha256": "1eddfa3304754e760b319b20bd256b72abfbdf41ade25ed88aab4f7d59cb639e", + "bytes": 6698 + }, + "code/scripts/test_bridge_native_distributed.py": { + "sha256": "ca9bf7b1ca372455ef328b4ce58683a66453e05b568e1a2968cc3c05b1f3c9ec", + "bytes": 2647 + }, + "code/scripts/test_bridge_native_training.py": { + "sha256": "2a46b6485eaf588dda5b6c66b7539eee828b28aebdaf60ab1c1c3b6e6c3f48ad", + "bytes": 11009 + }, + "code/scripts/test_bridge_recovery_v2.py": { + "sha256": "d21ac740847f5eb20a7900500c460733d16ec15688f3654975dd50d6fcecf24e", + "bytes": 6452 + }, + "code/scripts/test_bridge_stage2_pilot.py": { + "sha256": "9488359db13251298e90f4b86b15ae64d67457c10a1693bf455fef07c86bab06", + "bytes": 6652 + }, + "code/scripts/test_bridge_static_bank.py": { + "sha256": "332297e1ed6a825453ce834d2652bdc1ad94eb03f95c11676819abc36edff863", + "bytes": 3009 + }, + "code/scripts/test_fp32_master_adamw.py": { + "sha256": "2bb5e2947b7c6427c9ecace8c2afcd916b2276afbe8491ad2bc3a19fce6b8947", + "bytes": 4041 + }, + "code/scripts/test_wandb_fallback.py": { + "sha256": "89f4a72c3495f63f624482c686556d5848c4e7a4d2bdd750c07965bcfadc3623", + "bytes": 2623 + }, + "code/scripts/test_widowx_execution.py": { + "sha256": "f7ce6e54732446b6a8a4dc21b1b2b73a9eef80eb7395106d0aec3b87c97f7165", + "bytes": 6057 + }, + "code/scripts/test_widowx_full.py": { + "sha256": "29438dd7fcad29fa8321753eb70c0b6aba0389de2ae0241b97ccd28ff6b445a7", + "bytes": 11971 + }, + "code/scripts/test_widowx_memory.py": { + "sha256": "75cfd6a97c278e8d6ae17fff6f21f55ae37a302ea11040de85e598bcad23149c", + "bytes": 7546 + }, + "code/scripts/train_bridge_cte.py": { + "sha256": "2d02320c737e7af896d31d15295b56f542b4cf056f6ed99db1c6d60baf8e7c91", + "bytes": 20706 + }, + "code/scripts/train_bridge_stage2_pilot.py": { + "sha256": "00b67ff55f21f8a15b4cdf05bc1e11b9ca0ee76301cd9602c915b116680e664c", + "bytes": 1903 + }, + "code/scripts/train_widowx_zeva.py": { + "sha256": "200e24578d63312b458072cfd3143bc0667db507f6d845082e5024981de5b573", + "bytes": 3734 + }, + "code/scripts/watch_widowx_eval.py": { + "sha256": "db244d322778792b00e409951caa577dee21736d26be728f8facafda80c8f437", + "bytes": 9500 + }, + "code/scripts/widowx_checkpoint.py": { + "sha256": "787eea925b37c9d44a4f568cb147a06e543303f69c778feef3b661e587b6c87d", + "bytes": 10818 + }, + "code/scripts/widowx_config.py": { + "sha256": "9b4df28f7edd11160a8a63c5b708529f3b57ca328ad19cf225cfeebdd42a5f28", + "bytes": 2782 + }, + "code/scripts/widowx_contract.py": { + "sha256": "a978cd8ecbfc54175d2e0b43c385030a21b565967ca0ac51948086f6f7e28796", + "bytes": 5534 + }, + "code/scripts/widowx_data_resume.py": { + "sha256": "35a071101b3048aff5404fc9ef84b27c3d019d1bebb4e16bb0fd20b00c1426f3", + "bytes": 3235 + }, + "code/scripts/widowx_masked_loss.py": { + "sha256": "2c1a2ec16d1c6fdce402b65a3490020a9af54652b34e2d44357e5bc661c7367a", + "bytes": 3435 + }, + "code/scripts/widowx_policy_server.py": { + "sha256": "e4ff371a05422ddbfb90f1e3b3735c824944feba6fcd5c1305d8e6df3bf05e94", + "bytes": 10514 + }, + "code/scripts/widowx_rollout.py": { + "sha256": "0953afc63ea6b342d9631f8aec0490e6407b2c88bc7958ddb9f736f577cf42f2", + "bytes": 1711 + }, + "code/scripts/widowx_smoke.toml": { + "sha256": "38ddd8ff489d24e9b4739d02b5c32cb1dc5a015747760d8807a6b20a45b85c1c", + "bytes": 551 + }, + "code/zeva_bridge_recovery_agent_plan_v2.md": { + "sha256": "4e68c0ec9432fc104904a9fbc64097130c5d4d7a9778a2cba0e0241fd34d5b2a", + "bytes": 21651 + }, + "memory/cte_30000_inference.pt": { + "sha256": "1c97e63f1e3da119098a68fc441f02332891fa4c7281a3c26d98dea304a5800b", + "bytes": 38940517 + }, + "memory/cte_legacy_normalizer.json": { + "sha256": "a8c20660c594523fdeaaeba0cd106937f67c2b71d736aa6efd4200c3f5843594", + "bytes": 1104 + }, + "memory/pilot_split.json": { + "sha256": "1319fa533b820747f497a65ba74b9016b121f6c019393aca16fe3904d108212d", + "bytes": 570 + }, + "memory/policy_native10_normalizer.json": { + "sha256": "e673c112e9809a2dc3ac4fffd42896c0a3c7538d4808eae35d62059af65cb267", + "bytes": 245 + }, + "memory/stage1_split.json": { + "sha256": "77832a2ac196d91a7e461cda0063ce925c1913d3c3738550b7b5d78b53dedac0", + "bytes": 574044 + }, + "memory/static_bank_3000/contract.json": { + "sha256": "77d44020486169a3d8c71c7bbdecc6b253bc2a6ada294ca02b180a66277c1611", + "bytes": 4680 + }, + "memory/static_bank_3000/diagnostics.json": { + "sha256": "4d8945d8fa85f08826cc846884bdc53e26cf168c2d4a0b6a1e21f8af607b9612", + "bytes": 1912 + }, + "memory/static_bank_3000/manifest.json": { + "sha256": "5775c82305c600863c2da30610eb2314dd92a30b74ec33aa8af1c6e6c0391566", + "bytes": 9046 + }, + "memory/static_bank_3000/partitions.json": { + "sha256": "2a85230ec96b3fb463d1c0bf3435b8123a429cbc5495e9af170aebacb96d3547", + "bytes": 574364 + }, + "memory/static_bank_3000/selection.json": { + "sha256": "f69d59d66a2143a63cd40a388618472994af39fbb0adc3f8269f9a832e9c0d24", + "bytes": 1104806 + }, + "memory/static_bank_3000/shards/part_000000.pt": { + "sha256": "687f0f703de49225386a7342f1bbee5e66da31c5cf9906f4a6e50ec5374f6698", + "bytes": 126637 + }, + "memory/static_bank_3000/shards/part_000050.pt": { + "sha256": "ee07951c28c6101fe6d14fb9854e551e49d8457593c1f0f7b16550d3b955f7a7", + "bytes": 126829 + }, + "memory/static_bank_3000/shards/part_000100.pt": { + "sha256": "a5001b163ae8c9bb33b8bce45a9b27db5b26d0277f8c435a64cd3b4e13206f57", + "bytes": 126189 + }, + "memory/static_bank_3000/shards/part_000150.pt": { + "sha256": "4a381f47c85508208b298762eb25fb9e537fd181b5626db21224f1c20d888156", + "bytes": 125805 + }, + "memory/static_bank_3000/shards/part_000200.pt": { + "sha256": "0cfc3f5f4ff7a027f4801b107ee8fad21c2ab2ca9e9732dc2e85f42244d7deac", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_000250.pt": { + "sha256": "aafdfb041bd3845ad4b9785fd0cfa2ab2ac55ae687d22b75ae1f5ff6e38d4162", + "bytes": 126701 + }, + "memory/static_bank_3000/shards/part_000300.pt": { + "sha256": "7bcccf92e8dea201d90aecfe3f124bd3f5c8fced0ae7fa3183eb33f07f861863", + "bytes": 126125 + }, + "memory/static_bank_3000/shards/part_000350.pt": { + "sha256": "249b7bf225f538b6ee5d17c5e22d0076243a1cdb9528b4f285fb88c0c515d7b3", + "bytes": 126701 + }, + "memory/static_bank_3000/shards/part_000400.pt": { + "sha256": "5d3975d1e7c388bc6a91d1d86d84dbe5d872b9a4ba8231e48195c4c9e709100d", + "bytes": 126253 + }, + "memory/static_bank_3000/shards/part_000450.pt": { + "sha256": "ed97fe5178f959a1eeaad943b391592ca4983161190775f7d27bbeb59a2c84b0", + "bytes": 126317 + }, + "memory/static_bank_3000/shards/part_000500.pt": { + "sha256": "43ad9db1685e08dc3a76767dcbb1a6a07982adb89ab57f54e4d72013bd68c6ab", + "bytes": 126253 + }, + "memory/static_bank_3000/shards/part_000550.pt": { + "sha256": "a674b01436293b3643c6e3a0024cc28dbf4dacdad620816174f491f87745e4a5", + "bytes": 126829 + }, + "memory/static_bank_3000/shards/part_000600.pt": { + "sha256": "e8e6b2bbce6526e7c6f05ed9751ea683ac5f6b252980161ede8c7fd67cab3281", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_000650.pt": { + "sha256": "66c2444152facc486535e267cbbfe8fba81f8f196c3d0ae046e0e1a439b92421", + "bytes": 126957 + }, + "memory/static_bank_3000/shards/part_000700.pt": { + "sha256": "36d86f7c1db1a86ffbd5c92ce4b23b3efa2faeb094f8b66840bb186732583f29", + "bytes": 126381 + }, + "memory/static_bank_3000/shards/part_000750.pt": { + "sha256": "b96b9af83ca1e0815d18e8761127066785ac893350ed0888bf8f94a8ad095dbe", + "bytes": 126381 + }, + "memory/static_bank_3000/shards/part_000800.pt": { + "sha256": "bc0b8199dab94980f54f4c487eca8df16e73ebba942ae1bf86039e798b92f70e", + "bytes": 126893 + }, + "memory/static_bank_3000/shards/part_000850.pt": { + "sha256": "debf9423acf800b44ad1d8eb691c6ed756d7e7fa4eb9d0f0adca6265c408fdc4", + "bytes": 126637 + }, + "memory/static_bank_3000/shards/part_000900.pt": { + "sha256": "f35a1eba5a1980ab19cf570ff386c6519d9b64ec5fa988560bb8d9aef0e4055a", + "bytes": 126765 + }, + "memory/static_bank_3000/shards/part_000950.pt": { + "sha256": "0f854bf56fdd8636470cf7a7040246caea57921fea33c3ea0c995cfa20c17e3d", + "bytes": 126445 + }, + "memory/static_bank_3000/shards/part_001000.pt": { + "sha256": "6901357cbaeafb645bff1d170468d1f4a632f1782a7550a9d2c29515128b34c9", + "bytes": 126829 + }, + "memory/static_bank_3000/shards/part_001050.pt": { + "sha256": "3162df69773a3eb928a24bb62f516e296d0d100a92691e953b4cbc6e7ea0b8fe", + "bytes": 126765 + }, + "memory/static_bank_3000/shards/part_001100.pt": { + "sha256": "2eaf96a023be389c31f8470df8230e3df7e5245d67af17ca17113389d2703b1f", + "bytes": 126637 + }, + "memory/static_bank_3000/shards/part_001150.pt": { + "sha256": "9fcf41048f3b11dc5ec4647feeb5309fd6f9d9f873ba0e0feef30453d7dfc6ba", + "bytes": 126189 + }, + "memory/static_bank_3000/shards/part_001200.pt": { + "sha256": "5b32e74d3fd3cb5147eb7957b39b37214c9a47f38d078de86ed70fcd4958408b", + "bytes": 126701 + }, + "memory/static_bank_3000/shards/part_001250.pt": { + "sha256": "4f47c223981f62374e562606b6b0c7442fd0ac8faf7f32787ae118548ba1cf16", + "bytes": 126765 + }, + "memory/static_bank_3000/shards/part_001300.pt": { + "sha256": "38319a01cb0fcdcd4c400e1f05fea3702b8dae39f55b07c8959639e24b648423", + "bytes": 126829 + }, + "memory/static_bank_3000/shards/part_001350.pt": { + "sha256": "e9f772c37695df35a4ce77c370d9c3e101daa60551bd20f0d55460f42c468c6b", + "bytes": 126573 + }, + "memory/static_bank_3000/shards/part_001400.pt": { + "sha256": "3e0081b97e04a3f3e3060f2947ba257043777ddbc891aae25dcf71ac3bb848ba", + "bytes": 126573 + }, + "memory/static_bank_3000/shards/part_001450.pt": { + "sha256": "b4f0e9d46bcbeda12fd16029d1dc5af7741ebbecfdc82805ec8197a84f044ef4", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_001500.pt": { + "sha256": "082eca4121c95e9867c04502c8b0b5be4cba77ab0436cb15988ae57a4e1ea559", + "bytes": 126893 + }, + "memory/static_bank_3000/shards/part_001550.pt": { + "sha256": "b4302769aab26c3ad44e877f213b5b565958cf9620590616136e2a92a06e8e32", + "bytes": 126445 + }, + "memory/static_bank_3000/shards/part_001600.pt": { + "sha256": "ac473f6484fd1c08f50afc317f76aee9f5e469dabfa6298bddaab61c659e129c", + "bytes": 126637 + }, + "memory/static_bank_3000/shards/part_001650.pt": { + "sha256": "5b0c17109a6772d9015c9b240581347ac7ee9197abe4366902ee5bce9be6dc8a", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_001700.pt": { + "sha256": "170e99833fa50abadddfa59b04cc5e9c0df8b1c43a69a7d2cb15e7331567fa64", + "bytes": 126829 + }, + "memory/static_bank_3000/shards/part_001750.pt": { + "sha256": "68b08663cf35280603d3053ca66ab1740a9a5dacf645998792e0a0c4d8cfd984", + "bytes": 126381 + }, + "memory/static_bank_3000/shards/part_001800.pt": { + "sha256": "68c02663c4d4de4f263a88b7257769b8e6f465811e96a52196580279787c4884", + "bytes": 126573 + }, + "memory/static_bank_3000/shards/part_001850.pt": { + "sha256": "9050b76ca81d8f7295382ebefa72cc11229b333919f947c9442f6f5b521c93c0", + "bytes": 126125 + }, + "memory/static_bank_3000/shards/part_001900.pt": { + "sha256": "32581354a76de4c9dd835ae408bd21ef3011af6eec5775b1623f66ff2e8831ec", + "bytes": 126445 + }, + "memory/static_bank_3000/shards/part_001950.pt": { + "sha256": "0aa856841af0cedbbff3d18b697302eb7b82c20adbad86e6af2bbe342c098837", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_002000.pt": { + "sha256": "ef4ed15000f7505c367881e7dda7f08e1ec1b613444f1c356f30b071cf131e90", + "bytes": 126765 + }, + "memory/static_bank_3000/shards/part_002050.pt": { + "sha256": "11dbf5ce3a51a17314384f9f0869fb1c8bfe6b47f6331cb6b114e962c6327dc5", + "bytes": 126189 + }, + "memory/static_bank_3000/shards/part_002100.pt": { + "sha256": "09116752289e27ebfc43c9ccaf0ccc7525a61726ebd3654bc88a82d702d59b33", + "bytes": 126701 + }, + "memory/static_bank_3000/shards/part_002150.pt": { + "sha256": "4a923ca0be5ede6fde4bd66fe9ae747e0a66d79ce29544aaca982c5fab8b3bd6", + "bytes": 125997 + }, + "memory/static_bank_3000/shards/part_002200.pt": { + "sha256": "e82e4acedfd5e726d89ba6b6b76afc0d6740a7c4e9ae11216d64e77294a1ca67", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_002250.pt": { + "sha256": "d5c1d6ce4a49195a9d220103fbd4644445f78ee77e83bd124e18318f3cb33c15", + "bytes": 126445 + }, + "memory/static_bank_3000/shards/part_002300.pt": { + "sha256": "3027f36fbd35995b08caa0ca4b96a7b05a66610ca93437a22b072934142a485a", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_002350.pt": { + "sha256": "3b1ced0c140023ae88974c5db04fa143cc1d74b8eb9884aa13daac113c6805d0", + "bytes": 126637 + }, + "memory/static_bank_3000/shards/part_002400.pt": { + "sha256": "ebc866ba989c9b04814720b6fe561d1e03d0ccf67bc86890ad6405dc1110d008", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_002450.pt": { + "sha256": "c7d28fafecefd9617a42cf4e9112f091194216ca8c424b2f4cc4f0c30cc07960", + "bytes": 126573 + }, + "memory/static_bank_3000/shards/part_002500.pt": { + "sha256": "2568074c7adcb383b624e0462ac52db80ea9cd3b4cf43ca9253eb3f4d4cae2e4", + "bytes": 126253 + }, + "memory/static_bank_3000/shards/part_002550.pt": { + "sha256": "59036fab565492c7c96bc169eebd2a3c02564e08e6ce961f4af6446a1c91bcc8", + "bytes": 126573 + }, + "memory/static_bank_3000/shards/part_002600.pt": { + "sha256": "8d9a94dcd820ec432522c8c3d0bccfb4725a0c7aaabe6a46f3df2a610fa149ee", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_002650.pt": { + "sha256": "877cafcbe56d11d55de7fc32d58bc71c39412021aab000d95942d9e4e8967e43", + "bytes": 126765 + }, + "memory/static_bank_3000/shards/part_002700.pt": { + "sha256": "1b1236d196d3ac9ad19161352260ced85cfdce4b1c2c83db84293969b7019d59", + "bytes": 126701 + }, + "memory/static_bank_3000/shards/part_002750.pt": { + "sha256": "79f9bcaeaea610b3abaaffda4140d3da1782e001319d25507e2d5e5d8e0bd6c4", + "bytes": 126765 + }, + "memory/static_bank_3000/shards/part_002800.pt": { + "sha256": "50212355947ff3864108921574ff730eebd55dc9c4f6397c7ab31667356675d3", + "bytes": 126125 + }, + "memory/static_bank_3000/shards/part_002850.pt": { + "sha256": "dcd64ba27ef20a89e2ca840cd9520dcb61b4faf004fc08d5dc40c8ad6956aa78", + "bytes": 126701 + }, + "memory/static_bank_3000/shards/part_002900.pt": { + "sha256": "a1874723b4a8bddbc63a7868b22d2994f9195432ffa1d7e6251e0130f86ce666", + "bytes": 126509 + }, + "memory/static_bank_3000/shards/part_002950.pt": { + "sha256": "a1c43c707273527fa9021a9c35f5cd6cc7aaa664675b782186c4dca8824bcc60", + "bytes": 126509 + }, + "memory/static_bank_3000/static_bank.pt": { + "sha256": "bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb", + "bytes": 7557265 + }, + "validation/implementation_validation.json": { + "sha256": "9c8443552d8dfbc2e1528cb7f450b5ff9425a892c84de989739e4d06659311c3", + "bytes": 2285 + } + } +} diff --git a/releases/bridge-native-v3/memory/cte_30000_inference.pt b/releases/bridge-native-v3/memory/cte_30000_inference.pt new file mode 100644 index 0000000000000000000000000000000000000000..2593f5d7e8e8f83ab9e4c68e98670c8784ba66d5 --- /dev/null +++ b/releases/bridge-native-v3/memory/cte_30000_inference.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c97e63f1e3da119098a68fc441f02332891fa4c7281a3c26d98dea304a5800b +size 38940517 diff --git a/releases/bridge-native-v3/memory/cte_legacy_normalizer.json b/releases/bridge-native-v3/memory/cte_legacy_normalizer.json new file mode 100644 index 0000000000000000000000000000000000000000..16bb005661f20903f35c6848a800ea0ad2e87be9 --- /dev/null +++ b/releases/bridge-native-v3/memory/cte_legacy_normalizer.json @@ -0,0 +1,18 @@ +{ + "id": "bridge_reached_delta_legacy_quantile_v0", + "kind": "per_dim_quantile_clip", + "source": "cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py", + "fitted_on_current_train_split": false, + "q01": [-0.028752606511116028, -0.041702210046350954, -0.026096698231995105, -0.08052822157740593, -0.09249736212193965, -0.20738411962985992], + "q99": [0.02830690816044803, 0.04089860741049051, 0.04018005654215808, 0.08173405691981314, 0.07760896608233431, 0.20384809583425495], + "clip_range": [-1.0, 1.0], + "gripper": { + "raw_closed": 0.0, + "raw_open": 1.0, + "threshold": 0.5, + "normalized_closed": -1.0, + "normalized_open": 1.0, + "source_label_note": "The parquet action gripper is binary; runtime maps positive SimplerEnv open command to 1 before CTE normalization. Semantic calibration in the simulator is separately audited." + }, + "notes": "These are legacy source-code constants; no claim is made that they were fitted exclusively on the current training split. Clipping is lossy, so denormalization is a decoder rule rather than an exact inverse." +} diff --git a/releases/bridge-native-v3/memory/pilot_split.json b/releases/bridge-native-v3/memory/pilot_split.json new file mode 100644 index 0000000000000000000000000000000000000000..e3921c9ad858390e1fc92c9ec87e86cd2a0ddc54 --- /dev/null +++ b/releases/bridge-native-v3/memory/pilot_split.json @@ -0,0 +1,47 @@ +{ + "train": [ + 39379, + 21155, + 50859, + 34396, + 10878, + 36444, + 37316, + 9476, + 19452, + 48887, + 2033, + 41154, + 23163, + 48306, + 42906, + 40371, + 42409, + 18480, + 12582, + 43421, + 12575, + 16123, + 18020, + 41948, + 53171, + 27239, + 45758, + 50816, + 19413, + 41799, + 3508, + 50544 + ], + "development": [ + 784, + 8950, + 26087, + 9859, + 19654, + 5257, + 1756, + 26116 + ], + "note": "Stage2 development only: all these episodes belong to the original CTE train split" +} diff --git a/releases/bridge-native-v3/memory/policy_native10_normalizer.json b/releases/bridge-native-v3/memory/policy_native10_normalizer.json new file mode 100644 index 0000000000000000000000000000000000000000..66d1d79993fd1dfecde9145d6a9cc8191a5e03a0 --- /dev/null +++ b/releases/bridge-native-v3/memory/policy_native10_normalizer.json @@ -0,0 +1,4 @@ +{ + "q01": [-0.038884, -0.028667, -0.037840, 0.976292, -0.163098, -0.081545, -0.160193, 0.976322, -0.078872, 0.000000], + "q99": [ 0.039722, 0.029068, 0.026702, 1.000000, 0.160195, 0.081655, 0.163227, 1.000000, 0.095189, 1.000000] +} diff --git a/releases/bridge-native-v3/memory/stage1_split.json b/releases/bridge-native-v3/memory/stage1_split.json new file mode 100644 index 0000000000000000000000000000000000000000..89a2bf111d6af4ed8e209d92516c3785e18b02f8 --- /dev/null +++ b/releases/bridge-native-v3/memory/stage1_split.json @@ -0,0 +1,53198 @@ +{ + "train": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1041, + 1042, + 1043, + 1044, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1258, + 1259, + 1261, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1688, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2413, + 2414, + 2415, + 2416, + 2417, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 2858, + 2859, + 2860, + 2861, + 2862, + 2863, + 2864, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2958, + 2959, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2980, + 2981, + 2982, + 2983, + 2984, + 2985, + 2986, + 2987, + 2988, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3005, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3021, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3030, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 3045, + 3046, + 3047, + 3048, + 3049, + 3050, + 3051, + 3052, + 3053, + 3054, + 3055, + 3056, + 3057, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 3066, + 3067, + 3068, + 3069, + 3070, + 3071, + 3072, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3082, + 3083, + 3084, + 3085, + 3086, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3097, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3134, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 3142, + 3143, + 3144, + 3145, + 3146, + 3147, + 3148, + 3149, + 3150, + 3151, + 3152, + 3153, + 3154, + 3155, + 3156, + 3157, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 3164, + 3165, + 3166, + 3167, + 3168, + 3169, + 3170, + 3171, + 3173, + 3174, + 3175, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3215, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3247, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3256, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3285, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3311, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3348, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3357, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 3365, + 3366, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3376, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417, + 3418, + 3419, + 3420, + 3421, + 3422, + 3423, + 3424, + 3425, + 3426, + 3427, + 3428, + 3429, + 3430, + 3431, + 3432, + 3433, + 3434, + 3435, + 3436, + 3437, + 3438, + 3439, + 3440, + 3441, + 3442, + 3443, + 3444, + 3445, + 3446, + 3447, + 3448, + 3449, + 3450, + 3452, + 3453, + 3454, + 3455, + 3456, + 3457, + 3458, + 3459, + 3460, + 3461, + 3462, + 3463, + 3464, + 3465, + 3466, + 3467, + 3468, + 3469, + 3470, + 3471, + 3472, + 3473, + 3474, + 3475, + 3476, + 3477, + 3478, + 3479, + 3480, + 3481, + 3482, + 3483, + 3484, + 3485, + 3486, + 3487, + 3488, + 3489, + 3490, + 3491, + 3492, + 3493, + 3494, + 3495, + 3496, + 3497, + 3498, + 3499, + 3500, + 3501, + 3502, + 3503, + 3504, + 3505, + 3506, + 3507, + 3508, + 3509, + 3510, + 3511, + 3512, + 3513, + 3514, + 3515, + 3516, + 3517, + 3518, + 3519, + 3520, + 3521, + 3522, + 3523, + 3524, + 3525, + 3526, + 3527, + 3528, + 3529, + 3530, + 3531, + 3532, + 3533, + 3534, + 3535, + 3536, + 3537, + 3538, + 3539, + 3540, + 3541, + 3542, + 3543, + 3544, + 3545, + 3546, + 3547, + 3548, + 3549, + 3550, + 3551, + 3552, + 3553, + 3554, + 3555, + 3556, + 3557, + 3558, + 3559, + 3560, + 3561, + 3562, + 3563, + 3564, + 3565, + 3566, + 3567, + 3568, + 3569, + 3570, + 3571, + 3572, + 3573, + 3574, + 3575, + 3576, + 3577, + 3578, + 3579, + 3580, + 3581, + 3582, + 3583, + 3584, + 3585, + 3586, + 3587, + 3588, + 3589, + 3590, + 3591, + 3592, + 3593, + 3594, + 3595, + 3596, + 3597, + 3598, + 3600, + 3601, + 3602, + 3603, + 3604, + 3605, + 3606, + 3607, + 3608, + 3609, + 3610, + 3612, + 3613, + 3615, + 3616, + 3617, + 3618, + 3619, + 3620, + 3621, + 3622, + 3623, + 3624, + 3625, + 3626, + 3627, + 3628, + 3629, + 3630, + 3631, + 3632, + 3633, + 3634, + 3635, + 3636, + 3637, + 3638, + 3639, + 3640, + 3641, + 3642, + 3643, + 3644, + 3645, + 3646, + 3647, + 3648, + 3649, + 3650, + 3651, + 3652, + 3653, + 3654, + 3655, + 3656, + 3657, + 3658, + 3659, + 3661, + 3662, + 3663, + 3664, + 3665, + 3666, + 3667, + 3668, + 3669, + 3670, + 3671, + 3672, + 3673, + 3674, + 3675, + 3676, + 3677, + 3678, + 3679, + 3680, + 3681, + 3682, + 3683, + 3684, + 3685, + 3686, + 3687, + 3688, + 3689, + 3690, + 3691, + 3692, + 3693, + 3694, + 3695, + 3696, + 3697, + 3698, + 3699, + 3700, + 3701, + 3702, + 3703, + 3704, + 3705, + 3706, + 3707, + 3708, + 3709, + 3710, + 3711, + 3712, + 3713, + 3714, + 3715, + 3716, + 3717, + 3718, + 3719, + 3720, + 3721, + 3722, + 3723, + 3724, + 3725, + 3726, + 3727, + 3728, + 3729, + 3730, + 3731, + 3732, + 3733, + 3734, + 3735, + 3736, + 3737, + 3738, + 3739, + 3740, + 3741, + 3742, + 3743, + 3744, + 3745, + 3746, + 3747, + 3748, + 3749, + 3750, + 3751, + 3752, + 3753, + 3754, + 3755, + 3756, + 3757, + 3759, + 3760, + 3761, + 3762, + 3763, + 3764, + 3765, + 3766, + 3767, + 3768, + 3769, + 3770, + 3771, + 3772, + 3773, + 3774, + 3775, + 3776, + 3777, + 3778, + 3779, + 3780, + 3781, + 3782, + 3783, + 3784, + 3785, + 3786, + 3787, + 3788, + 3789, + 3790, + 3791, + 3792, + 3793, + 3794, + 3795, + 3796, + 3797, + 3798, + 3799, + 3801, + 3802, + 3803, + 3804, + 3805, + 3806, + 3807, + 3808, + 3809, + 3810, + 3811, + 3812, + 3813, + 3814, + 3815, + 3816, + 3817, + 3818, + 3819, + 3820, + 3821, + 3822, + 3823, + 3824, + 3825, + 3827, + 3828, + 3829, + 3830, + 3831, + 3832, + 3833, + 3834, + 3835, + 3836, + 3837, + 3838, + 3839, + 3840, + 3841, + 3842, + 3843, + 3844, + 3845, + 3846, + 3847, + 3848, + 3849, + 3850, + 3851, + 3852, + 3853, + 3854, + 3855, + 3856, + 3857, + 3858, + 3859, + 3860, + 3861, + 3862, + 3863, + 3864, + 3865, + 3866, + 3867, + 3868, + 3869, + 3870, + 3871, + 3872, + 3874, + 3875, + 3876, + 3877, + 3878, + 3879, + 3880, + 3881, + 3882, + 3883, + 3884, + 3885, + 3886, + 3887, + 3888, + 3889, + 3890, + 3891, + 3892, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3899, + 3900, + 3901, + 3902, + 3903, + 3904, + 3905, + 3906, + 3907, + 3908, + 3909, + 3910, + 3911, + 3912, + 3913, + 3914, + 3915, + 3916, + 3917, + 3918, + 3919, + 3920, + 3922, + 3923, + 3924, + 3925, + 3926, + 3927, + 3928, + 3929, + 3930, + 3931, + 3932, + 3933, + 3934, + 3935, + 3936, + 3937, + 3938, + 3939, + 3940, + 3941, + 3942, + 3943, + 3944, + 3945, + 3946, + 3947, + 3948, + 3949, + 3950, + 3951, + 3952, + 3953, + 3954, + 3955, + 3956, + 3957, + 3958, + 3960, + 3961, + 3962, + 3963, + 3964, + 3965, + 3966, + 3967, + 3968, + 3969, + 3970, + 3971, + 3972, + 3973, + 3974, + 3975, + 3976, + 3977, + 3978, + 3979, + 3980, + 3981, + 3982, + 3983, + 3984, + 3985, + 3986, + 3988, + 3989, + 3990, + 3991, + 3992, + 3993, + 3994, + 3995, + 3996, + 3997, + 3998, + 3999, + 4000, + 4001, + 4002, + 4003, + 4004, + 4005, + 4006, + 4007, + 4008, + 4009, + 4010, + 4011, + 4012, + 4013, + 4014, + 4015, + 4016, + 4017, + 4018, + 4019, + 4020, + 4021, + 4022, + 4023, + 4024, + 4025, + 4026, + 4027, + 4028, + 4029, + 4030, + 4031, + 4032, + 4033, + 4034, + 4035, + 4036, + 4037, + 4038, + 4039, + 4040, + 4041, + 4043, + 4044, + 4045, + 4046, + 4047, + 4048, + 4049, + 4050, + 4051, + 4052, + 4053, + 4054, + 4055, + 4056, + 4057, + 4058, + 4059, + 4060, + 4061, + 4062, + 4063, + 4064, + 4065, + 4066, + 4067, + 4068, + 4069, + 4070, + 4071, + 4072, + 4073, + 4074, + 4075, + 4076, + 4077, + 4078, + 4079, + 4080, + 4081, + 4082, + 4083, + 4084, + 4085, + 4086, + 4087, + 4088, + 4089, + 4090, + 4091, + 4092, + 4093, + 4094, + 4095, + 4096, + 4097, + 4098, + 4099, + 4100, + 4101, + 4102, + 4103, + 4104, + 4105, + 4106, + 4107, + 4108, + 4109, + 4110, + 4111, + 4112, + 4113, + 4114, + 4115, + 4116, + 4117, + 4118, + 4119, + 4120, + 4121, + 4122, + 4123, + 4124, + 4125, + 4126, + 4127, + 4128, + 4129, + 4130, + 4131, + 4132, + 4133, + 4134, + 4135, + 4136, + 4137, + 4138, + 4139, + 4140, + 4141, + 4142, + 4143, + 4144, + 4145, + 4146, + 4147, + 4148, + 4149, + 4150, + 4151, + 4152, + 4153, + 4154, + 4155, + 4156, + 4157, + 4158, + 4159, + 4160, + 4161, + 4162, + 4163, + 4164, + 4165, + 4166, + 4167, + 4168, + 4169, + 4170, + 4171, + 4172, + 4173, + 4174, + 4175, + 4176, + 4177, + 4178, + 4179, + 4180, + 4181, + 4182, + 4183, + 4184, + 4185, + 4186, + 4187, + 4188, + 4189, + 4190, + 4191, + 4192, + 4193, + 4194, + 4195, + 4196, + 4197, + 4198, + 4199, + 4200, + 4201, + 4202, + 4203, + 4204, + 4205, + 4206, + 4207, + 4208, + 4209, + 4210, + 4211, + 4212, + 4213, + 4214, + 4215, + 4216, + 4217, + 4218, + 4219, + 4220, + 4221, + 4222, + 4223, + 4224, + 4225, + 4226, + 4227, + 4228, + 4229, + 4230, + 4231, + 4232, + 4233, + 4234, + 4235, + 4236, + 4237, + 4238, + 4239, + 4240, + 4241, + 4242, + 4243, + 4244, + 4245, + 4246, + 4247, + 4248, + 4249, + 4250, + 4251, + 4252, + 4253, + 4254, + 4255, + 4256, + 4257, + 4258, + 4259, + 4260, + 4261, + 4262, + 4263, + 4265, + 4266, + 4267, + 4268, + 4269, + 4270, + 4271, + 4272, + 4273, + 4274, + 4275, + 4276, + 4277, + 4278, + 4279, + 4280, + 4281, + 4282, + 4283, + 4284, + 4285, + 4286, + 4287, + 4288, + 4289, + 4290, + 4291, + 4292, + 4293, + 4294, + 4295, + 4296, + 4297, + 4298, + 4300, + 4301, + 4302, + 4303, + 4304, + 4305, + 4306, + 4307, + 4308, + 4309, + 4310, + 4311, + 4312, + 4313, + 4315, + 4316, + 4317, + 4318, + 4319, + 4320, + 4321, + 4322, + 4323, + 4324, + 4325, + 4326, + 4327, + 4328, + 4329, + 4330, + 4331, + 4332, + 4333, + 4334, + 4335, + 4336, + 4337, + 4338, + 4339, + 4340, + 4341, + 4342, + 4343, + 4344, + 4345, + 4346, + 4347, + 4348, + 4349, + 4350, + 4351, + 4352, + 4353, + 4354, + 4355, + 4356, + 4357, + 4358, + 4359, + 4360, + 4361, + 4362, + 4363, + 4364, + 4365, + 4366, + 4367, + 4368, + 4369, + 4370, + 4371, + 4372, + 4373, + 4374, + 4375, + 4376, + 4377, + 4378, + 4379, + 4380, + 4381, + 4382, + 4383, + 4384, + 4385, + 4386, + 4387, + 4388, + 4389, + 4390, + 4391, + 4392, + 4393, + 4394, + 4395, + 4396, + 4397, + 4398, + 4400, + 4401, + 4402, + 4403, + 4404, + 4405, + 4406, + 4407, + 4408, + 4409, + 4410, + 4411, + 4412, + 4413, + 4414, + 4415, + 4416, + 4417, + 4418, + 4419, + 4420, + 4421, + 4422, + 4423, + 4424, + 4425, + 4426, + 4427, + 4428, + 4429, + 4430, + 4431, + 4432, + 4433, + 4434, + 4435, + 4436, + 4437, + 4438, + 4439, + 4440, + 4441, + 4442, + 4443, + 4444, + 4445, + 4446, + 4447, + 4448, + 4449, + 4450, + 4451, + 4452, + 4453, + 4454, + 4455, + 4456, + 4457, + 4458, + 4459, + 4460, + 4461, + 4462, + 4463, + 4464, + 4465, + 4466, + 4467, + 4468, + 4469, + 4470, + 4471, + 4472, + 4473, + 4474, + 4475, + 4476, + 4477, + 4478, + 4479, + 4480, + 4481, + 4482, + 4483, + 4484, + 4485, + 4486, + 4487, + 4488, + 4489, + 4490, + 4491, + 4492, + 4493, + 4494, + 4495, + 4496, + 4497, + 4498, + 4499, + 4500, + 4501, + 4502, + 4503, + 4504, + 4505, + 4506, + 4507, + 4508, + 4509, + 4510, + 4511, + 4512, + 4513, + 4514, + 4515, + 4516, + 4517, + 4518, + 4519, + 4520, + 4521, + 4522, + 4523, + 4524, + 4525, + 4526, + 4527, + 4528, + 4529, + 4530, + 4531, + 4532, + 4533, + 4534, + 4535, + 4536, + 4537, + 4538, + 4539, + 4540, + 4541, + 4542, + 4543, + 4544, + 4545, + 4546, + 4547, + 4548, + 4549, + 4550, + 4551, + 4552, + 4553, + 4554, + 4555, + 4556, + 4557, + 4558, + 4559, + 4560, + 4561, + 4562, + 4563, + 4564, + 4565, + 4566, + 4567, + 4568, + 4569, + 4570, + 4571, + 4572, + 4573, + 4574, + 4575, + 4576, + 4577, + 4578, + 4579, + 4580, + 4581, + 4583, + 4584, + 4585, + 4586, + 4587, + 4588, + 4589, + 4590, + 4591, + 4592, + 4593, + 4594, + 4595, + 4596, + 4597, + 4598, + 4599, + 4600, + 4601, + 4602, + 4603, + 4605, + 4606, + 4607, + 4608, + 4609, + 4610, + 4611, + 4612, + 4613, + 4614, + 4615, + 4616, + 4617, + 4618, + 4619, + 4620, + 4621, + 4622, + 4623, + 4624, + 4625, + 4626, + 4627, + 4628, + 4629, + 4630, + 4631, + 4632, + 4633, + 4634, + 4635, + 4636, + 4637, + 4638, + 4639, + 4640, + 4641, + 4642, + 4643, + 4644, + 4645, + 4646, + 4647, + 4648, + 4649, + 4650, + 4651, + 4652, + 4653, + 4654, + 4655, + 4656, + 4657, + 4658, + 4660, + 4661, + 4662, + 4663, + 4664, + 4665, + 4666, + 4667, + 4668, + 4669, + 4670, + 4671, + 4672, + 4673, + 4674, + 4675, + 4676, + 4678, + 4679, + 4680, + 4682, + 4683, + 4684, + 4685, + 4686, + 4687, + 4688, + 4689, + 4690, + 4691, + 4692, + 4693, + 4694, + 4695, + 4696, + 4697, + 4698, + 4700, + 4701, + 4702, + 4703, + 4704, + 4705, + 4707, + 4708, + 4709, + 4710, + 4711, + 4712, + 4713, + 4714, + 4716, + 4717, + 4718, + 4719, + 4720, + 4721, + 4722, + 4723, + 4724, + 4725, + 4726, + 4727, + 4728, + 4729, + 4730, + 4732, + 4733, + 4734, + 4735, + 4736, + 4737, + 4738, + 4739, + 4740, + 4741, + 4742, + 4743, + 4745, + 4746, + 4747, + 4748, + 4749, + 4750, + 4751, + 4752, + 4753, + 4754, + 4755, + 4756, + 4757, + 4758, + 4759, + 4760, + 4761, + 4762, + 4763, + 4764, + 4765, + 4766, + 4767, + 4768, + 4769, + 4770, + 4771, + 4772, + 4773, + 4774, + 4775, + 4776, + 4777, + 4778, + 4779, + 4780, + 4781, + 4782, + 4783, + 4784, + 4785, + 4786, + 4787, + 4788, + 4789, + 4790, + 4791, + 4792, + 4793, + 4794, + 4795, + 4796, + 4797, + 4798, + 4799, + 4800, + 4801, + 4802, + 4803, + 4804, + 4805, + 4806, + 4807, + 4808, + 4809, + 4810, + 4811, + 4812, + 4813, + 4814, + 4815, + 4816, + 4817, + 4818, + 4819, + 4820, + 4821, + 4822, + 4823, + 4824, + 4825, + 4826, + 4827, + 4828, + 4829, + 4830, + 4831, + 4832, + 4833, + 4834, + 4835, + 4836, + 4837, + 4838, + 4839, + 4840, + 4841, + 4842, + 4843, + 4844, + 4845, + 4846, + 4847, + 4848, + 4849, + 4850, + 4851, + 4852, + 4853, + 4854, + 4855, + 4856, + 4857, + 4858, + 4859, + 4860, + 4861, + 4862, + 4863, + 4864, + 4865, + 4866, + 4867, + 4868, + 4869, + 4870, + 4871, + 4872, + 4873, + 4874, + 4876, + 4877, + 4878, + 4879, + 4880, + 4881, + 4882, + 4883, + 4884, + 4885, + 4886, + 4887, + 4888, + 4889, + 4890, + 4891, + 4892, + 4893, + 4894, + 4895, + 4896, + 4897, + 4898, + 4899, + 4900, + 4901, + 4902, + 4903, + 4904, + 4905, + 4906, + 4907, + 4908, + 4909, + 4910, + 4911, + 4912, + 4913, + 4914, + 4915, + 4916, + 4917, + 4918, + 4919, + 4920, + 4921, + 4922, + 4923, + 4924, + 4925, + 4926, + 4927, + 4928, + 4929, + 4930, + 4931, + 4932, + 4933, + 4934, + 4935, + 4936, + 4937, + 4938, + 4939, + 4940, + 4941, + 4942, + 4943, + 4945, + 4946, + 4947, + 4948, + 4949, + 4950, + 4951, + 4952, + 4953, + 4954, + 4955, + 4956, + 4957, + 4958, + 4959, + 4960, + 4961, + 4962, + 4963, + 4964, + 4965, + 4966, + 4967, + 4968, + 4969, + 4970, + 4971, + 4972, + 4973, + 4974, + 4975, + 4976, + 4977, + 4978, + 4979, + 4980, + 4981, + 4982, + 4983, + 4984, + 4985, + 4986, + 4987, + 4988, + 4989, + 4990, + 4991, + 4992, + 4993, + 4995, + 4996, + 4997, + 4998, + 4999, + 5000, + 5001, + 5002, + 5003, + 5004, + 5005, + 5006, + 5007, + 5008, + 5009, + 5010, + 5011, + 5012, + 5013, + 5014, + 5015, + 5016, + 5017, + 5018, + 5019, + 5020, + 5021, + 5022, + 5023, + 5024, + 5025, + 5026, + 5027, + 5028, + 5029, + 5030, + 5031, + 5032, + 5033, + 5034, + 5035, + 5036, + 5037, + 5038, + 5039, + 5040, + 5041, + 5042, + 5043, + 5044, + 5045, + 5046, + 5047, + 5048, + 5049, + 5050, + 5051, + 5052, + 5053, + 5054, + 5055, + 5056, + 5057, + 5058, + 5059, + 5060, + 5061, + 5062, + 5063, + 5064, + 5065, + 5066, + 5067, + 5068, + 5069, + 5070, + 5071, + 5072, + 5073, + 5074, + 5075, + 5076, + 5077, + 5078, + 5079, + 5080, + 5081, + 5082, + 5083, + 5084, + 5085, + 5086, + 5087, + 5088, + 5089, + 5090, + 5091, + 5092, + 5093, + 5094, + 5095, + 5096, + 5097, + 5098, + 5099, + 5100, + 5101, + 5102, + 5103, + 5104, + 5105, + 5106, + 5107, + 5108, + 5109, + 5110, + 5111, + 5112, + 5113, + 5114, + 5115, + 5116, + 5117, + 5118, + 5119, + 5120, + 5121, + 5122, + 5123, + 5124, + 5125, + 5126, + 5127, + 5128, + 5129, + 5130, + 5131, + 5132, + 5133, + 5134, + 5135, + 5136, + 5137, + 5139, + 5140, + 5142, + 5143, + 5144, + 5145, + 5146, + 5147, + 5148, + 5149, + 5150, + 5151, + 5152, + 5153, + 5154, + 5155, + 5156, + 5158, + 5159, + 5160, + 5161, + 5162, + 5163, + 5164, + 5165, + 5166, + 5167, + 5168, + 5169, + 5170, + 5171, + 5172, + 5173, + 5174, + 5175, + 5176, + 5177, + 5178, + 5179, + 5180, + 5181, + 5182, + 5183, + 5184, + 5185, + 5186, + 5187, + 5188, + 5189, + 5190, + 5191, + 5192, + 5193, + 5194, + 5195, + 5196, + 5197, + 5198, + 5199, + 5200, + 5201, + 5202, + 5203, + 5204, + 5205, + 5206, + 5207, + 5208, + 5209, + 5210, + 5211, + 5212, + 5213, + 5214, + 5215, + 5216, + 5217, + 5218, + 5219, + 5220, + 5221, + 5222, + 5223, + 5224, + 5225, + 5226, + 5227, + 5228, + 5229, + 5230, + 5231, + 5232, + 5233, + 5234, + 5235, + 5236, + 5237, + 5238, + 5239, + 5240, + 5241, + 5242, + 5243, + 5244, + 5245, + 5246, + 5247, + 5248, + 5250, + 5251, + 5252, + 5253, + 5254, + 5255, + 5256, + 5257, + 5258, + 5259, + 5260, + 5261, + 5262, + 5263, + 5264, + 5265, + 5266, + 5267, + 5268, + 5269, + 5270, + 5271, + 5272, + 5273, + 5274, + 5275, + 5276, + 5277, + 5278, + 5279, + 5280, + 5281, + 5282, + 5283, + 5284, + 5285, + 5286, + 5287, + 5288, + 5289, + 5290, + 5291, + 5292, + 5293, + 5294, + 5295, + 5296, + 5297, + 5298, + 5299, + 5300, + 5301, + 5302, + 5303, + 5304, + 5305, + 5306, + 5307, + 5308, + 5309, + 5310, + 5311, + 5312, + 5313, + 5314, + 5315, + 5316, + 5317, + 5318, + 5319, + 5320, + 5321, + 5322, + 5323, + 5324, + 5325, + 5326, + 5327, + 5328, + 5329, + 5330, + 5331, + 5332, + 5333, + 5334, + 5335, + 5336, + 5337, + 5338, + 5339, + 5340, + 5341, + 5342, + 5343, + 5344, + 5345, + 5346, + 5347, + 5348, + 5349, + 5350, + 5351, + 5352, + 5353, + 5354, + 5355, + 5356, + 5357, + 5358, + 5359, + 5360, + 5361, + 5362, + 5363, + 5364, + 5365, + 5366, + 5367, + 5368, + 5369, + 5370, + 5372, + 5373, + 5374, + 5375, + 5376, + 5377, + 5378, + 5379, + 5380, + 5381, + 5382, + 5383, + 5384, + 5385, + 5386, + 5387, + 5388, + 5389, + 5390, + 5391, + 5392, + 5393, + 5394, + 5395, + 5396, + 5397, + 5398, + 5399, + 5400, + 5401, + 5402, + 5403, + 5404, + 5405, + 5406, + 5407, + 5408, + 5409, + 5410, + 5411, + 5412, + 5413, + 5414, + 5415, + 5416, + 5417, + 5418, + 5419, + 5420, + 5421, + 5422, + 5423, + 5424, + 5425, + 5426, + 5427, + 5428, + 5429, + 5430, + 5431, + 5432, + 5433, + 5434, + 5435, + 5436, + 5437, + 5438, + 5439, + 5440, + 5441, + 5442, + 5443, + 5444, + 5445, + 5446, + 5447, + 5448, + 5450, + 5451, + 5452, + 5453, + 5454, + 5455, + 5457, + 5458, + 5459, + 5460, + 5461, + 5462, + 5463, + 5464, + 5465, + 5466, + 5467, + 5468, + 5469, + 5470, + 5471, + 5472, + 5473, + 5474, + 5475, + 5476, + 5477, + 5478, + 5479, + 5480, + 5481, + 5482, + 5483, + 5484, + 5485, + 5486, + 5487, + 5488, + 5489, + 5490, + 5491, + 5492, + 5493, + 5494, + 5495, + 5496, + 5497, + 5498, + 5499, + 5500, + 5501, + 5502, + 5503, + 5504, + 5505, + 5506, + 5507, + 5508, + 5509, + 5510, + 5511, + 5512, + 5513, + 5514, + 5515, + 5516, + 5517, + 5518, + 5519, + 5520, + 5521, + 5522, + 5523, + 5524, + 5525, + 5526, + 5527, + 5528, + 5529, + 5530, + 5531, + 5532, + 5533, + 5534, + 5535, + 5536, + 5537, + 5538, + 5539, + 5540, + 5541, + 5542, + 5543, + 5544, + 5545, + 5546, + 5547, + 5548, + 5549, + 5550, + 5551, + 5552, + 5553, + 5554, + 5555, + 5556, + 5557, + 5558, + 5559, + 5560, + 5561, + 5562, + 5563, + 5564, + 5565, + 5566, + 5567, + 5568, + 5569, + 5570, + 5571, + 5572, + 5573, + 5574, + 5575, + 5576, + 5577, + 5578, + 5579, + 5580, + 5581, + 5582, + 5584, + 5585, + 5586, + 5587, + 5588, + 5590, + 5591, + 5592, + 5593, + 5594, + 5596, + 5597, + 5598, + 5599, + 5600, + 5601, + 5602, + 5603, + 5604, + 5605, + 5606, + 5608, + 5610, + 5611, + 5612, + 5613, + 5614, + 5615, + 5616, + 5617, + 5618, + 5619, + 5620, + 5621, + 5622, + 5623, + 5624, + 5625, + 5626, + 5627, + 5628, + 5629, + 5630, + 5631, + 5632, + 5633, + 5634, + 5635, + 5636, + 5637, + 5638, + 5639, + 5640, + 5641, + 5642, + 5643, + 5644, + 5645, + 5646, + 5647, + 5648, + 5649, + 5650, + 5651, + 5652, + 5653, + 5654, + 5655, + 5656, + 5657, + 5658, + 5659, + 5660, + 5661, + 5662, + 5663, + 5665, + 5666, + 5667, + 5668, + 5669, + 5670, + 5671, + 5672, + 5673, + 5674, + 5675, + 5676, + 5677, + 5678, + 5679, + 5680, + 5681, + 5682, + 5683, + 5684, + 5685, + 5686, + 5687, + 5688, + 5689, + 5691, + 5692, + 5693, + 5694, + 5695, + 5696, + 5697, + 5698, + 5699, + 5700, + 5701, + 5702, + 5703, + 5704, + 5705, + 5706, + 5707, + 5708, + 5709, + 5710, + 5711, + 5712, + 5713, + 5714, + 5715, + 5716, + 5717, + 5718, + 5719, + 5720, + 5721, + 5722, + 5723, + 5724, + 5725, + 5726, + 5727, + 5728, + 5729, + 5731, + 5732, + 5733, + 5734, + 5735, + 5736, + 5737, + 5738, + 5739, + 5740, + 5741, + 5742, + 5743, + 5744, + 5745, + 5746, + 5747, + 5748, + 5749, + 5750, + 5751, + 5752, + 5753, + 5754, + 5755, + 5756, + 5757, + 5758, + 5759, + 5760, + 5761, + 5762, + 5763, + 5764, + 5765, + 5766, + 5767, + 5768, + 5769, + 5770, + 5771, + 5772, + 5773, + 5774, + 5775, + 5776, + 5777, + 5778, + 5779, + 5780, + 5781, + 5782, + 5783, + 5784, + 5785, + 5786, + 5787, + 5788, + 5789, + 5790, + 5791, + 5792, + 5793, + 5794, + 5795, + 5796, + 5797, + 5798, + 5799, + 5800, + 5801, + 5802, + 5803, + 5804, + 5805, + 5806, + 5807, + 5808, + 5809, + 5810, + 5811, + 5812, + 5813, + 5814, + 5815, + 5816, + 5817, + 5818, + 5819, + 5820, + 5821, + 5822, + 5823, + 5824, + 5825, + 5826, + 5827, + 5828, + 5829, + 5830, + 5831, + 5832, + 5833, + 5834, + 5835, + 5836, + 5837, + 5838, + 5839, + 5840, + 5841, + 5842, + 5843, + 5844, + 5845, + 5846, + 5847, + 5848, + 5849, + 5850, + 5851, + 5852, + 5853, + 5854, + 5855, + 5856, + 5857, + 5858, + 5859, + 5860, + 5861, + 5862, + 5863, + 5864, + 5865, + 5866, + 5867, + 5868, + 5869, + 5870, + 5871, + 5872, + 5873, + 5874, + 5876, + 5877, + 5878, + 5879, + 5880, + 5881, + 5882, + 5883, + 5884, + 5885, + 5886, + 5887, + 5888, + 5889, + 5890, + 5891, + 5892, + 5893, + 5894, + 5895, + 5896, + 5897, + 5898, + 5899, + 5900, + 5901, + 5902, + 5903, + 5904, + 5905, + 5906, + 5907, + 5908, + 5909, + 5910, + 5911, + 5912, + 5913, + 5914, + 5915, + 5916, + 5917, + 5918, + 5920, + 5921, + 5922, + 5923, + 5924, + 5925, + 5926, + 5927, + 5928, + 5929, + 5930, + 5931, + 5932, + 5933, + 5934, + 5935, + 5936, + 5937, + 5938, + 5939, + 5940, + 5941, + 5942, + 5943, + 5944, + 5945, + 5946, + 5947, + 5948, + 5949, + 5950, + 5951, + 5952, + 5953, + 5954, + 5955, + 5956, + 5957, + 5958, + 5959, + 5960, + 5961, + 5962, + 5963, + 5964, + 5965, + 5966, + 5967, + 5968, + 5969, + 5970, + 5971, + 5972, + 5973, + 5974, + 5975, + 5976, + 5977, + 5978, + 5979, + 5980, + 5981, + 5982, + 5983, + 5984, + 5985, + 5986, + 5987, + 5988, + 5989, + 5991, + 5992, + 5993, + 5994, + 5995, + 5996, + 5997, + 5998, + 5999, + 6000, + 6001, + 6002, + 6003, + 6004, + 6006, + 6007, + 6008, + 6009, + 6010, + 6011, + 6012, + 6013, + 6014, + 6015, + 6016, + 6017, + 6018, + 6019, + 6020, + 6021, + 6022, + 6023, + 6024, + 6025, + 6026, + 6027, + 6028, + 6029, + 6030, + 6031, + 6032, + 6033, + 6034, + 6035, + 6036, + 6037, + 6038, + 6040, + 6041, + 6042, + 6043, + 6044, + 6045, + 6046, + 6047, + 6048, + 6049, + 6050, + 6051, + 6052, + 6053, + 6054, + 6055, + 6056, + 6057, + 6058, + 6059, + 6060, + 6061, + 6062, + 6063, + 6064, + 6065, + 6066, + 6067, + 6068, + 6069, + 6070, + 6071, + 6072, + 6073, + 6074, + 6075, + 6076, + 6077, + 6078, + 6079, + 6080, + 6081, + 6082, + 6083, + 6084, + 6085, + 6086, + 6087, + 6088, + 6089, + 6090, + 6091, + 6092, + 6093, + 6094, + 6095, + 6096, + 6097, + 6098, + 6099, + 6100, + 6101, + 6102, + 6103, + 6104, + 6105, + 6106, + 6107, + 6108, + 6109, + 6110, + 6111, + 6112, + 6113, + 6114, + 6115, + 6116, + 6117, + 6118, + 6119, + 6120, + 6121, + 6122, + 6123, + 6124, + 6125, + 6126, + 6127, + 6128, + 6129, + 6130, + 6131, + 6132, + 6133, + 6134, + 6135, + 6136, + 6137, + 6138, + 6139, + 6140, + 6141, + 6142, + 6143, + 6144, + 6145, + 6146, + 6147, + 6148, + 6149, + 6150, + 6151, + 6152, + 6153, + 6154, + 6155, + 6156, + 6157, + 6158, + 6159, + 6160, + 6161, + 6162, + 6163, + 6164, + 6165, + 6166, + 6167, + 6168, + 6169, + 6170, + 6171, + 6172, + 6173, + 6174, + 6175, + 6176, + 6177, + 6178, + 6179, + 6180, + 6181, + 6182, + 6183, + 6184, + 6185, + 6186, + 6187, + 6188, + 6189, + 6190, + 6191, + 6192, + 6193, + 6194, + 6195, + 6196, + 6198, + 6199, + 6200, + 6201, + 6202, + 6203, + 6204, + 6205, + 6206, + 6207, + 6208, + 6209, + 6210, + 6211, + 6212, + 6213, + 6214, + 6215, + 6216, + 6217, + 6218, + 6219, + 6220, + 6221, + 6222, + 6223, + 6224, + 6225, + 6226, + 6227, + 6228, + 6229, + 6230, + 6231, + 6232, + 6233, + 6234, + 6235, + 6236, + 6237, + 6238, + 6239, + 6240, + 6241, + 6242, + 6243, + 6244, + 6246, + 6247, + 6248, + 6249, + 6250, + 6251, + 6252, + 6253, + 6254, + 6255, + 6256, + 6257, + 6258, + 6259, + 6260, + 6261, + 6262, + 6263, + 6264, + 6265, + 6266, + 6267, + 6268, + 6269, + 6270, + 6271, + 6272, + 6273, + 6274, + 6275, + 6276, + 6277, + 6278, + 6279, + 6280, + 6281, + 6282, + 6283, + 6284, + 6285, + 6286, + 6287, + 6288, + 6289, + 6290, + 6291, + 6292, + 6293, + 6294, + 6295, + 6296, + 6297, + 6298, + 6299, + 6300, + 6301, + 6302, + 6303, + 6304, + 6305, + 6306, + 6307, + 6308, + 6309, + 6310, + 6311, + 6312, + 6313, + 6314, + 6315, + 6316, + 6317, + 6318, + 6319, + 6320, + 6321, + 6322, + 6323, + 6324, + 6325, + 6326, + 6327, + 6328, + 6329, + 6330, + 6331, + 6332, + 6333, + 6334, + 6335, + 6336, + 6337, + 6338, + 6339, + 6340, + 6341, + 6342, + 6343, + 6344, + 6345, + 6346, + 6347, + 6348, + 6349, + 6350, + 6351, + 6352, + 6353, + 6354, + 6355, + 6356, + 6358, + 6359, + 6360, + 6361, + 6362, + 6363, + 6364, + 6365, + 6366, + 6367, + 6368, + 6369, + 6370, + 6371, + 6372, + 6373, + 6374, + 6375, + 6376, + 6377, + 6378, + 6379, + 6380, + 6381, + 6382, + 6384, + 6385, + 6386, + 6387, + 6388, + 6389, + 6390, + 6391, + 6392, + 6393, + 6394, + 6395, + 6396, + 6397, + 6398, + 6399, + 6400, + 6401, + 6402, + 6403, + 6404, + 6405, + 6406, + 6407, + 6408, + 6409, + 6410, + 6412, + 6413, + 6414, + 6415, + 6416, + 6417, + 6418, + 6419, + 6420, + 6421, + 6422, + 6423, + 6424, + 6425, + 6426, + 6427, + 6428, + 6429, + 6430, + 6431, + 6432, + 6434, + 6435, + 6436, + 6437, + 6438, + 6439, + 6440, + 6441, + 6442, + 6443, + 6444, + 6445, + 6446, + 6447, + 6448, + 6449, + 6450, + 6451, + 6452, + 6453, + 6454, + 6455, + 6456, + 6457, + 6459, + 6460, + 6461, + 6462, + 6463, + 6464, + 6465, + 6466, + 6467, + 6468, + 6469, + 6470, + 6471, + 6472, + 6473, + 6474, + 6475, + 6476, + 6477, + 6478, + 6479, + 6480, + 6481, + 6482, + 6483, + 6484, + 6485, + 6486, + 6487, + 6488, + 6489, + 6490, + 6491, + 6492, + 6493, + 6494, + 6495, + 6496, + 6497, + 6498, + 6499, + 6500, + 6501, + 6502, + 6503, + 6504, + 6505, + 6506, + 6507, + 6508, + 6509, + 6510, + 6511, + 6512, + 6513, + 6514, + 6515, + 6516, + 6517, + 6518, + 6519, + 6520, + 6521, + 6522, + 6523, + 6525, + 6526, + 6527, + 6528, + 6529, + 6530, + 6531, + 6532, + 6533, + 6534, + 6535, + 6536, + 6537, + 6538, + 6539, + 6540, + 6542, + 6543, + 6544, + 6546, + 6547, + 6548, + 6549, + 6550, + 6551, + 6552, + 6553, + 6554, + 6555, + 6556, + 6557, + 6558, + 6559, + 6560, + 6561, + 6562, + 6563, + 6564, + 6565, + 6567, + 6568, + 6569, + 6570, + 6571, + 6572, + 6573, + 6574, + 6575, + 6576, + 6577, + 6578, + 6579, + 6580, + 6581, + 6582, + 6583, + 6584, + 6585, + 6586, + 6587, + 6588, + 6589, + 6590, + 6591, + 6592, + 6593, + 6594, + 6595, + 6596, + 6597, + 6598, + 6599, + 6600, + 6601, + 6602, + 6603, + 6604, + 6605, + 6606, + 6607, + 6608, + 6609, + 6610, + 6611, + 6612, + 6613, + 6614, + 6615, + 6616, + 6617, + 6618, + 6619, + 6620, + 6621, + 6622, + 6623, + 6624, + 6625, + 6626, + 6627, + 6628, + 6629, + 6630, + 6631, + 6632, + 6633, + 6634, + 6635, + 6636, + 6637, + 6638, + 6639, + 6640, + 6641, + 6642, + 6643, + 6644, + 6645, + 6646, + 6647, + 6648, + 6649, + 6650, + 6651, + 6652, + 6653, + 6654, + 6655, + 6656, + 6657, + 6658, + 6659, + 6660, + 6661, + 6662, + 6663, + 6664, + 6665, + 6666, + 6667, + 6668, + 6669, + 6670, + 6671, + 6672, + 6673, + 6674, + 6675, + 6676, + 6677, + 6678, + 6679, + 6680, + 6681, + 6682, + 6683, + 6684, + 6685, + 6686, + 6687, + 6688, + 6689, + 6690, + 6691, + 6692, + 6694, + 6695, + 6696, + 6697, + 6698, + 6699, + 6700, + 6701, + 6702, + 6703, + 6704, + 6705, + 6706, + 6707, + 6708, + 6709, + 6710, + 6711, + 6712, + 6713, + 6714, + 6715, + 6717, + 6718, + 6719, + 6720, + 6721, + 6722, + 6723, + 6724, + 6725, + 6726, + 6727, + 6728, + 6729, + 6730, + 6731, + 6732, + 6733, + 6734, + 6735, + 6736, + 6737, + 6738, + 6739, + 6740, + 6741, + 6742, + 6743, + 6744, + 6745, + 6746, + 6747, + 6748, + 6749, + 6750, + 6751, + 6752, + 6753, + 6754, + 6755, + 6756, + 6757, + 6758, + 6759, + 6760, + 6761, + 6762, + 6763, + 6764, + 6765, + 6766, + 6767, + 6768, + 6769, + 6770, + 6771, + 6772, + 6773, + 6774, + 6775, + 6776, + 6777, + 6778, + 6779, + 6780, + 6781, + 6782, + 6783, + 6784, + 6785, + 6786, + 6787, + 6788, + 6789, + 6790, + 6791, + 6792, + 6793, + 6794, + 6795, + 6796, + 6797, + 6798, + 6799, + 6800, + 6801, + 6802, + 6803, + 6804, + 6805, + 6806, + 6807, + 6808, + 6809, + 6810, + 6811, + 6812, + 6813, + 6814, + 6815, + 6816, + 6817, + 6818, + 6819, + 6820, + 6821, + 6822, + 6823, + 6825, + 6826, + 6827, + 6828, + 6829, + 6830, + 6831, + 6832, + 6833, + 6834, + 6835, + 6836, + 6837, + 6838, + 6839, + 6840, + 6841, + 6842, + 6843, + 6844, + 6845, + 6846, + 6847, + 6848, + 6849, + 6850, + 6851, + 6852, + 6853, + 6854, + 6855, + 6856, + 6857, + 6858, + 6859, + 6860, + 6861, + 6862, + 6863, + 6864, + 6865, + 6866, + 6867, + 6868, + 6869, + 6870, + 6871, + 6872, + 6873, + 6874, + 6875, + 6876, + 6877, + 6878, + 6879, + 6880, + 6881, + 6882, + 6883, + 6884, + 6885, + 6886, + 6887, + 6888, + 6889, + 6890, + 6891, + 6892, + 6893, + 6894, + 6895, + 6896, + 6897, + 6898, + 6899, + 6900, + 6901, + 6902, + 6903, + 6904, + 6905, + 6906, + 6907, + 6908, + 6909, + 6910, + 6911, + 6913, + 6914, + 6915, + 6916, + 6917, + 6918, + 6919, + 6920, + 6921, + 6922, + 6923, + 6924, + 6925, + 6926, + 6927, + 6928, + 6929, + 6930, + 6931, + 6933, + 6934, + 6935, + 6936, + 6937, + 6938, + 6939, + 6940, + 6941, + 6942, + 6943, + 6944, + 6945, + 6946, + 6947, + 6948, + 6949, + 6950, + 6951, + 6952, + 6953, + 6954, + 6955, + 6956, + 6957, + 6958, + 6959, + 6960, + 6961, + 6962, + 6963, + 6964, + 6965, + 6966, + 6967, + 6968, + 6969, + 6970, + 6971, + 6972, + 6973, + 6974, + 6975, + 6976, + 6977, + 6978, + 6979, + 6980, + 6981, + 6982, + 6983, + 6984, + 6985, + 6986, + 6987, + 6988, + 6989, + 6990, + 6991, + 6992, + 6993, + 6994, + 6995, + 6996, + 6997, + 6998, + 6999, + 7000, + 7001, + 7002, + 7003, + 7004, + 7005, + 7006, + 7007, + 7008, + 7009, + 7010, + 7012, + 7013, + 7014, + 7015, + 7016, + 7017, + 7018, + 7019, + 7020, + 7021, + 7022, + 7024, + 7025, + 7026, + 7027, + 7028, + 7029, + 7030, + 7031, + 7032, + 7033, + 7034, + 7035, + 7036, + 7037, + 7038, + 7039, + 7040, + 7041, + 7042, + 7043, + 7044, + 7045, + 7046, + 7047, + 7048, + 7049, + 7050, + 7051, + 7052, + 7053, + 7054, + 7055, + 7056, + 7057, + 7058, + 7059, + 7060, + 7061, + 7062, + 7063, + 7064, + 7065, + 7066, + 7067, + 7068, + 7069, + 7070, + 7071, + 7072, + 7073, + 7074, + 7075, + 7076, + 7077, + 7079, + 7080, + 7081, + 7082, + 7083, + 7084, + 7085, + 7086, + 7087, + 7088, + 7089, + 7090, + 7091, + 7092, + 7093, + 7094, + 7095, + 7096, + 7097, + 7098, + 7099, + 7100, + 7101, + 7102, + 7103, + 7104, + 7105, + 7106, + 7107, + 7108, + 7109, + 7110, + 7112, + 7113, + 7114, + 7115, + 7116, + 7117, + 7118, + 7119, + 7120, + 7121, + 7122, + 7123, + 7124, + 7125, + 7126, + 7127, + 7128, + 7129, + 7130, + 7131, + 7132, + 7133, + 7134, + 7135, + 7136, + 7137, + 7138, + 7139, + 7140, + 7141, + 7142, + 7143, + 7144, + 7145, + 7146, + 7147, + 7148, + 7149, + 7150, + 7151, + 7152, + 7153, + 7154, + 7155, + 7157, + 7158, + 7159, + 7160, + 7161, + 7162, + 7163, + 7164, + 7165, + 7166, + 7167, + 7168, + 7169, + 7170, + 7171, + 7172, + 7173, + 7174, + 7175, + 7176, + 7177, + 7178, + 7179, + 7180, + 7181, + 7182, + 7183, + 7184, + 7186, + 7187, + 7188, + 7189, + 7190, + 7191, + 7192, + 7193, + 7194, + 7195, + 7196, + 7197, + 7198, + 7199, + 7200, + 7201, + 7202, + 7203, + 7204, + 7205, + 7206, + 7207, + 7208, + 7209, + 7210, + 7211, + 7212, + 7213, + 7214, + 7215, + 7216, + 7217, + 7218, + 7219, + 7220, + 7221, + 7222, + 7223, + 7224, + 7225, + 7226, + 7227, + 7228, + 7229, + 7230, + 7231, + 7232, + 7233, + 7234, + 7235, + 7236, + 7237, + 7238, + 7239, + 7240, + 7241, + 7242, + 7243, + 7244, + 7245, + 7246, + 7247, + 7248, + 7249, + 7250, + 7251, + 7252, + 7253, + 7254, + 7255, + 7256, + 7257, + 7258, + 7259, + 7260, + 7261, + 7262, + 7263, + 7264, + 7265, + 7267, + 7268, + 7269, + 7270, + 7271, + 7272, + 7273, + 7274, + 7275, + 7276, + 7277, + 7278, + 7279, + 7280, + 7281, + 7282, + 7283, + 7284, + 7285, + 7286, + 7287, + 7288, + 7289, + 7290, + 7291, + 7292, + 7293, + 7294, + 7295, + 7296, + 7297, + 7298, + 7299, + 7300, + 7301, + 7302, + 7303, + 7304, + 7305, + 7306, + 7307, + 7308, + 7309, + 7311, + 7312, + 7313, + 7314, + 7315, + 7316, + 7317, + 7318, + 7319, + 7320, + 7321, + 7322, + 7323, + 7324, + 7325, + 7326, + 7327, + 7328, + 7329, + 7330, + 7331, + 7332, + 7333, + 7334, + 7335, + 7336, + 7337, + 7338, + 7339, + 7340, + 7341, + 7342, + 7343, + 7344, + 7345, + 7346, + 7347, + 7348, + 7349, + 7350, + 7351, + 7352, + 7353, + 7354, + 7355, + 7356, + 7357, + 7358, + 7359, + 7360, + 7361, + 7362, + 7363, + 7364, + 7365, + 7366, + 7367, + 7368, + 7369, + 7370, + 7371, + 7372, + 7373, + 7374, + 7375, + 7376, + 7377, + 7378, + 7379, + 7380, + 7382, + 7383, + 7384, + 7385, + 7386, + 7387, + 7388, + 7389, + 7390, + 7391, + 7392, + 7393, + 7394, + 7395, + 7396, + 7397, + 7398, + 7399, + 7400, + 7401, + 7402, + 7403, + 7404, + 7405, + 7406, + 7407, + 7408, + 7409, + 7410, + 7411, + 7412, + 7413, + 7414, + 7415, + 7416, + 7417, + 7418, + 7419, + 7420, + 7421, + 7422, + 7423, + 7424, + 7425, + 7426, + 7427, + 7428, + 7429, + 7430, + 7431, + 7432, + 7433, + 7434, + 7435, + 7436, + 7437, + 7438, + 7439, + 7440, + 7441, + 7442, + 7443, + 7444, + 7445, + 7446, + 7447, + 7448, + 7449, + 7450, + 7451, + 7452, + 7453, + 7454, + 7455, + 7456, + 7457, + 7458, + 7459, + 7460, + 7461, + 7462, + 7463, + 7464, + 7465, + 7466, + 7467, + 7468, + 7469, + 7470, + 7471, + 7472, + 7473, + 7474, + 7475, + 7476, + 7477, + 7478, + 7479, + 7480, + 7481, + 7482, + 7483, + 7484, + 7485, + 7486, + 7487, + 7488, + 7489, + 7490, + 7491, + 7492, + 7493, + 7494, + 7495, + 7496, + 7497, + 7498, + 7499, + 7500, + 7501, + 7503, + 7504, + 7505, + 7506, + 7507, + 7508, + 7509, + 7510, + 7511, + 7512, + 7513, + 7514, + 7515, + 7516, + 7517, + 7518, + 7519, + 7520, + 7521, + 7522, + 7523, + 7524, + 7525, + 7526, + 7527, + 7528, + 7529, + 7530, + 7531, + 7532, + 7533, + 7534, + 7535, + 7536, + 7537, + 7538, + 7539, + 7540, + 7541, + 7542, + 7543, + 7544, + 7545, + 7546, + 7547, + 7548, + 7549, + 7550, + 7551, + 7552, + 7553, + 7554, + 7555, + 7556, + 7557, + 7558, + 7559, + 7560, + 7561, + 7562, + 7563, + 7564, + 7565, + 7566, + 7567, + 7568, + 7569, + 7570, + 7571, + 7572, + 7573, + 7574, + 7575, + 7576, + 7577, + 7578, + 7579, + 7580, + 7581, + 7582, + 7583, + 7584, + 7585, + 7586, + 7587, + 7588, + 7589, + 7590, + 7591, + 7592, + 7593, + 7594, + 7595, + 7596, + 7597, + 7598, + 7599, + 7600, + 7601, + 7602, + 7603, + 7604, + 7605, + 7606, + 7607, + 7608, + 7609, + 7610, + 7611, + 7612, + 7613, + 7614, + 7615, + 7616, + 7617, + 7618, + 7619, + 7620, + 7621, + 7622, + 7623, + 7624, + 7625, + 7626, + 7627, + 7628, + 7629, + 7630, + 7631, + 7632, + 7633, + 7634, + 7635, + 7636, + 7637, + 7638, + 7639, + 7640, + 7641, + 7642, + 7643, + 7644, + 7645, + 7646, + 7647, + 7648, + 7649, + 7650, + 7651, + 7652, + 7653, + 7654, + 7655, + 7656, + 7657, + 7658, + 7659, + 7660, + 7661, + 7662, + 7663, + 7664, + 7665, + 7666, + 7667, + 7668, + 7669, + 7670, + 7671, + 7672, + 7673, + 7675, + 7676, + 7677, + 7678, + 7679, + 7680, + 7681, + 7682, + 7683, + 7684, + 7685, + 7686, + 7687, + 7688, + 7689, + 7690, + 7691, + 7692, + 7693, + 7694, + 7695, + 7696, + 7697, + 7698, + 7699, + 7700, + 7701, + 7702, + 7703, + 7704, + 7705, + 7706, + 7707, + 7708, + 7709, + 7710, + 7711, + 7712, + 7713, + 7714, + 7715, + 7716, + 7717, + 7718, + 7719, + 7720, + 7721, + 7722, + 7723, + 7724, + 7725, + 7726, + 7727, + 7728, + 7729, + 7730, + 7731, + 7732, + 7733, + 7734, + 7736, + 7737, + 7738, + 7739, + 7740, + 7741, + 7742, + 7743, + 7744, + 7745, + 7746, + 7747, + 7748, + 7749, + 7750, + 7751, + 7752, + 7753, + 7754, + 7755, + 7756, + 7757, + 7758, + 7759, + 7760, + 7762, + 7763, + 7764, + 7765, + 7766, + 7767, + 7768, + 7769, + 7770, + 7771, + 7772, + 7773, + 7774, + 7775, + 7776, + 7777, + 7778, + 7779, + 7780, + 7781, + 7782, + 7783, + 7784, + 7785, + 7786, + 7787, + 7788, + 7789, + 7790, + 7791, + 7792, + 7793, + 7794, + 7795, + 7796, + 7797, + 7798, + 7799, + 7800, + 7801, + 7802, + 7803, + 7804, + 7805, + 7807, + 7808, + 7809, + 7810, + 7811, + 7812, + 7813, + 7816, + 7817, + 7818, + 7819, + 7821, + 7822, + 7823, + 7824, + 7825, + 7826, + 7827, + 7828, + 7829, + 7830, + 7831, + 7832, + 7833, + 7834, + 7835, + 7836, + 7837, + 7838, + 7840, + 7841, + 7842, + 7843, + 7844, + 7845, + 7846, + 7847, + 7848, + 7849, + 7850, + 7851, + 7852, + 7853, + 7854, + 7855, + 7856, + 7857, + 7858, + 7859, + 7860, + 7861, + 7862, + 7863, + 7864, + 7865, + 7866, + 7867, + 7868, + 7869, + 7870, + 7871, + 7872, + 7873, + 7874, + 7875, + 7876, + 7877, + 7878, + 7879, + 7880, + 7881, + 7882, + 7883, + 7884, + 7885, + 7886, + 7887, + 7888, + 7889, + 7890, + 7891, + 7892, + 7893, + 7894, + 7895, + 7896, + 7897, + 7898, + 7899, + 7900, + 7901, + 7902, + 7903, + 7904, + 7905, + 7906, + 7907, + 7908, + 7909, + 7910, + 7911, + 7912, + 7913, + 7914, + 7915, + 7916, + 7917, + 7918, + 7919, + 7920, + 7921, + 7922, + 7923, + 7924, + 7925, + 7926, + 7927, + 7928, + 7929, + 7930, + 7931, + 7932, + 7933, + 7934, + 7935, + 7936, + 7937, + 7938, + 7939, + 7940, + 7941, + 7943, + 7944, + 7945, + 7946, + 7947, + 7948, + 7949, + 7950, + 7951, + 7952, + 7953, + 7954, + 7955, + 7956, + 7957, + 7958, + 7959, + 7960, + 7961, + 7963, + 7964, + 7965, + 7966, + 7967, + 7968, + 7969, + 7970, + 7971, + 7972, + 7973, + 7974, + 7975, + 7976, + 7977, + 7978, + 7979, + 7980, + 7981, + 7982, + 7983, + 7984, + 7985, + 7986, + 7987, + 7988, + 7989, + 7990, + 7991, + 7992, + 7993, + 7994, + 7995, + 7996, + 7997, + 7998, + 7999, + 8000, + 8001, + 8002, + 8003, + 8004, + 8005, + 8006, + 8007, + 8008, + 8009, + 8010, + 8011, + 8012, + 8013, + 8015, + 8016, + 8017, + 8018, + 8019, + 8020, + 8021, + 8022, + 8023, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8032, + 8033, + 8034, + 8035, + 8036, + 8037, + 8038, + 8039, + 8040, + 8041, + 8042, + 8043, + 8044, + 8045, + 8046, + 8047, + 8048, + 8049, + 8050, + 8051, + 8052, + 8053, + 8054, + 8055, + 8056, + 8057, + 8058, + 8059, + 8060, + 8061, + 8062, + 8063, + 8064, + 8065, + 8066, + 8067, + 8068, + 8069, + 8070, + 8071, + 8072, + 8073, + 8074, + 8075, + 8076, + 8077, + 8078, + 8079, + 8080, + 8081, + 8082, + 8083, + 8084, + 8085, + 8086, + 8087, + 8088, + 8089, + 8090, + 8091, + 8092, + 8093, + 8095, + 8096, + 8097, + 8098, + 8099, + 8100, + 8101, + 8102, + 8103, + 8104, + 8105, + 8106, + 8107, + 8108, + 8109, + 8110, + 8111, + 8112, + 8113, + 8114, + 8115, + 8116, + 8117, + 8118, + 8119, + 8120, + 8121, + 8122, + 8123, + 8124, + 8125, + 8126, + 8127, + 8128, + 8129, + 8130, + 8131, + 8132, + 8133, + 8134, + 8135, + 8136, + 8137, + 8138, + 8139, + 8140, + 8141, + 8142, + 8143, + 8144, + 8145, + 8146, + 8147, + 8148, + 8149, + 8150, + 8151, + 8152, + 8153, + 8154, + 8155, + 8156, + 8158, + 8159, + 8160, + 8161, + 8162, + 8163, + 8164, + 8165, + 8166, + 8167, + 8168, + 8169, + 8170, + 8171, + 8172, + 8173, + 8174, + 8175, + 8176, + 8177, + 8178, + 8179, + 8180, + 8181, + 8182, + 8183, + 8184, + 8185, + 8186, + 8187, + 8188, + 8189, + 8190, + 8191, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8202, + 8203, + 8204, + 8205, + 8206, + 8207, + 8208, + 8209, + 8210, + 8211, + 8212, + 8213, + 8214, + 8215, + 8216, + 8217, + 8218, + 8219, + 8220, + 8221, + 8222, + 8223, + 8224, + 8225, + 8226, + 8227, + 8228, + 8229, + 8230, + 8231, + 8232, + 8233, + 8234, + 8235, + 8236, + 8237, + 8238, + 8239, + 8240, + 8241, + 8242, + 8243, + 8244, + 8245, + 8246, + 8247, + 8248, + 8249, + 8251, + 8252, + 8253, + 8254, + 8255, + 8256, + 8257, + 8258, + 8259, + 8260, + 8261, + 8262, + 8263, + 8264, + 8265, + 8266, + 8267, + 8268, + 8269, + 8270, + 8271, + 8272, + 8273, + 8274, + 8275, + 8276, + 8277, + 8278, + 8279, + 8280, + 8281, + 8282, + 8283, + 8284, + 8285, + 8286, + 8287, + 8288, + 8289, + 8290, + 8291, + 8292, + 8293, + 8294, + 8295, + 8296, + 8297, + 8298, + 8299, + 8300, + 8301, + 8302, + 8303, + 8304, + 8305, + 8306, + 8307, + 8308, + 8309, + 8310, + 8311, + 8312, + 8313, + 8314, + 8315, + 8316, + 8317, + 8318, + 8319, + 8320, + 8321, + 8322, + 8323, + 8324, + 8325, + 8326, + 8327, + 8328, + 8329, + 8330, + 8331, + 8332, + 8333, + 8334, + 8335, + 8336, + 8337, + 8338, + 8339, + 8340, + 8342, + 8343, + 8344, + 8345, + 8346, + 8347, + 8348, + 8349, + 8350, + 8351, + 8352, + 8353, + 8354, + 8355, + 8356, + 8357, + 8358, + 8359, + 8360, + 8361, + 8362, + 8363, + 8364, + 8365, + 8366, + 8367, + 8368, + 8369, + 8370, + 8371, + 8372, + 8373, + 8374, + 8375, + 8376, + 8377, + 8378, + 8379, + 8380, + 8381, + 8382, + 8383, + 8384, + 8385, + 8386, + 8387, + 8388, + 8389, + 8390, + 8391, + 8392, + 8393, + 8394, + 8395, + 8397, + 8398, + 8399, + 8400, + 8401, + 8402, + 8403, + 8404, + 8405, + 8406, + 8407, + 8408, + 8409, + 8410, + 8411, + 8412, + 8413, + 8414, + 8415, + 8416, + 8417, + 8418, + 8419, + 8420, + 8421, + 8422, + 8423, + 8424, + 8425, + 8426, + 8427, + 8428, + 8429, + 8430, + 8431, + 8432, + 8433, + 8434, + 8435, + 8436, + 8437, + 8438, + 8439, + 8440, + 8441, + 8442, + 8443, + 8444, + 8445, + 8446, + 8447, + 8448, + 8449, + 8450, + 8451, + 8452, + 8453, + 8454, + 8455, + 8456, + 8457, + 8458, + 8459, + 8460, + 8461, + 8462, + 8463, + 8464, + 8465, + 8466, + 8467, + 8468, + 8469, + 8470, + 8471, + 8472, + 8473, + 8474, + 8475, + 8476, + 8477, + 8478, + 8479, + 8480, + 8481, + 8482, + 8483, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8491, + 8492, + 8493, + 8494, + 8495, + 8496, + 8497, + 8499, + 8500, + 8501, + 8502, + 8503, + 8504, + 8505, + 8506, + 8507, + 8508, + 8509, + 8510, + 8511, + 8512, + 8513, + 8514, + 8515, + 8516, + 8517, + 8518, + 8519, + 8520, + 8521, + 8522, + 8523, + 8524, + 8525, + 8526, + 8527, + 8528, + 8529, + 8530, + 8531, + 8532, + 8533, + 8534, + 8535, + 8536, + 8537, + 8538, + 8539, + 8540, + 8541, + 8542, + 8543, + 8544, + 8545, + 8546, + 8547, + 8548, + 8549, + 8550, + 8552, + 8553, + 8554, + 8555, + 8556, + 8557, + 8558, + 8559, + 8561, + 8562, + 8563, + 8564, + 8565, + 8566, + 8567, + 8568, + 8569, + 8570, + 8571, + 8572, + 8573, + 8574, + 8575, + 8576, + 8577, + 8578, + 8579, + 8580, + 8581, + 8582, + 8583, + 8584, + 8585, + 8586, + 8587, + 8588, + 8589, + 8590, + 8591, + 8592, + 8593, + 8594, + 8595, + 8596, + 8597, + 8598, + 8599, + 8600, + 8601, + 8602, + 8603, + 8604, + 8605, + 8606, + 8607, + 8608, + 8609, + 8610, + 8611, + 8612, + 8613, + 8614, + 8615, + 8617, + 8618, + 8619, + 8620, + 8621, + 8622, + 8623, + 8624, + 8625, + 8626, + 8628, + 8629, + 8630, + 8631, + 8632, + 8633, + 8634, + 8635, + 8636, + 8637, + 8638, + 8639, + 8640, + 8641, + 8642, + 8643, + 8644, + 8645, + 8646, + 8647, + 8648, + 8649, + 8650, + 8651, + 8652, + 8653, + 8654, + 8655, + 8656, + 8657, + 8658, + 8659, + 8660, + 8661, + 8662, + 8663, + 8664, + 8665, + 8666, + 8667, + 8668, + 8669, + 8670, + 8671, + 8672, + 8673, + 8674, + 8675, + 8676, + 8677, + 8678, + 8680, + 8681, + 8682, + 8683, + 8684, + 8685, + 8686, + 8687, + 8688, + 8689, + 8690, + 8691, + 8692, + 8693, + 8694, + 8695, + 8696, + 8697, + 8698, + 8699, + 8700, + 8701, + 8702, + 8703, + 8704, + 8705, + 8706, + 8707, + 8708, + 8709, + 8710, + 8711, + 8712, + 8713, + 8714, + 8715, + 8716, + 8718, + 8719, + 8720, + 8721, + 8722, + 8723, + 8724, + 8725, + 8726, + 8727, + 8728, + 8730, + 8731, + 8732, + 8733, + 8734, + 8735, + 8736, + 8737, + 8738, + 8739, + 8740, + 8741, + 8742, + 8743, + 8744, + 8745, + 8746, + 8747, + 8748, + 8749, + 8750, + 8751, + 8752, + 8753, + 8754, + 8755, + 8756, + 8757, + 8758, + 8759, + 8760, + 8761, + 8762, + 8763, + 8765, + 8766, + 8767, + 8768, + 8769, + 8770, + 8771, + 8772, + 8773, + 8774, + 8775, + 8776, + 8777, + 8778, + 8779, + 8780, + 8781, + 8782, + 8784, + 8785, + 8786, + 8787, + 8788, + 8789, + 8790, + 8791, + 8792, + 8793, + 8794, + 8795, + 8796, + 8797, + 8798, + 8799, + 8800, + 8801, + 8802, + 8803, + 8804, + 8805, + 8806, + 8807, + 8808, + 8809, + 8810, + 8811, + 8812, + 8813, + 8814, + 8815, + 8816, + 8817, + 8818, + 8819, + 8820, + 8821, + 8822, + 8823, + 8824, + 8825, + 8826, + 8827, + 8828, + 8829, + 8830, + 8831, + 8832, + 8833, + 8834, + 8835, + 8836, + 8837, + 8838, + 8839, + 8840, + 8841, + 8842, + 8843, + 8844, + 8845, + 8846, + 8847, + 8848, + 8849, + 8850, + 8851, + 8852, + 8853, + 8854, + 8855, + 8856, + 8857, + 8858, + 8859, + 8860, + 8861, + 8862, + 8863, + 8864, + 8865, + 8866, + 8867, + 8868, + 8869, + 8870, + 8871, + 8872, + 8873, + 8874, + 8875, + 8876, + 8877, + 8878, + 8879, + 8880, + 8881, + 8882, + 8883, + 8884, + 8886, + 8887, + 8888, + 8889, + 8890, + 8891, + 8892, + 8893, + 8894, + 8895, + 8896, + 8897, + 8898, + 8899, + 8900, + 8901, + 8902, + 8903, + 8904, + 8905, + 8906, + 8907, + 8908, + 8909, + 8910, + 8911, + 8912, + 8913, + 8914, + 8915, + 8916, + 8917, + 8918, + 8919, + 8920, + 8921, + 8922, + 8923, + 8924, + 8925, + 8926, + 8927, + 8928, + 8929, + 8930, + 8931, + 8932, + 8933, + 8934, + 8935, + 8936, + 8937, + 8938, + 8939, + 8940, + 8941, + 8942, + 8943, + 8944, + 8945, + 8946, + 8947, + 8948, + 8949, + 8950, + 8951, + 8952, + 8953, + 8954, + 8955, + 8956, + 8957, + 8958, + 8959, + 8960, + 8961, + 8962, + 8963, + 8964, + 8965, + 8966, + 8967, + 8968, + 8969, + 8970, + 8971, + 8972, + 8973, + 8974, + 8975, + 8976, + 8977, + 8978, + 8979, + 8980, + 8981, + 8982, + 8984, + 8985, + 8986, + 8987, + 8988, + 8989, + 8990, + 8991, + 8992, + 8993, + 8994, + 8995, + 8996, + 8997, + 8998, + 8999, + 9000, + 9001, + 9002, + 9003, + 9005, + 9006, + 9007, + 9008, + 9009, + 9010, + 9011, + 9012, + 9013, + 9014, + 9015, + 9016, + 9017, + 9018, + 9019, + 9020, + 9021, + 9022, + 9023, + 9024, + 9025, + 9026, + 9027, + 9028, + 9029, + 9030, + 9031, + 9032, + 9033, + 9034, + 9035, + 9036, + 9037, + 9038, + 9039, + 9040, + 9041, + 9042, + 9043, + 9044, + 9045, + 9046, + 9047, + 9048, + 9049, + 9050, + 9051, + 9052, + 9053, + 9054, + 9055, + 9056, + 9057, + 9058, + 9059, + 9060, + 9061, + 9062, + 9063, + 9064, + 9065, + 9066, + 9067, + 9068, + 9069, + 9070, + 9071, + 9072, + 9073, + 9074, + 9075, + 9076, + 9077, + 9078, + 9079, + 9080, + 9081, + 9082, + 9083, + 9084, + 9085, + 9086, + 9087, + 9088, + 9089, + 9090, + 9091, + 9092, + 9093, + 9094, + 9095, + 9096, + 9097, + 9098, + 9099, + 9100, + 9101, + 9102, + 9103, + 9104, + 9105, + 9106, + 9107, + 9108, + 9109, + 9110, + 9111, + 9112, + 9113, + 9114, + 9115, + 9116, + 9117, + 9118, + 9119, + 9120, + 9121, + 9122, + 9123, + 9124, + 9125, + 9126, + 9127, + 9128, + 9129, + 9130, + 9131, + 9132, + 9133, + 9134, + 9135, + 9136, + 9137, + 9138, + 9139, + 9140, + 9141, + 9142, + 9143, + 9144, + 9145, + 9146, + 9147, + 9148, + 9149, + 9150, + 9151, + 9152, + 9153, + 9155, + 9156, + 9157, + 9158, + 9159, + 9160, + 9161, + 9162, + 9163, + 9164, + 9165, + 9166, + 9167, + 9168, + 9169, + 9170, + 9171, + 9172, + 9173, + 9174, + 9175, + 9176, + 9177, + 9178, + 9179, + 9180, + 9181, + 9182, + 9183, + 9184, + 9185, + 9186, + 9187, + 9188, + 9189, + 9190, + 9191, + 9192, + 9193, + 9194, + 9195, + 9196, + 9197, + 9198, + 9199, + 9200, + 9201, + 9202, + 9203, + 9204, + 9205, + 9206, + 9207, + 9208, + 9209, + 9210, + 9211, + 9212, + 9213, + 9214, + 9215, + 9216, + 9217, + 9218, + 9219, + 9220, + 9221, + 9222, + 9223, + 9224, + 9225, + 9226, + 9227, + 9228, + 9229, + 9230, + 9231, + 9232, + 9233, + 9234, + 9235, + 9236, + 9237, + 9238, + 9239, + 9240, + 9241, + 9242, + 9243, + 9244, + 9245, + 9246, + 9247, + 9248, + 9249, + 9250, + 9251, + 9252, + 9253, + 9254, + 9255, + 9256, + 9257, + 9258, + 9259, + 9260, + 9261, + 9262, + 9263, + 9264, + 9265, + 9266, + 9267, + 9268, + 9269, + 9270, + 9271, + 9272, + 9273, + 9274, + 9275, + 9276, + 9277, + 9278, + 9279, + 9280, + 9281, + 9282, + 9283, + 9284, + 9285, + 9286, + 9287, + 9288, + 9289, + 9290, + 9291, + 9292, + 9293, + 9294, + 9295, + 9296, + 9297, + 9298, + 9299, + 9300, + 9301, + 9302, + 9303, + 9304, + 9305, + 9306, + 9307, + 9308, + 9309, + 9310, + 9311, + 9312, + 9313, + 9314, + 9315, + 9316, + 9317, + 9318, + 9319, + 9320, + 9321, + 9322, + 9323, + 9324, + 9325, + 9326, + 9327, + 9328, + 9329, + 9330, + 9331, + 9332, + 9333, + 9334, + 9335, + 9336, + 9337, + 9338, + 9339, + 9340, + 9341, + 9342, + 9343, + 9344, + 9345, + 9346, + 9347, + 9348, + 9349, + 9350, + 9351, + 9352, + 9353, + 9354, + 9355, + 9356, + 9357, + 9358, + 9359, + 9360, + 9361, + 9362, + 9363, + 9364, + 9365, + 9366, + 9367, + 9368, + 9369, + 9370, + 9371, + 9372, + 9373, + 9374, + 9375, + 9376, + 9377, + 9378, + 9379, + 9380, + 9381, + 9382, + 9383, + 9384, + 9385, + 9386, + 9387, + 9388, + 9389, + 9390, + 9391, + 9392, + 9393, + 9394, + 9395, + 9396, + 9397, + 9398, + 9399, + 9400, + 9401, + 9402, + 9403, + 9404, + 9405, + 9406, + 9407, + 9408, + 9409, + 9410, + 9411, + 9412, + 9413, + 9414, + 9415, + 9416, + 9418, + 9419, + 9420, + 9421, + 9422, + 9423, + 9424, + 9425, + 9426, + 9427, + 9428, + 9429, + 9430, + 9431, + 9432, + 9433, + 9434, + 9435, + 9436, + 9437, + 9438, + 9439, + 9440, + 9441, + 9442, + 9443, + 9444, + 9445, + 9446, + 9447, + 9448, + 9449, + 9450, + 9451, + 9452, + 9453, + 9454, + 9455, + 9456, + 9457, + 9458, + 9459, + 9460, + 9461, + 9462, + 9463, + 9464, + 9465, + 9466, + 9467, + 9468, + 9469, + 9470, + 9471, + 9472, + 9473, + 9474, + 9475, + 9476, + 9477, + 9478, + 9479, + 9480, + 9481, + 9482, + 9483, + 9484, + 9485, + 9486, + 9487, + 9488, + 9489, + 9490, + 9491, + 9492, + 9493, + 9494, + 9495, + 9496, + 9497, + 9498, + 9499, + 9500, + 9501, + 9502, + 9503, + 9504, + 9505, + 9506, + 9507, + 9508, + 9509, + 9510, + 9511, + 9512, + 9513, + 9514, + 9515, + 9516, + 9517, + 9518, + 9519, + 9520, + 9521, + 9522, + 9523, + 9524, + 9525, + 9526, + 9527, + 9528, + 9530, + 9531, + 9532, + 9533, + 9534, + 9535, + 9536, + 9537, + 9538, + 9539, + 9540, + 9542, + 9544, + 9545, + 9546, + 9547, + 9548, + 9549, + 9550, + 9551, + 9552, + 9553, + 9554, + 9555, + 9556, + 9557, + 9558, + 9559, + 9560, + 9561, + 9562, + 9563, + 9564, + 9565, + 9566, + 9567, + 9568, + 9569, + 9570, + 9571, + 9572, + 9573, + 9574, + 9575, + 9576, + 9577, + 9578, + 9579, + 9580, + 9581, + 9583, + 9584, + 9585, + 9586, + 9587, + 9588, + 9589, + 9590, + 9591, + 9592, + 9593, + 9594, + 9595, + 9596, + 9597, + 9598, + 9599, + 9600, + 9601, + 9602, + 9603, + 9604, + 9605, + 9606, + 9607, + 9608, + 9609, + 9610, + 9611, + 9612, + 9613, + 9614, + 9616, + 9617, + 9618, + 9619, + 9620, + 9621, + 9622, + 9623, + 9624, + 9625, + 9626, + 9627, + 9628, + 9630, + 9631, + 9632, + 9633, + 9634, + 9635, + 9636, + 9637, + 9638, + 9639, + 9640, + 9641, + 9642, + 9643, + 9644, + 9645, + 9646, + 9647, + 9648, + 9649, + 9650, + 9651, + 9652, + 9653, + 9654, + 9655, + 9656, + 9657, + 9658, + 9659, + 9660, + 9661, + 9662, + 9663, + 9664, + 9665, + 9666, + 9668, + 9669, + 9670, + 9671, + 9672, + 9674, + 9675, + 9676, + 9677, + 9678, + 9679, + 9680, + 9681, + 9682, + 9683, + 9684, + 9685, + 9686, + 9687, + 9688, + 9689, + 9690, + 9691, + 9692, + 9693, + 9694, + 9695, + 9696, + 9697, + 9698, + 9699, + 9700, + 9701, + 9702, + 9703, + 9704, + 9705, + 9706, + 9708, + 9710, + 9711, + 9712, + 9714, + 9716, + 9717, + 9718, + 9719, + 9720, + 9721, + 9722, + 9723, + 9724, + 9725, + 9726, + 9727, + 9728, + 9729, + 9731, + 9732, + 9733, + 9734, + 9735, + 9736, + 9737, + 9738, + 9739, + 9740, + 9741, + 9742, + 9743, + 9744, + 9745, + 9746, + 9747, + 9748, + 9749, + 9750, + 9752, + 9753, + 9754, + 9755, + 9756, + 9757, + 9758, + 9759, + 9760, + 9761, + 9762, + 9763, + 9764, + 9765, + 9766, + 9767, + 9768, + 9769, + 9770, + 9771, + 9772, + 9773, + 9774, + 9775, + 9776, + 9777, + 9778, + 9779, + 9780, + 9781, + 9782, + 9783, + 9784, + 9785, + 9786, + 9787, + 9788, + 9789, + 9790, + 9791, + 9792, + 9793, + 9794, + 9795, + 9796, + 9797, + 9798, + 9799, + 9800, + 9801, + 9802, + 9803, + 9804, + 9805, + 9806, + 9807, + 9808, + 9809, + 9810, + 9811, + 9812, + 9813, + 9814, + 9815, + 9816, + 9817, + 9818, + 9819, + 9820, + 9821, + 9822, + 9823, + 9824, + 9825, + 9826, + 9827, + 9828, + 9829, + 9830, + 9831, + 9832, + 9833, + 9834, + 9835, + 9836, + 9837, + 9838, + 9839, + 9840, + 9841, + 9842, + 9843, + 9844, + 9845, + 9846, + 9847, + 9848, + 9849, + 9850, + 9851, + 9852, + 9853, + 9854, + 9855, + 9856, + 9857, + 9858, + 9859, + 9860, + 9861, + 9862, + 9863, + 9864, + 9865, + 9866, + 9867, + 9868, + 9869, + 9870, + 9871, + 9872, + 9873, + 9874, + 9875, + 9876, + 9878, + 9879, + 9880, + 9881, + 9882, + 9883, + 9885, + 9886, + 9887, + 9888, + 9889, + 9890, + 9891, + 9892, + 9893, + 9894, + 9895, + 9896, + 9897, + 9898, + 9899, + 9900, + 9901, + 9902, + 9903, + 9904, + 9905, + 9906, + 9907, + 9908, + 9909, + 9910, + 9911, + 9912, + 9913, + 9914, + 9915, + 9916, + 9917, + 9918, + 9919, + 9920, + 9921, + 9922, + 9923, + 9924, + 9925, + 9926, + 9927, + 9928, + 9929, + 9930, + 9931, + 9932, + 9933, + 9934, + 9935, + 9936, + 9937, + 9938, + 9939, + 9940, + 9941, + 9942, + 9943, + 9944, + 9945, + 9946, + 9947, + 9948, + 9949, + 9950, + 9951, + 9952, + 9953, + 9954, + 9955, + 9956, + 9957, + 9958, + 9959, + 9960, + 9961, + 9962, + 9963, + 9964, + 9965, + 9966, + 9967, + 9968, + 9969, + 9970, + 9971, + 9972, + 9973, + 9974, + 9975, + 9976, + 9977, + 9978, + 9979, + 9980, + 9981, + 9982, + 9983, + 9984, + 9985, + 9986, + 9987, + 9989, + 9990, + 9991, + 9992, + 9993, + 9994, + 9995, + 9996, + 9997, + 9998, + 9999, + 10000, + 10001, + 10002, + 10003, + 10004, + 10005, + 10006, + 10007, + 10008, + 10009, + 10010, + 10011, + 10012, + 10013, + 10016, + 10017, + 10018, + 10019, + 10020, + 10021, + 10022, + 10023, + 10025, + 10027, + 10028, + 10029, + 10030, + 10031, + 10032, + 10033, + 10034, + 10035, + 10036, + 10037, + 10038, + 10039, + 10040, + 10041, + 10042, + 10043, + 10044, + 10045, + 10046, + 10047, + 10048, + 10049, + 10050, + 10051, + 10052, + 10053, + 10054, + 10055, + 10056, + 10057, + 10058, + 10059, + 10060, + 10061, + 10062, + 10063, + 10065, + 10066, + 10067, + 10068, + 10069, + 10070, + 10071, + 10072, + 10073, + 10074, + 10075, + 10076, + 10077, + 10078, + 10079, + 10080, + 10081, + 10082, + 10084, + 10085, + 10086, + 10087, + 10088, + 10089, + 10090, + 10091, + 10092, + 10093, + 10094, + 10095, + 10096, + 10097, + 10098, + 10099, + 10100, + 10101, + 10102, + 10103, + 10104, + 10105, + 10106, + 10107, + 10108, + 10109, + 10110, + 10111, + 10112, + 10113, + 10114, + 10115, + 10116, + 10117, + 10118, + 10120, + 10121, + 10122, + 10123, + 10124, + 10125, + 10126, + 10127, + 10128, + 10129, + 10130, + 10131, + 10132, + 10133, + 10134, + 10135, + 10136, + 10137, + 10138, + 10139, + 10140, + 10141, + 10142, + 10143, + 10144, + 10145, + 10146, + 10147, + 10148, + 10149, + 10150, + 10151, + 10152, + 10153, + 10154, + 10156, + 10157, + 10158, + 10159, + 10160, + 10161, + 10162, + 10163, + 10164, + 10165, + 10166, + 10167, + 10168, + 10169, + 10170, + 10171, + 10172, + 10173, + 10174, + 10175, + 10176, + 10177, + 10178, + 10179, + 10180, + 10181, + 10182, + 10183, + 10184, + 10185, + 10186, + 10187, + 10188, + 10189, + 10190, + 10191, + 10192, + 10193, + 10194, + 10195, + 10196, + 10197, + 10198, + 10199, + 10201, + 10202, + 10203, + 10204, + 10205, + 10206, + 10207, + 10208, + 10209, + 10210, + 10211, + 10212, + 10213, + 10214, + 10215, + 10216, + 10217, + 10218, + 10219, + 10220, + 10221, + 10222, + 10223, + 10224, + 10225, + 10226, + 10227, + 10228, + 10229, + 10230, + 10231, + 10232, + 10233, + 10234, + 10235, + 10236, + 10237, + 10238, + 10239, + 10240, + 10241, + 10242, + 10243, + 10244, + 10245, + 10246, + 10247, + 10248, + 10249, + 10250, + 10251, + 10252, + 10253, + 10254, + 10255, + 10256, + 10257, + 10258, + 10259, + 10260, + 10261, + 10262, + 10263, + 10264, + 10265, + 10266, + 10267, + 10268, + 10269, + 10270, + 10271, + 10272, + 10273, + 10274, + 10275, + 10276, + 10277, + 10278, + 10279, + 10280, + 10281, + 10282, + 10283, + 10284, + 10285, + 10286, + 10287, + 10288, + 10289, + 10290, + 10291, + 10292, + 10293, + 10294, + 10295, + 10296, + 10297, + 10298, + 10299, + 10300, + 10302, + 10303, + 10304, + 10305, + 10306, + 10307, + 10308, + 10309, + 10310, + 10311, + 10312, + 10313, + 10314, + 10315, + 10316, + 10317, + 10318, + 10319, + 10320, + 10321, + 10322, + 10323, + 10324, + 10325, + 10326, + 10327, + 10328, + 10329, + 10330, + 10331, + 10332, + 10333, + 10334, + 10335, + 10336, + 10337, + 10338, + 10339, + 10340, + 10341, + 10342, + 10343, + 10344, + 10345, + 10346, + 10347, + 10348, + 10349, + 10350, + 10351, + 10352, + 10353, + 10354, + 10355, + 10356, + 10357, + 10358, + 10359, + 10360, + 10361, + 10362, + 10363, + 10364, + 10365, + 10366, + 10367, + 10368, + 10369, + 10370, + 10371, + 10372, + 10373, + 10374, + 10375, + 10376, + 10377, + 10379, + 10380, + 10381, + 10382, + 10383, + 10384, + 10385, + 10386, + 10387, + 10388, + 10389, + 10390, + 10391, + 10392, + 10393, + 10394, + 10395, + 10396, + 10397, + 10398, + 10399, + 10400, + 10401, + 10402, + 10403, + 10404, + 10405, + 10406, + 10407, + 10408, + 10409, + 10410, + 10411, + 10412, + 10413, + 10414, + 10415, + 10416, + 10417, + 10418, + 10419, + 10420, + 10421, + 10423, + 10424, + 10425, + 10426, + 10427, + 10428, + 10429, + 10430, + 10431, + 10432, + 10433, + 10434, + 10435, + 10436, + 10437, + 10438, + 10439, + 10440, + 10441, + 10442, + 10443, + 10444, + 10445, + 10446, + 10447, + 10448, + 10449, + 10450, + 10451, + 10452, + 10453, + 10454, + 10455, + 10456, + 10457, + 10458, + 10459, + 10460, + 10461, + 10462, + 10463, + 10464, + 10465, + 10466, + 10467, + 10468, + 10470, + 10471, + 10472, + 10473, + 10474, + 10475, + 10476, + 10477, + 10478, + 10479, + 10480, + 10481, + 10482, + 10483, + 10484, + 10485, + 10486, + 10487, + 10488, + 10489, + 10490, + 10491, + 10492, + 10493, + 10494, + 10495, + 10496, + 10497, + 10498, + 10499, + 10500, + 10501, + 10502, + 10503, + 10504, + 10505, + 10506, + 10507, + 10508, + 10509, + 10510, + 10511, + 10512, + 10513, + 10514, + 10515, + 10516, + 10517, + 10519, + 10520, + 10521, + 10522, + 10523, + 10524, + 10525, + 10526, + 10527, + 10528, + 10529, + 10530, + 10531, + 10532, + 10533, + 10534, + 10535, + 10536, + 10537, + 10538, + 10539, + 10540, + 10541, + 10542, + 10543, + 10544, + 10545, + 10546, + 10547, + 10548, + 10549, + 10550, + 10551, + 10552, + 10553, + 10554, + 10555, + 10556, + 10558, + 10559, + 10560, + 10561, + 10562, + 10563, + 10564, + 10565, + 10566, + 10567, + 10568, + 10569, + 10570, + 10571, + 10572, + 10573, + 10574, + 10575, + 10576, + 10577, + 10578, + 10579, + 10580, + 10581, + 10582, + 10583, + 10584, + 10585, + 10586, + 10587, + 10588, + 10589, + 10590, + 10591, + 10592, + 10593, + 10594, + 10595, + 10596, + 10597, + 10598, + 10599, + 10600, + 10601, + 10602, + 10603, + 10604, + 10605, + 10606, + 10607, + 10608, + 10609, + 10610, + 10611, + 10612, + 10613, + 10615, + 10616, + 10617, + 10618, + 10619, + 10620, + 10621, + 10622, + 10623, + 10624, + 10625, + 10626, + 10627, + 10628, + 10629, + 10630, + 10631, + 10632, + 10634, + 10635, + 10636, + 10637, + 10639, + 10640, + 10641, + 10642, + 10643, + 10644, + 10645, + 10646, + 10647, + 10648, + 10649, + 10650, + 10651, + 10652, + 10653, + 10654, + 10655, + 10656, + 10657, + 10658, + 10659, + 10660, + 10661, + 10662, + 10663, + 10664, + 10666, + 10667, + 10668, + 10669, + 10670, + 10671, + 10672, + 10673, + 10675, + 10676, + 10677, + 10678, + 10679, + 10680, + 10681, + 10682, + 10683, + 10684, + 10685, + 10686, + 10687, + 10688, + 10689, + 10690, + 10691, + 10692, + 10693, + 10694, + 10695, + 10696, + 10697, + 10698, + 10699, + 10700, + 10701, + 10702, + 10703, + 10704, + 10705, + 10706, + 10707, + 10708, + 10709, + 10710, + 10711, + 10712, + 10713, + 10714, + 10715, + 10716, + 10717, + 10718, + 10719, + 10720, + 10721, + 10722, + 10723, + 10724, + 10725, + 10726, + 10727, + 10728, + 10729, + 10730, + 10731, + 10732, + 10733, + 10734, + 10735, + 10736, + 10737, + 10738, + 10739, + 10740, + 10741, + 10742, + 10743, + 10744, + 10745, + 10746, + 10747, + 10748, + 10749, + 10750, + 10751, + 10752, + 10753, + 10754, + 10755, + 10756, + 10757, + 10758, + 10759, + 10760, + 10761, + 10762, + 10763, + 10764, + 10765, + 10766, + 10767, + 10768, + 10769, + 10770, + 10771, + 10772, + 10773, + 10774, + 10775, + 10776, + 10777, + 10778, + 10779, + 10780, + 10781, + 10782, + 10783, + 10784, + 10785, + 10786, + 10787, + 10788, + 10789, + 10790, + 10791, + 10792, + 10793, + 10794, + 10795, + 10796, + 10797, + 10798, + 10799, + 10800, + 10801, + 10802, + 10803, + 10804, + 10805, + 10806, + 10807, + 10808, + 10809, + 10810, + 10811, + 10812, + 10813, + 10814, + 10815, + 10816, + 10818, + 10819, + 10820, + 10821, + 10822, + 10823, + 10824, + 10825, + 10826, + 10827, + 10828, + 10829, + 10830, + 10831, + 10832, + 10833, + 10834, + 10835, + 10836, + 10837, + 10838, + 10839, + 10840, + 10841, + 10842, + 10843, + 10844, + 10845, + 10846, + 10847, + 10848, + 10849, + 10850, + 10851, + 10852, + 10853, + 10854, + 10855, + 10856, + 10857, + 10858, + 10859, + 10860, + 10861, + 10862, + 10863, + 10864, + 10865, + 10866, + 10867, + 10868, + 10869, + 10870, + 10871, + 10872, + 10873, + 10874, + 10875, + 10876, + 10877, + 10878, + 10879, + 10880, + 10881, + 10882, + 10883, + 10884, + 10885, + 10886, + 10887, + 10888, + 10889, + 10890, + 10891, + 10892, + 10893, + 10894, + 10895, + 10896, + 10897, + 10898, + 10899, + 10900, + 10901, + 10902, + 10903, + 10904, + 10905, + 10906, + 10907, + 10908, + 10909, + 10910, + 10911, + 10912, + 10913, + 10914, + 10915, + 10916, + 10917, + 10918, + 10919, + 10920, + 10921, + 10922, + 10923, + 10924, + 10925, + 10926, + 10927, + 10928, + 10929, + 10930, + 10931, + 10932, + 10933, + 10934, + 10935, + 10936, + 10937, + 10938, + 10939, + 10940, + 10941, + 10942, + 10943, + 10944, + 10945, + 10947, + 10948, + 10949, + 10950, + 10951, + 10952, + 10953, + 10954, + 10955, + 10956, + 10957, + 10958, + 10959, + 10960, + 10961, + 10962, + 10963, + 10964, + 10965, + 10967, + 10968, + 10969, + 10970, + 10971, + 10972, + 10973, + 10974, + 10975, + 10976, + 10977, + 10978, + 10979, + 10980, + 10981, + 10982, + 10983, + 10984, + 10985, + 10986, + 10987, + 10988, + 10989, + 10990, + 10991, + 10992, + 10993, + 10994, + 10995, + 10996, + 10997, + 10998, + 10999, + 11000, + 11001, + 11002, + 11003, + 11004, + 11005, + 11006, + 11007, + 11008, + 11009, + 11010, + 11011, + 11012, + 11013, + 11014, + 11015, + 11016, + 11017, + 11018, + 11019, + 11020, + 11021, + 11022, + 11023, + 11024, + 11025, + 11026, + 11027, + 11028, + 11029, + 11030, + 11031, + 11032, + 11033, + 11034, + 11035, + 11036, + 11037, + 11038, + 11039, + 11040, + 11041, + 11042, + 11043, + 11044, + 11045, + 11046, + 11047, + 11048, + 11049, + 11050, + 11051, + 11052, + 11053, + 11054, + 11055, + 11056, + 11057, + 11058, + 11059, + 11060, + 11061, + 11062, + 11063, + 11064, + 11065, + 11066, + 11067, + 11068, + 11069, + 11070, + 11071, + 11072, + 11073, + 11074, + 11075, + 11076, + 11077, + 11078, + 11079, + 11080, + 11081, + 11082, + 11083, + 11084, + 11085, + 11086, + 11087, + 11088, + 11089, + 11090, + 11091, + 11092, + 11093, + 11094, + 11095, + 11096, + 11097, + 11098, + 11099, + 11100, + 11101, + 11102, + 11103, + 11104, + 11105, + 11106, + 11107, + 11108, + 11109, + 11110, + 11111, + 11112, + 11113, + 11114, + 11115, + 11116, + 11117, + 11118, + 11119, + 11120, + 11121, + 11122, + 11123, + 11124, + 11125, + 11126, + 11127, + 11128, + 11129, + 11130, + 11131, + 11132, + 11133, + 11134, + 11135, + 11136, + 11137, + 11138, + 11139, + 11140, + 11141, + 11142, + 11143, + 11144, + 11145, + 11146, + 11147, + 11148, + 11149, + 11150, + 11151, + 11152, + 11153, + 11154, + 11155, + 11156, + 11157, + 11158, + 11160, + 11161, + 11162, + 11163, + 11164, + 11165, + 11167, + 11168, + 11169, + 11170, + 11171, + 11172, + 11173, + 11174, + 11175, + 11176, + 11177, + 11178, + 11179, + 11180, + 11181, + 11182, + 11183, + 11184, + 11185, + 11186, + 11187, + 11188, + 11189, + 11190, + 11191, + 11192, + 11193, + 11194, + 11195, + 11196, + 11197, + 11198, + 11199, + 11200, + 11201, + 11202, + 11203, + 11204, + 11205, + 11206, + 11207, + 11208, + 11209, + 11210, + 11211, + 11212, + 11213, + 11214, + 11215, + 11216, + 11217, + 11218, + 11219, + 11220, + 11221, + 11222, + 11223, + 11224, + 11225, + 11226, + 11227, + 11228, + 11229, + 11230, + 11231, + 11232, + 11233, + 11234, + 11235, + 11236, + 11237, + 11238, + 11239, + 11240, + 11241, + 11242, + 11243, + 11244, + 11245, + 11246, + 11247, + 11248, + 11249, + 11250, + 11252, + 11253, + 11254, + 11255, + 11256, + 11257, + 11258, + 11259, + 11260, + 11261, + 11262, + 11263, + 11264, + 11265, + 11266, + 11267, + 11268, + 11269, + 11270, + 11271, + 11272, + 11273, + 11274, + 11275, + 11276, + 11277, + 11278, + 11279, + 11280, + 11281, + 11282, + 11283, + 11284, + 11285, + 11286, + 11287, + 11288, + 11289, + 11290, + 11291, + 11292, + 11293, + 11295, + 11296, + 11297, + 11298, + 11299, + 11300, + 11301, + 11302, + 11303, + 11304, + 11305, + 11306, + 11307, + 11308, + 11309, + 11310, + 11311, + 11312, + 11313, + 11314, + 11315, + 11316, + 11317, + 11318, + 11319, + 11320, + 11321, + 11322, + 11323, + 11324, + 11325, + 11326, + 11327, + 11328, + 11329, + 11330, + 11331, + 11332, + 11333, + 11334, + 11335, + 11336, + 11337, + 11338, + 11339, + 11340, + 11341, + 11342, + 11343, + 11344, + 11345, + 11346, + 11347, + 11348, + 11349, + 11350, + 11351, + 11352, + 11353, + 11354, + 11355, + 11356, + 11357, + 11358, + 11359, + 11360, + 11361, + 11362, + 11363, + 11364, + 11365, + 11366, + 11367, + 11368, + 11369, + 11370, + 11371, + 11372, + 11373, + 11374, + 11375, + 11376, + 11377, + 11378, + 11379, + 11380, + 11381, + 11382, + 11383, + 11384, + 11385, + 11386, + 11387, + 11388, + 11389, + 11390, + 11391, + 11392, + 11393, + 11394, + 11395, + 11396, + 11397, + 11398, + 11399, + 11400, + 11401, + 11402, + 11403, + 11404, + 11405, + 11406, + 11407, + 11408, + 11409, + 11410, + 11411, + 11412, + 11413, + 11414, + 11415, + 11416, + 11417, + 11418, + 11419, + 11420, + 11421, + 11422, + 11423, + 11424, + 11425, + 11426, + 11427, + 11428, + 11429, + 11430, + 11431, + 11432, + 11434, + 11435, + 11436, + 11437, + 11438, + 11439, + 11441, + 11442, + 11443, + 11444, + 11445, + 11446, + 11447, + 11448, + 11449, + 11450, + 11451, + 11452, + 11453, + 11454, + 11455, + 11456, + 11457, + 11458, + 11459, + 11460, + 11461, + 11462, + 11463, + 11464, + 11465, + 11466, + 11467, + 11468, + 11469, + 11470, + 11471, + 11472, + 11473, + 11475, + 11476, + 11477, + 11478, + 11479, + 11480, + 11481, + 11482, + 11483, + 11484, + 11485, + 11486, + 11487, + 11488, + 11489, + 11490, + 11491, + 11492, + 11493, + 11494, + 11495, + 11496, + 11497, + 11498, + 11500, + 11501, + 11502, + 11504, + 11505, + 11506, + 11507, + 11508, + 11509, + 11510, + 11512, + 11513, + 11514, + 11515, + 11516, + 11517, + 11518, + 11519, + 11520, + 11521, + 11522, + 11523, + 11524, + 11525, + 11526, + 11527, + 11528, + 11529, + 11531, + 11532, + 11533, + 11534, + 11535, + 11536, + 11537, + 11538, + 11539, + 11540, + 11541, + 11542, + 11543, + 11544, + 11545, + 11546, + 11547, + 11548, + 11549, + 11550, + 11551, + 11552, + 11553, + 11554, + 11555, + 11556, + 11557, + 11558, + 11559, + 11560, + 11561, + 11562, + 11563, + 11564, + 11565, + 11566, + 11567, + 11568, + 11569, + 11570, + 11571, + 11572, + 11573, + 11574, + 11575, + 11576, + 11577, + 11578, + 11579, + 11581, + 11582, + 11583, + 11584, + 11585, + 11586, + 11587, + 11588, + 11589, + 11590, + 11591, + 11592, + 11593, + 11594, + 11595, + 11596, + 11597, + 11598, + 11599, + 11600, + 11601, + 11602, + 11603, + 11604, + 11605, + 11606, + 11607, + 11608, + 11609, + 11610, + 11611, + 11612, + 11613, + 11614, + 11615, + 11616, + 11617, + 11618, + 11619, + 11620, + 11621, + 11622, + 11623, + 11624, + 11625, + 11626, + 11627, + 11628, + 11629, + 11630, + 11631, + 11632, + 11633, + 11634, + 11635, + 11636, + 11637, + 11638, + 11639, + 11640, + 11641, + 11642, + 11643, + 11644, + 11645, + 11646, + 11647, + 11648, + 11649, + 11650, + 11651, + 11652, + 11653, + 11654, + 11655, + 11656, + 11657, + 11658, + 11659, + 11660, + 11661, + 11662, + 11663, + 11664, + 11665, + 11666, + 11667, + 11668, + 11669, + 11670, + 11672, + 11673, + 11674, + 11675, + 11676, + 11677, + 11679, + 11680, + 11681, + 11682, + 11683, + 11684, + 11685, + 11686, + 11687, + 11688, + 11689, + 11690, + 11691, + 11692, + 11693, + 11694, + 11695, + 11696, + 11697, + 11698, + 11699, + 11700, + 11701, + 11702, + 11703, + 11704, + 11705, + 11706, + 11707, + 11708, + 11709, + 11710, + 11711, + 11712, + 11713, + 11714, + 11715, + 11716, + 11717, + 11718, + 11719, + 11720, + 11721, + 11722, + 11723, + 11724, + 11725, + 11726, + 11727, + 11728, + 11729, + 11730, + 11731, + 11732, + 11733, + 11734, + 11735, + 11736, + 11737, + 11738, + 11739, + 11740, + 11741, + 11742, + 11743, + 11744, + 11745, + 11746, + 11747, + 11748, + 11749, + 11750, + 11751, + 11752, + 11753, + 11754, + 11755, + 11756, + 11757, + 11758, + 11759, + 11761, + 11762, + 11763, + 11764, + 11765, + 11766, + 11767, + 11768, + 11769, + 11770, + 11771, + 11772, + 11773, + 11774, + 11775, + 11776, + 11777, + 11778, + 11779, + 11780, + 11781, + 11782, + 11783, + 11784, + 11785, + 11786, + 11787, + 11788, + 11789, + 11790, + 11791, + 11792, + 11793, + 11794, + 11795, + 11796, + 11797, + 11798, + 11799, + 11800, + 11801, + 11802, + 11803, + 11804, + 11805, + 11806, + 11807, + 11808, + 11809, + 11810, + 11811, + 11812, + 11813, + 11814, + 11815, + 11816, + 11817, + 11818, + 11819, + 11820, + 11821, + 11822, + 11823, + 11824, + 11825, + 11826, + 11827, + 11828, + 11829, + 11830, + 11831, + 11832, + 11833, + 11834, + 11835, + 11836, + 11837, + 11838, + 11839, + 11840, + 11841, + 11842, + 11843, + 11844, + 11845, + 11846, + 11847, + 11848, + 11849, + 11850, + 11851, + 11852, + 11853, + 11854, + 11855, + 11856, + 11857, + 11858, + 11859, + 11860, + 11861, + 11862, + 11863, + 11864, + 11866, + 11867, + 11868, + 11869, + 11870, + 11871, + 11872, + 11873, + 11874, + 11875, + 11876, + 11877, + 11878, + 11879, + 11880, + 11881, + 11882, + 11883, + 11884, + 11885, + 11886, + 11887, + 11888, + 11889, + 11890, + 11891, + 11892, + 11893, + 11894, + 11895, + 11896, + 11897, + 11898, + 11899, + 11900, + 11901, + 11902, + 11903, + 11904, + 11905, + 11906, + 11907, + 11908, + 11909, + 11910, + 11911, + 11912, + 11913, + 11914, + 11915, + 11916, + 11917, + 11918, + 11919, + 11920, + 11921, + 11922, + 11923, + 11924, + 11925, + 11926, + 11927, + 11928, + 11929, + 11930, + 11931, + 11932, + 11933, + 11934, + 11935, + 11936, + 11937, + 11938, + 11939, + 11940, + 11942, + 11943, + 11944, + 11945, + 11946, + 11947, + 11948, + 11949, + 11950, + 11951, + 11953, + 11954, + 11955, + 11956, + 11957, + 11958, + 11959, + 11960, + 11961, + 11962, + 11963, + 11964, + 11965, + 11966, + 11967, + 11968, + 11969, + 11970, + 11971, + 11972, + 11973, + 11974, + 11975, + 11976, + 11977, + 11978, + 11979, + 11980, + 11981, + 11982, + 11983, + 11984, + 11985, + 11986, + 11987, + 11988, + 11989, + 11990, + 11991, + 11992, + 11993, + 11994, + 11995, + 11996, + 11997, + 11998, + 11999, + 12000, + 12001, + 12002, + 12003, + 12004, + 12005, + 12006, + 12007, + 12008, + 12009, + 12010, + 12011, + 12012, + 12013, + 12014, + 12015, + 12016, + 12017, + 12018, + 12019, + 12020, + 12021, + 12023, + 12024, + 12025, + 12026, + 12027, + 12028, + 12029, + 12030, + 12031, + 12032, + 12033, + 12034, + 12035, + 12036, + 12037, + 12038, + 12039, + 12040, + 12041, + 12042, + 12043, + 12044, + 12045, + 12046, + 12047, + 12048, + 12049, + 12050, + 12051, + 12052, + 12053, + 12054, + 12055, + 12056, + 12057, + 12058, + 12059, + 12060, + 12061, + 12062, + 12063, + 12064, + 12065, + 12066, + 12067, + 12068, + 12069, + 12070, + 12071, + 12072, + 12073, + 12074, + 12075, + 12076, + 12077, + 12078, + 12079, + 12080, + 12081, + 12082, + 12083, + 12084, + 12085, + 12086, + 12087, + 12088, + 12089, + 12090, + 12091, + 12092, + 12093, + 12095, + 12096, + 12097, + 12099, + 12100, + 12101, + 12102, + 12103, + 12104, + 12105, + 12106, + 12107, + 12108, + 12109, + 12110, + 12111, + 12112, + 12113, + 12114, + 12115, + 12116, + 12117, + 12118, + 12119, + 12120, + 12121, + 12122, + 12123, + 12124, + 12125, + 12126, + 12127, + 12128, + 12129, + 12130, + 12131, + 12132, + 12133, + 12134, + 12135, + 12136, + 12137, + 12138, + 12139, + 12140, + 12141, + 12142, + 12143, + 12144, + 12145, + 12146, + 12147, + 12148, + 12149, + 12150, + 12151, + 12152, + 12153, + 12154, + 12155, + 12156, + 12157, + 12158, + 12159, + 12160, + 12161, + 12162, + 12163, + 12164, + 12165, + 12166, + 12167, + 12168, + 12169, + 12170, + 12171, + 12172, + 12173, + 12174, + 12175, + 12176, + 12177, + 12178, + 12179, + 12180, + 12181, + 12182, + 12183, + 12184, + 12185, + 12186, + 12187, + 12188, + 12189, + 12190, + 12191, + 12192, + 12193, + 12194, + 12195, + 12196, + 12197, + 12198, + 12199, + 12200, + 12201, + 12202, + 12203, + 12204, + 12205, + 12206, + 12207, + 12208, + 12209, + 12210, + 12211, + 12212, + 12213, + 12214, + 12215, + 12216, + 12217, + 12218, + 12219, + 12220, + 12221, + 12222, + 12224, + 12225, + 12226, + 12227, + 12228, + 12229, + 12230, + 12231, + 12232, + 12233, + 12234, + 12235, + 12236, + 12237, + 12238, + 12239, + 12240, + 12241, + 12242, + 12243, + 12244, + 12245, + 12246, + 12247, + 12248, + 12249, + 12250, + 12251, + 12252, + 12253, + 12254, + 12255, + 12256, + 12257, + 12258, + 12259, + 12260, + 12261, + 12262, + 12263, + 12264, + 12265, + 12266, + 12267, + 12268, + 12269, + 12270, + 12271, + 12272, + 12273, + 12274, + 12275, + 12276, + 12277, + 12278, + 12279, + 12280, + 12281, + 12282, + 12283, + 12284, + 12285, + 12286, + 12287, + 12288, + 12289, + 12290, + 12291, + 12292, + 12293, + 12294, + 12295, + 12296, + 12297, + 12298, + 12299, + 12300, + 12301, + 12302, + 12303, + 12304, + 12305, + 12306, + 12307, + 12308, + 12309, + 12310, + 12311, + 12312, + 12313, + 12314, + 12315, + 12316, + 12317, + 12318, + 12319, + 12320, + 12321, + 12322, + 12323, + 12324, + 12325, + 12326, + 12327, + 12328, + 12329, + 12330, + 12331, + 12332, + 12333, + 12334, + 12335, + 12336, + 12337, + 12338, + 12339, + 12340, + 12341, + 12342, + 12344, + 12345, + 12346, + 12347, + 12348, + 12349, + 12350, + 12351, + 12352, + 12353, + 12354, + 12355, + 12356, + 12357, + 12358, + 12359, + 12360, + 12361, + 12362, + 12363, + 12364, + 12365, + 12366, + 12367, + 12368, + 12369, + 12370, + 12371, + 12372, + 12373, + 12374, + 12375, + 12376, + 12377, + 12378, + 12379, + 12380, + 12381, + 12382, + 12383, + 12384, + 12385, + 12387, + 12388, + 12389, + 12390, + 12391, + 12392, + 12393, + 12394, + 12395, + 12396, + 12397, + 12398, + 12399, + 12400, + 12401, + 12402, + 12403, + 12404, + 12405, + 12406, + 12407, + 12408, + 12409, + 12410, + 12411, + 12412, + 12413, + 12414, + 12415, + 12416, + 12417, + 12418, + 12419, + 12420, + 12421, + 12422, + 12423, + 12424, + 12425, + 12427, + 12428, + 12429, + 12430, + 12431, + 12432, + 12433, + 12434, + 12435, + 12436, + 12437, + 12438, + 12439, + 12440, + 12441, + 12442, + 12443, + 12444, + 12445, + 12446, + 12447, + 12448, + 12449, + 12450, + 12451, + 12452, + 12453, + 12454, + 12455, + 12456, + 12458, + 12459, + 12460, + 12461, + 12462, + 12463, + 12464, + 12465, + 12466, + 12467, + 12468, + 12469, + 12470, + 12471, + 12472, + 12473, + 12474, + 12475, + 12476, + 12478, + 12479, + 12480, + 12481, + 12482, + 12483, + 12485, + 12486, + 12487, + 12488, + 12489, + 12490, + 12491, + 12492, + 12493, + 12494, + 12495, + 12496, + 12497, + 12498, + 12499, + 12500, + 12501, + 12502, + 12503, + 12504, + 12505, + 12506, + 12507, + 12508, + 12509, + 12510, + 12511, + 12512, + 12513, + 12514, + 12515, + 12516, + 12517, + 12518, + 12519, + 12520, + 12521, + 12522, + 12523, + 12524, + 12525, + 12526, + 12528, + 12529, + 12530, + 12531, + 12532, + 12533, + 12534, + 12535, + 12536, + 12537, + 12538, + 12539, + 12540, + 12541, + 12542, + 12543, + 12544, + 12545, + 12546, + 12547, + 12548, + 12549, + 12550, + 12551, + 12552, + 12553, + 12554, + 12555, + 12556, + 12557, + 12558, + 12559, + 12560, + 12561, + 12562, + 12563, + 12564, + 12565, + 12566, + 12567, + 12568, + 12569, + 12570, + 12572, + 12573, + 12574, + 12575, + 12576, + 12577, + 12578, + 12579, + 12580, + 12581, + 12582, + 12583, + 12584, + 12585, + 12586, + 12587, + 12588, + 12589, + 12590, + 12591, + 12592, + 12593, + 12596, + 12597, + 12598, + 12599, + 12600, + 12601, + 12602, + 12603, + 12604, + 12605, + 12606, + 12607, + 12608, + 12609, + 12610, + 12611, + 12612, + 12613, + 12614, + 12615, + 12616, + 12617, + 12618, + 12619, + 12620, + 12621, + 12622, + 12623, + 12624, + 12625, + 12626, + 12627, + 12628, + 12629, + 12630, + 12631, + 12632, + 12633, + 12634, + 12635, + 12636, + 12637, + 12638, + 12639, + 12640, + 12641, + 12642, + 12643, + 12644, + 12645, + 12646, + 12647, + 12648, + 12649, + 12650, + 12651, + 12652, + 12653, + 12654, + 12655, + 12656, + 12657, + 12658, + 12659, + 12660, + 12661, + 12662, + 12663, + 12664, + 12665, + 12666, + 12667, + 12668, + 12669, + 12670, + 12671, + 12672, + 12673, + 12674, + 12675, + 12677, + 12678, + 12679, + 12680, + 12681, + 12682, + 12683, + 12684, + 12685, + 12686, + 12687, + 12688, + 12689, + 12690, + 12691, + 12692, + 12693, + 12694, + 12695, + 12696, + 12697, + 12698, + 12699, + 12700, + 12701, + 12702, + 12703, + 12704, + 12705, + 12706, + 12707, + 12708, + 12709, + 12710, + 12711, + 12712, + 12713, + 12714, + 12715, + 12716, + 12717, + 12718, + 12719, + 12720, + 12721, + 12722, + 12723, + 12724, + 12725, + 12726, + 12727, + 12728, + 12729, + 12730, + 12731, + 12732, + 12733, + 12734, + 12735, + 12736, + 12737, + 12738, + 12739, + 12740, + 12741, + 12742, + 12743, + 12744, + 12745, + 12746, + 12748, + 12749, + 12750, + 12751, + 12752, + 12753, + 12754, + 12755, + 12756, + 12757, + 12758, + 12759, + 12760, + 12761, + 12762, + 12763, + 12764, + 12765, + 12766, + 12767, + 12768, + 12769, + 12770, + 12771, + 12772, + 12773, + 12774, + 12775, + 12776, + 12777, + 12778, + 12779, + 12780, + 12781, + 12782, + 12783, + 12784, + 12785, + 12786, + 12787, + 12788, + 12789, + 12790, + 12791, + 12792, + 12793, + 12794, + 12795, + 12796, + 12797, + 12798, + 12800, + 12801, + 12802, + 12803, + 12804, + 12805, + 12806, + 12807, + 12808, + 12809, + 12810, + 12811, + 12812, + 12813, + 12814, + 12815, + 12816, + 12817, + 12818, + 12819, + 12820, + 12821, + 12822, + 12823, + 12824, + 12825, + 12826, + 12827, + 12828, + 12829, + 12830, + 12831, + 12832, + 12833, + 12835, + 12836, + 12837, + 12838, + 12839, + 12840, + 12841, + 12842, + 12843, + 12844, + 12845, + 12846, + 12847, + 12849, + 12850, + 12851, + 12852, + 12853, + 12854, + 12855, + 12856, + 12857, + 12858, + 12859, + 12860, + 12862, + 12863, + 12864, + 12865, + 12866, + 12867, + 12868, + 12869, + 12870, + 12871, + 12872, + 12873, + 12874, + 12875, + 12876, + 12877, + 12878, + 12879, + 12880, + 12881, + 12882, + 12883, + 12884, + 12885, + 12886, + 12887, + 12888, + 12889, + 12890, + 12891, + 12892, + 12893, + 12894, + 12895, + 12896, + 12897, + 12898, + 12899, + 12900, + 12901, + 12902, + 12903, + 12904, + 12905, + 12906, + 12907, + 12908, + 12909, + 12910, + 12911, + 12912, + 12913, + 12914, + 12915, + 12916, + 12917, + 12918, + 12919, + 12920, + 12921, + 12922, + 12923, + 12924, + 12925, + 12926, + 12927, + 12928, + 12929, + 12930, + 12931, + 12933, + 12934, + 12935, + 12936, + 12937, + 12938, + 12939, + 12940, + 12941, + 12942, + 12943, + 12944, + 12945, + 12946, + 12947, + 12948, + 12949, + 12950, + 12951, + 12952, + 12953, + 12954, + 12955, + 12956, + 12957, + 12958, + 12959, + 12960, + 12961, + 12962, + 12963, + 12964, + 12966, + 12967, + 12968, + 12969, + 12970, + 12971, + 12972, + 12973, + 12974, + 12975, + 12976, + 12977, + 12978, + 12979, + 12980, + 12981, + 12982, + 12983, + 12984, + 12985, + 12986, + 12987, + 12988, + 12989, + 12990, + 12991, + 12992, + 12993, + 12994, + 12995, + 12996, + 12997, + 12998, + 12999, + 13000, + 13001, + 13002, + 13003, + 13004, + 13005, + 13006, + 13007, + 13008, + 13009, + 13010, + 13011, + 13012, + 13014, + 13015, + 13016, + 13017, + 13018, + 13019, + 13020, + 13021, + 13022, + 13023, + 13024, + 13025, + 13026, + 13027, + 13028, + 13029, + 13030, + 13031, + 13032, + 13033, + 13034, + 13035, + 13036, + 13037, + 13038, + 13039, + 13040, + 13041, + 13042, + 13043, + 13044, + 13045, + 13046, + 13047, + 13048, + 13049, + 13051, + 13052, + 13053, + 13054, + 13055, + 13056, + 13057, + 13058, + 13059, + 13060, + 13061, + 13062, + 13063, + 13064, + 13065, + 13066, + 13067, + 13068, + 13069, + 13070, + 13071, + 13072, + 13073, + 13074, + 13075, + 13076, + 13077, + 13078, + 13079, + 13080, + 13081, + 13082, + 13083, + 13084, + 13085, + 13086, + 13087, + 13088, + 13089, + 13090, + 13091, + 13092, + 13093, + 13094, + 13095, + 13096, + 13097, + 13098, + 13099, + 13100, + 13101, + 13102, + 13103, + 13104, + 13105, + 13106, + 13107, + 13108, + 13109, + 13110, + 13111, + 13112, + 13113, + 13114, + 13115, + 13117, + 13118, + 13119, + 13120, + 13121, + 13122, + 13123, + 13124, + 13125, + 13126, + 13127, + 13128, + 13129, + 13130, + 13131, + 13132, + 13133, + 13134, + 13135, + 13136, + 13137, + 13138, + 13139, + 13140, + 13141, + 13142, + 13143, + 13144, + 13145, + 13146, + 13147, + 13148, + 13149, + 13150, + 13151, + 13152, + 13153, + 13154, + 13155, + 13156, + 13157, + 13158, + 13159, + 13160, + 13161, + 13162, + 13163, + 13164, + 13165, + 13166, + 13167, + 13168, + 13169, + 13170, + 13171, + 13172, + 13173, + 13174, + 13175, + 13176, + 13177, + 13178, + 13179, + 13180, + 13181, + 13182, + 13184, + 13185, + 13186, + 13187, + 13188, + 13189, + 13190, + 13191, + 13192, + 13193, + 13194, + 13195, + 13196, + 13197, + 13198, + 13199, + 13200, + 13201, + 13202, + 13203, + 13204, + 13205, + 13206, + 13207, + 13208, + 13209, + 13210, + 13211, + 13212, + 13213, + 13214, + 13215, + 13216, + 13217, + 13218, + 13219, + 13220, + 13221, + 13222, + 13223, + 13224, + 13225, + 13226, + 13227, + 13228, + 13229, + 13230, + 13231, + 13232, + 13233, + 13234, + 13235, + 13236, + 13237, + 13238, + 13239, + 13240, + 13241, + 13242, + 13243, + 13244, + 13245, + 13246, + 13247, + 13248, + 13249, + 13250, + 13251, + 13252, + 13253, + 13254, + 13255, + 13256, + 13257, + 13258, + 13259, + 13260, + 13261, + 13262, + 13263, + 13264, + 13265, + 13266, + 13267, + 13268, + 13269, + 13270, + 13271, + 13272, + 13273, + 13274, + 13275, + 13276, + 13277, + 13278, + 13279, + 13280, + 13281, + 13282, + 13283, + 13284, + 13285, + 13286, + 13287, + 13288, + 13289, + 13290, + 13291, + 13292, + 13293, + 13294, + 13295, + 13296, + 13297, + 13298, + 13299, + 13300, + 13301, + 13302, + 13303, + 13304, + 13305, + 13306, + 13307, + 13308, + 13309, + 13310, + 13311, + 13312, + 13313, + 13315, + 13316, + 13317, + 13318, + 13319, + 13320, + 13321, + 13322, + 13323, + 13324, + 13325, + 13326, + 13327, + 13328, + 13329, + 13330, + 13331, + 13332, + 13333, + 13334, + 13335, + 13336, + 13337, + 13338, + 13339, + 13340, + 13341, + 13342, + 13343, + 13344, + 13345, + 13346, + 13347, + 13348, + 13349, + 13350, + 13351, + 13352, + 13353, + 13354, + 13355, + 13356, + 13357, + 13358, + 13359, + 13360, + 13361, + 13362, + 13364, + 13365, + 13366, + 13367, + 13368, + 13369, + 13370, + 13371, + 13372, + 13373, + 13374, + 13375, + 13376, + 13377, + 13378, + 13379, + 13380, + 13381, + 13382, + 13383, + 13384, + 13385, + 13386, + 13387, + 13388, + 13389, + 13390, + 13391, + 13392, + 13393, + 13394, + 13395, + 13396, + 13397, + 13398, + 13399, + 13400, + 13401, + 13402, + 13403, + 13404, + 13405, + 13406, + 13407, + 13408, + 13409, + 13410, + 13411, + 13412, + 13413, + 13414, + 13415, + 13416, + 13417, + 13418, + 13419, + 13420, + 13421, + 13422, + 13423, + 13424, + 13425, + 13426, + 13427, + 13428, + 13429, + 13430, + 13431, + 13432, + 13433, + 13434, + 13435, + 13436, + 13437, + 13438, + 13439, + 13440, + 13441, + 13442, + 13443, + 13444, + 13445, + 13446, + 13447, + 13448, + 13449, + 13450, + 13451, + 13452, + 13453, + 13454, + 13455, + 13456, + 13457, + 13458, + 13459, + 13460, + 13461, + 13462, + 13463, + 13464, + 13465, + 13466, + 13467, + 13468, + 13469, + 13470, + 13471, + 13472, + 13473, + 13474, + 13475, + 13476, + 13477, + 13478, + 13479, + 13480, + 13481, + 13482, + 13483, + 13484, + 13485, + 13486, + 13487, + 13488, + 13489, + 13490, + 13491, + 13492, + 13493, + 13494, + 13495, + 13496, + 13497, + 13498, + 13499, + 13500, + 13501, + 13502, + 13503, + 13504, + 13505, + 13506, + 13507, + 13508, + 13509, + 13510, + 13511, + 13512, + 13513, + 13514, + 13515, + 13516, + 13517, + 13518, + 13519, + 13520, + 13521, + 13522, + 13523, + 13524, + 13525, + 13526, + 13528, + 13529, + 13530, + 13531, + 13532, + 13533, + 13534, + 13535, + 13536, + 13537, + 13538, + 13539, + 13540, + 13541, + 13542, + 13543, + 13544, + 13545, + 13546, + 13547, + 13548, + 13549, + 13550, + 13551, + 13552, + 13553, + 13554, + 13555, + 13556, + 13557, + 13558, + 13559, + 13560, + 13561, + 13562, + 13563, + 13564, + 13565, + 13566, + 13567, + 13568, + 13569, + 13570, + 13571, + 13572, + 13573, + 13574, + 13575, + 13576, + 13577, + 13578, + 13579, + 13580, + 13581, + 13582, + 13583, + 13584, + 13585, + 13586, + 13587, + 13588, + 13589, + 13590, + 13591, + 13592, + 13593, + 13594, + 13595, + 13596, + 13597, + 13598, + 13599, + 13600, + 13601, + 13602, + 13603, + 13604, + 13605, + 13606, + 13607, + 13608, + 13609, + 13610, + 13611, + 13612, + 13613, + 13614, + 13615, + 13617, + 13618, + 13619, + 13620, + 13621, + 13623, + 13624, + 13625, + 13626, + 13627, + 13628, + 13629, + 13630, + 13631, + 13632, + 13633, + 13634, + 13635, + 13636, + 13637, + 13638, + 13639, + 13640, + 13641, + 13642, + 13643, + 13644, + 13645, + 13646, + 13647, + 13648, + 13650, + 13651, + 13652, + 13653, + 13654, + 13655, + 13656, + 13657, + 13658, + 13659, + 13660, + 13661, + 13662, + 13663, + 13664, + 13665, + 13666, + 13667, + 13668, + 13669, + 13670, + 13671, + 13672, + 13673, + 13674, + 13675, + 13676, + 13677, + 13678, + 13679, + 13680, + 13681, + 13682, + 13683, + 13684, + 13685, + 13686, + 13687, + 13688, + 13689, + 13690, + 13691, + 13692, + 13693, + 13694, + 13695, + 13697, + 13698, + 13699, + 13700, + 13701, + 13702, + 13703, + 13704, + 13705, + 13706, + 13707, + 13708, + 13709, + 13710, + 13711, + 13712, + 13713, + 13714, + 13715, + 13716, + 13717, + 13718, + 13719, + 13720, + 13721, + 13722, + 13723, + 13724, + 13725, + 13726, + 13727, + 13728, + 13729, + 13730, + 13731, + 13732, + 13733, + 13734, + 13735, + 13736, + 13737, + 13738, + 13739, + 13740, + 13741, + 13742, + 13743, + 13745, + 13746, + 13747, + 13748, + 13749, + 13750, + 13751, + 13752, + 13753, + 13754, + 13755, + 13756, + 13757, + 13758, + 13759, + 13760, + 13761, + 13762, + 13763, + 13764, + 13765, + 13766, + 13767, + 13768, + 13769, + 13770, + 13771, + 13772, + 13773, + 13774, + 13775, + 13776, + 13777, + 13778, + 13779, + 13780, + 13782, + 13783, + 13784, + 13785, + 13786, + 13787, + 13788, + 13789, + 13790, + 13791, + 13792, + 13793, + 13794, + 13795, + 13796, + 13797, + 13798, + 13799, + 13800, + 13801, + 13802, + 13803, + 13804, + 13805, + 13806, + 13807, + 13808, + 13809, + 13810, + 13811, + 13812, + 13813, + 13814, + 13815, + 13817, + 13818, + 13819, + 13820, + 13821, + 13822, + 13823, + 13824, + 13825, + 13826, + 13827, + 13828, + 13829, + 13830, + 13831, + 13832, + 13833, + 13834, + 13835, + 13836, + 13837, + 13838, + 13839, + 13840, + 13841, + 13842, + 13843, + 13844, + 13845, + 13846, + 13847, + 13849, + 13850, + 13851, + 13852, + 13853, + 13854, + 13855, + 13856, + 13857, + 13858, + 13859, + 13860, + 13861, + 13862, + 13863, + 13864, + 13865, + 13866, + 13867, + 13868, + 13869, + 13870, + 13871, + 13872, + 13873, + 13874, + 13875, + 13876, + 13877, + 13878, + 13879, + 13880, + 13881, + 13882, + 13883, + 13884, + 13885, + 13886, + 13887, + 13888, + 13889, + 13890, + 13891, + 13892, + 13893, + 13894, + 13895, + 13896, + 13897, + 13898, + 13899, + 13900, + 13901, + 13902, + 13903, + 13904, + 13905, + 13906, + 13907, + 13908, + 13909, + 13910, + 13911, + 13912, + 13913, + 13914, + 13915, + 13916, + 13917, + 13918, + 13919, + 13920, + 13921, + 13922, + 13923, + 13924, + 13925, + 13926, + 13927, + 13928, + 13929, + 13930, + 13931, + 13932, + 13933, + 13934, + 13935, + 13936, + 13937, + 13938, + 13939, + 13940, + 13941, + 13942, + 13943, + 13944, + 13945, + 13946, + 13947, + 13948, + 13949, + 13950, + 13951, + 13952, + 13953, + 13954, + 13955, + 13956, + 13957, + 13958, + 13959, + 13960, + 13961, + 13962, + 13963, + 13964, + 13965, + 13966, + 13967, + 13968, + 13969, + 13970, + 13971, + 13972, + 13973, + 13974, + 13975, + 13976, + 13977, + 13978, + 13979, + 13980, + 13981, + 13982, + 13983, + 13984, + 13985, + 13986, + 13987, + 13988, + 13989, + 13990, + 13991, + 13992, + 13993, + 13994, + 13995, + 13996, + 13997, + 13999, + 14000, + 14001, + 14002, + 14003, + 14004, + 14005, + 14006, + 14007, + 14008, + 14010, + 14011, + 14012, + 14013, + 14014, + 14015, + 14016, + 14017, + 14019, + 14020, + 14021, + 14022, + 14023, + 14024, + 14025, + 14026, + 14027, + 14028, + 14029, + 14030, + 14031, + 14033, + 14034, + 14035, + 14036, + 14037, + 14038, + 14039, + 14040, + 14041, + 14042, + 14043, + 14044, + 14045, + 14046, + 14047, + 14048, + 14049, + 14050, + 14051, + 14052, + 14053, + 14054, + 14055, + 14056, + 14057, + 14058, + 14059, + 14060, + 14061, + 14062, + 14063, + 14064, + 14065, + 14066, + 14067, + 14068, + 14069, + 14070, + 14071, + 14072, + 14073, + 14074, + 14075, + 14076, + 14077, + 14078, + 14079, + 14080, + 14081, + 14082, + 14083, + 14084, + 14085, + 14086, + 14087, + 14088, + 14089, + 14090, + 14091, + 14092, + 14093, + 14094, + 14095, + 14096, + 14097, + 14098, + 14099, + 14100, + 14101, + 14102, + 14103, + 14104, + 14105, + 14106, + 14107, + 14108, + 14109, + 14110, + 14111, + 14112, + 14113, + 14114, + 14115, + 14116, + 14117, + 14118, + 14119, + 14120, + 14121, + 14122, + 14123, + 14124, + 14125, + 14126, + 14127, + 14128, + 14129, + 14130, + 14131, + 14132, + 14133, + 14134, + 14135, + 14136, + 14137, + 14138, + 14139, + 14140, + 14141, + 14142, + 14143, + 14144, + 14145, + 14146, + 14147, + 14148, + 14149, + 14150, + 14151, + 14152, + 14153, + 14154, + 14155, + 14156, + 14157, + 14158, + 14159, + 14160, + 14161, + 14162, + 14163, + 14164, + 14165, + 14166, + 14167, + 14168, + 14169, + 14170, + 14171, + 14172, + 14173, + 14174, + 14175, + 14176, + 14177, + 14178, + 14179, + 14180, + 14181, + 14182, + 14183, + 14184, + 14185, + 14186, + 14187, + 14188, + 14189, + 14190, + 14191, + 14192, + 14193, + 14194, + 14195, + 14196, + 14197, + 14199, + 14200, + 14201, + 14202, + 14203, + 14204, + 14205, + 14206, + 14207, + 14208, + 14209, + 14210, + 14211, + 14212, + 14213, + 14214, + 14215, + 14216, + 14217, + 14218, + 14219, + 14220, + 14221, + 14222, + 14223, + 14224, + 14225, + 14226, + 14227, + 14228, + 14229, + 14230, + 14231, + 14232, + 14233, + 14234, + 14235, + 14236, + 14237, + 14238, + 14239, + 14240, + 14241, + 14242, + 14243, + 14244, + 14245, + 14246, + 14247, + 14249, + 14250, + 14251, + 14252, + 14253, + 14254, + 14255, + 14256, + 14257, + 14258, + 14259, + 14260, + 14261, + 14262, + 14263, + 14264, + 14265, + 14266, + 14267, + 14268, + 14269, + 14270, + 14271, + 14272, + 14274, + 14275, + 14276, + 14277, + 14278, + 14279, + 14280, + 14281, + 14282, + 14284, + 14285, + 14286, + 14287, + 14288, + 14289, + 14290, + 14291, + 14292, + 14293, + 14294, + 14295, + 14296, + 14297, + 14298, + 14299, + 14300, + 14301, + 14302, + 14303, + 14304, + 14305, + 14306, + 14307, + 14308, + 14309, + 14310, + 14311, + 14312, + 14313, + 14314, + 14316, + 14317, + 14318, + 14319, + 14320, + 14321, + 14322, + 14323, + 14324, + 14325, + 14326, + 14327, + 14329, + 14330, + 14331, + 14332, + 14333, + 14334, + 14335, + 14336, + 14337, + 14338, + 14339, + 14340, + 14341, + 14342, + 14343, + 14344, + 14345, + 14346, + 14347, + 14348, + 14349, + 14350, + 14351, + 14352, + 14353, + 14354, + 14355, + 14356, + 14357, + 14358, + 14359, + 14360, + 14361, + 14362, + 14363, + 14364, + 14365, + 14366, + 14367, + 14368, + 14369, + 14370, + 14371, + 14372, + 14373, + 14374, + 14375, + 14376, + 14377, + 14378, + 14379, + 14380, + 14381, + 14382, + 14383, + 14384, + 14385, + 14386, + 14387, + 14388, + 14389, + 14390, + 14391, + 14392, + 14393, + 14394, + 14395, + 14396, + 14397, + 14398, + 14399, + 14400, + 14401, + 14402, + 14403, + 14404, + 14406, + 14407, + 14408, + 14409, + 14410, + 14411, + 14412, + 14413, + 14414, + 14415, + 14416, + 14417, + 14418, + 14419, + 14420, + 14421, + 14422, + 14423, + 14424, + 14425, + 14426, + 14427, + 14428, + 14429, + 14430, + 14431, + 14432, + 14433, + 14435, + 14436, + 14438, + 14439, + 14440, + 14441, + 14442, + 14443, + 14444, + 14445, + 14446, + 14447, + 14448, + 14449, + 14450, + 14451, + 14452, + 14453, + 14454, + 14455, + 14456, + 14457, + 14458, + 14459, + 14460, + 14461, + 14462, + 14463, + 14464, + 14465, + 14466, + 14467, + 14468, + 14469, + 14470, + 14471, + 14472, + 14473, + 14474, + 14475, + 14477, + 14478, + 14479, + 14480, + 14481, + 14482, + 14483, + 14484, + 14485, + 14486, + 14487, + 14488, + 14489, + 14490, + 14491, + 14492, + 14493, + 14494, + 14495, + 14497, + 14498, + 14499, + 14500, + 14501, + 14502, + 14503, + 14504, + 14505, + 14506, + 14507, + 14508, + 14509, + 14510, + 14511, + 14512, + 14513, + 14514, + 14515, + 14516, + 14517, + 14518, + 14519, + 14520, + 14521, + 14522, + 14523, + 14524, + 14525, + 14526, + 14527, + 14528, + 14529, + 14530, + 14531, + 14532, + 14533, + 14534, + 14535, + 14536, + 14537, + 14538, + 14539, + 14540, + 14541, + 14542, + 14543, + 14544, + 14545, + 14546, + 14547, + 14548, + 14549, + 14550, + 14551, + 14552, + 14553, + 14554, + 14555, + 14556, + 14557, + 14558, + 14559, + 14560, + 14561, + 14562, + 14563, + 14564, + 14565, + 14566, + 14567, + 14568, + 14569, + 14570, + 14571, + 14572, + 14573, + 14574, + 14575, + 14576, + 14577, + 14578, + 14579, + 14580, + 14581, + 14582, + 14584, + 14585, + 14586, + 14587, + 14588, + 14589, + 14590, + 14591, + 14592, + 14593, + 14594, + 14596, + 14597, + 14598, + 14599, + 14600, + 14601, + 14602, + 14603, + 14604, + 14605, + 14606, + 14607, + 14608, + 14609, + 14610, + 14611, + 14612, + 14613, + 14614, + 14615, + 14616, + 14617, + 14618, + 14619, + 14621, + 14622, + 14623, + 14624, + 14625, + 14626, + 14627, + 14628, + 14629, + 14630, + 14631, + 14632, + 14633, + 14634, + 14635, + 14636, + 14637, + 14638, + 14639, + 14640, + 14641, + 14642, + 14643, + 14644, + 14645, + 14646, + 14647, + 14648, + 14649, + 14650, + 14651, + 14652, + 14653, + 14654, + 14655, + 14656, + 14658, + 14659, + 14660, + 14661, + 14662, + 14663, + 14664, + 14665, + 14666, + 14667, + 14668, + 14669, + 14670, + 14671, + 14672, + 14673, + 14674, + 14675, + 14676, + 14677, + 14678, + 14679, + 14680, + 14681, + 14682, + 14683, + 14684, + 14685, + 14686, + 14687, + 14688, + 14689, + 14690, + 14691, + 14692, + 14693, + 14694, + 14695, + 14696, + 14697, + 14698, + 14699, + 14700, + 14701, + 14702, + 14703, + 14705, + 14706, + 14707, + 14708, + 14709, + 14710, + 14711, + 14712, + 14713, + 14714, + 14715, + 14716, + 14717, + 14718, + 14719, + 14720, + 14721, + 14722, + 14723, + 14724, + 14725, + 14726, + 14727, + 14728, + 14729, + 14730, + 14731, + 14732, + 14733, + 14734, + 14735, + 14736, + 14737, + 14738, + 14739, + 14740, + 14741, + 14742, + 14744, + 14745, + 14746, + 14747, + 14748, + 14749, + 14750, + 14751, + 14752, + 14753, + 14754, + 14755, + 14756, + 14757, + 14758, + 14759, + 14760, + 14761, + 14762, + 14763, + 14764, + 14765, + 14766, + 14767, + 14768, + 14769, + 14770, + 14771, + 14772, + 14773, + 14774, + 14775, + 14776, + 14777, + 14778, + 14779, + 14780, + 14781, + 14782, + 14783, + 14784, + 14785, + 14786, + 14787, + 14789, + 14790, + 14791, + 14793, + 14794, + 14795, + 14796, + 14797, + 14798, + 14799, + 14800, + 14801, + 14802, + 14803, + 14804, + 14805, + 14806, + 14807, + 14808, + 14809, + 14810, + 14811, + 14813, + 14814, + 14815, + 14816, + 14817, + 14818, + 14819, + 14820, + 14821, + 14822, + 14823, + 14824, + 14825, + 14826, + 14827, + 14828, + 14829, + 14830, + 14831, + 14832, + 14833, + 14834, + 14835, + 14836, + 14837, + 14838, + 14839, + 14840, + 14841, + 14842, + 14843, + 14844, + 14845, + 14846, + 14847, + 14848, + 14849, + 14850, + 14851, + 14852, + 14853, + 14854, + 14855, + 14856, + 14857, + 14858, + 14859, + 14860, + 14861, + 14862, + 14863, + 14864, + 14866, + 14867, + 14868, + 14869, + 14870, + 14871, + 14872, + 14873, + 14874, + 14875, + 14876, + 14877, + 14878, + 14879, + 14880, + 14881, + 14882, + 14883, + 14884, + 14885, + 14886, + 14887, + 14888, + 14889, + 14890, + 14891, + 14892, + 14893, + 14894, + 14895, + 14896, + 14897, + 14898, + 14900, + 14901, + 14902, + 14903, + 14904, + 14905, + 14906, + 14908, + 14909, + 14910, + 14911, + 14912, + 14913, + 14914, + 14915, + 14916, + 14917, + 14918, + 14919, + 14920, + 14921, + 14922, + 14923, + 14924, + 14925, + 14926, + 14927, + 14928, + 14929, + 14930, + 14931, + 14932, + 14933, + 14934, + 14935, + 14936, + 14937, + 14938, + 14939, + 14940, + 14941, + 14942, + 14943, + 14944, + 14946, + 14947, + 14948, + 14949, + 14950, + 14951, + 14952, + 14953, + 14954, + 14955, + 14956, + 14957, + 14958, + 14959, + 14960, + 14961, + 14962, + 14963, + 14964, + 14965, + 14966, + 14967, + 14968, + 14969, + 14970, + 14971, + 14972, + 14973, + 14974, + 14975, + 14976, + 14977, + 14978, + 14979, + 14981, + 14982, + 14983, + 14984, + 14985, + 14986, + 14987, + 14988, + 14989, + 14990, + 14991, + 14992, + 14994, + 14995, + 14996, + 14997, + 14998, + 14999, + 15001, + 15002, + 15003, + 15004, + 15005, + 15006, + 15007, + 15008, + 15009, + 15010, + 15011, + 15012, + 15013, + 15014, + 15015, + 15016, + 15017, + 15018, + 15019, + 15020, + 15021, + 15022, + 15023, + 15025, + 15026, + 15027, + 15028, + 15029, + 15030, + 15031, + 15032, + 15033, + 15034, + 15036, + 15037, + 15038, + 15039, + 15040, + 15041, + 15042, + 15043, + 15044, + 15045, + 15046, + 15047, + 15048, + 15049, + 15050, + 15051, + 15052, + 15053, + 15054, + 15055, + 15056, + 15057, + 15058, + 15059, + 15060, + 15061, + 15062, + 15063, + 15064, + 15065, + 15066, + 15067, + 15068, + 15069, + 15070, + 15071, + 15072, + 15073, + 15074, + 15075, + 15076, + 15077, + 15078, + 15079, + 15080, + 15081, + 15082, + 15083, + 15084, + 15085, + 15086, + 15087, + 15088, + 15089, + 15090, + 15091, + 15092, + 15093, + 15094, + 15095, + 15096, + 15097, + 15098, + 15099, + 15100, + 15101, + 15102, + 15103, + 15104, + 15105, + 15106, + 15107, + 15108, + 15109, + 15110, + 15111, + 15112, + 15113, + 15114, + 15115, + 15116, + 15117, + 15118, + 15119, + 15120, + 15121, + 15122, + 15123, + 15124, + 15125, + 15126, + 15127, + 15128, + 15129, + 15130, + 15131, + 15132, + 15133, + 15134, + 15135, + 15136, + 15137, + 15138, + 15139, + 15140, + 15141, + 15143, + 15144, + 15145, + 15146, + 15147, + 15148, + 15149, + 15150, + 15151, + 15152, + 15153, + 15154, + 15155, + 15156, + 15157, + 15158, + 15159, + 15160, + 15161, + 15162, + 15163, + 15164, + 15165, + 15166, + 15167, + 15168, + 15170, + 15171, + 15172, + 15173, + 15174, + 15175, + 15176, + 15177, + 15178, + 15179, + 15180, + 15181, + 15182, + 15183, + 15184, + 15185, + 15186, + 15187, + 15188, + 15189, + 15190, + 15191, + 15192, + 15193, + 15194, + 15195, + 15196, + 15197, + 15198, + 15199, + 15200, + 15201, + 15202, + 15203, + 15204, + 15205, + 15206, + 15207, + 15208, + 15209, + 15211, + 15212, + 15213, + 15214, + 15215, + 15216, + 15217, + 15218, + 15219, + 15220, + 15221, + 15222, + 15223, + 15224, + 15225, + 15226, + 15227, + 15228, + 15229, + 15230, + 15231, + 15232, + 15233, + 15234, + 15235, + 15236, + 15237, + 15238, + 15239, + 15240, + 15241, + 15242, + 15243, + 15244, + 15245, + 15246, + 15247, + 15248, + 15249, + 15250, + 15251, + 15252, + 15253, + 15254, + 15255, + 15256, + 15257, + 15258, + 15259, + 15260, + 15261, + 15262, + 15263, + 15264, + 15265, + 15266, + 15267, + 15268, + 15269, + 15270, + 15272, + 15273, + 15274, + 15275, + 15276, + 15277, + 15278, + 15279, + 15280, + 15281, + 15282, + 15283, + 15284, + 15285, + 15286, + 15287, + 15288, + 15289, + 15290, + 15291, + 15292, + 15293, + 15294, + 15295, + 15296, + 15297, + 15298, + 15299, + 15300, + 15301, + 15302, + 15303, + 15304, + 15305, + 15306, + 15307, + 15308, + 15309, + 15310, + 15311, + 15312, + 15313, + 15314, + 15315, + 15316, + 15317, + 15318, + 15319, + 15320, + 15321, + 15322, + 15323, + 15324, + 15325, + 15326, + 15327, + 15328, + 15329, + 15330, + 15331, + 15332, + 15333, + 15334, + 15335, + 15336, + 15337, + 15338, + 15339, + 15340, + 15341, + 15342, + 15343, + 15344, + 15345, + 15346, + 15347, + 15348, + 15349, + 15350, + 15351, + 15352, + 15353, + 15354, + 15355, + 15356, + 15357, + 15358, + 15359, + 15360, + 15361, + 15362, + 15363, + 15364, + 15365, + 15366, + 15367, + 15368, + 15369, + 15370, + 15371, + 15372, + 15373, + 15374, + 15375, + 15376, + 15378, + 15379, + 15380, + 15381, + 15382, + 15383, + 15384, + 15385, + 15386, + 15387, + 15388, + 15389, + 15390, + 15391, + 15392, + 15393, + 15394, + 15395, + 15396, + 15397, + 15398, + 15399, + 15400, + 15401, + 15402, + 15403, + 15404, + 15405, + 15406, + 15407, + 15408, + 15409, + 15410, + 15411, + 15412, + 15413, + 15414, + 15415, + 15416, + 15417, + 15418, + 15419, + 15420, + 15421, + 15422, + 15423, + 15424, + 15426, + 15427, + 15428, + 15429, + 15430, + 15431, + 15432, + 15433, + 15434, + 15435, + 15436, + 15437, + 15438, + 15439, + 15440, + 15441, + 15442, + 15443, + 15444, + 15445, + 15446, + 15447, + 15448, + 15449, + 15450, + 15451, + 15452, + 15453, + 15454, + 15455, + 15456, + 15457, + 15458, + 15459, + 15460, + 15461, + 15462, + 15463, + 15464, + 15465, + 15466, + 15467, + 15468, + 15469, + 15470, + 15471, + 15472, + 15473, + 15474, + 15475, + 15476, + 15477, + 15478, + 15479, + 15480, + 15481, + 15482, + 15483, + 15484, + 15485, + 15486, + 15487, + 15488, + 15489, + 15490, + 15491, + 15492, + 15493, + 15494, + 15495, + 15496, + 15497, + 15498, + 15499, + 15500, + 15501, + 15502, + 15503, + 15504, + 15505, + 15506, + 15507, + 15508, + 15509, + 15510, + 15511, + 15512, + 15513, + 15514, + 15515, + 15516, + 15517, + 15518, + 15519, + 15520, + 15521, + 15522, + 15523, + 15524, + 15525, + 15526, + 15527, + 15528, + 15529, + 15530, + 15531, + 15532, + 15533, + 15534, + 15535, + 15536, + 15537, + 15538, + 15539, + 15540, + 15541, + 15542, + 15543, + 15544, + 15545, + 15546, + 15547, + 15548, + 15549, + 15550, + 15551, + 15552, + 15553, + 15554, + 15555, + 15556, + 15557, + 15558, + 15559, + 15560, + 15561, + 15562, + 15563, + 15564, + 15565, + 15566, + 15567, + 15568, + 15569, + 15570, + 15571, + 15572, + 15573, + 15574, + 15575, + 15576, + 15577, + 15578, + 15580, + 15581, + 15582, + 15583, + 15584, + 15585, + 15586, + 15587, + 15588, + 15589, + 15590, + 15591, + 15592, + 15593, + 15594, + 15595, + 15596, + 15597, + 15598, + 15599, + 15600, + 15601, + 15602, + 15603, + 15604, + 15606, + 15607, + 15608, + 15609, + 15610, + 15611, + 15612, + 15613, + 15614, + 15615, + 15616, + 15617, + 15618, + 15619, + 15620, + 15621, + 15622, + 15623, + 15624, + 15626, + 15627, + 15628, + 15629, + 15630, + 15631, + 15632, + 15633, + 15634, + 15635, + 15636, + 15637, + 15638, + 15639, + 15640, + 15641, + 15642, + 15643, + 15644, + 15645, + 15646, + 15647, + 15648, + 15649, + 15650, + 15651, + 15652, + 15653, + 15654, + 15655, + 15656, + 15657, + 15658, + 15659, + 15660, + 15661, + 15662, + 15663, + 15664, + 15665, + 15666, + 15667, + 15668, + 15669, + 15670, + 15671, + 15672, + 15673, + 15674, + 15675, + 15676, + 15677, + 15678, + 15679, + 15680, + 15681, + 15682, + 15683, + 15684, + 15685, + 15686, + 15687, + 15688, + 15689, + 15690, + 15691, + 15692, + 15693, + 15694, + 15695, + 15696, + 15697, + 15698, + 15699, + 15700, + 15701, + 15702, + 15703, + 15704, + 15705, + 15706, + 15707, + 15708, + 15709, + 15710, + 15711, + 15712, + 15713, + 15714, + 15716, + 15717, + 15718, + 15719, + 15720, + 15721, + 15722, + 15723, + 15724, + 15725, + 15726, + 15727, + 15728, + 15729, + 15730, + 15731, + 15732, + 15733, + 15734, + 15735, + 15736, + 15737, + 15738, + 15739, + 15740, + 15741, + 15742, + 15743, + 15744, + 15745, + 15746, + 15747, + 15748, + 15749, + 15750, + 15751, + 15752, + 15753, + 15754, + 15755, + 15756, + 15757, + 15758, + 15759, + 15760, + 15761, + 15762, + 15763, + 15764, + 15765, + 15766, + 15767, + 15768, + 15769, + 15770, + 15771, + 15772, + 15773, + 15774, + 15775, + 15776, + 15777, + 15778, + 15779, + 15780, + 15781, + 15782, + 15783, + 15784, + 15785, + 15786, + 15787, + 15788, + 15789, + 15790, + 15791, + 15792, + 15793, + 15794, + 15795, + 15796, + 15797, + 15798, + 15799, + 15800, + 15801, + 15802, + 15803, + 15804, + 15805, + 15806, + 15807, + 15808, + 15809, + 15810, + 15811, + 15812, + 15813, + 15814, + 15815, + 15816, + 15817, + 15818, + 15819, + 15820, + 15821, + 15822, + 15823, + 15824, + 15825, + 15826, + 15827, + 15828, + 15829, + 15830, + 15831, + 15832, + 15833, + 15834, + 15835, + 15836, + 15837, + 15838, + 15839, + 15840, + 15841, + 15842, + 15843, + 15844, + 15845, + 15846, + 15847, + 15848, + 15849, + 15850, + 15851, + 15852, + 15853, + 15854, + 15855, + 15856, + 15857, + 15858, + 15859, + 15860, + 15861, + 15862, + 15863, + 15864, + 15865, + 15866, + 15867, + 15868, + 15869, + 15870, + 15871, + 15872, + 15873, + 15874, + 15875, + 15876, + 15877, + 15878, + 15879, + 15880, + 15881, + 15882, + 15883, + 15884, + 15885, + 15886, + 15887, + 15889, + 15890, + 15891, + 15892, + 15893, + 15895, + 15896, + 15897, + 15898, + 15899, + 15900, + 15901, + 15902, + 15903, + 15904, + 15905, + 15906, + 15907, + 15908, + 15909, + 15910, + 15911, + 15912, + 15913, + 15914, + 15915, + 15916, + 15917, + 15918, + 15919, + 15920, + 15921, + 15922, + 15923, + 15924, + 15926, + 15927, + 15928, + 15929, + 15930, + 15931, + 15932, + 15933, + 15934, + 15935, + 15936, + 15937, + 15938, + 15939, + 15940, + 15941, + 15942, + 15943, + 15944, + 15945, + 15946, + 15947, + 15948, + 15949, + 15950, + 15951, + 15952, + 15953, + 15954, + 15955, + 15956, + 15957, + 15958, + 15959, + 15960, + 15961, + 15962, + 15963, + 15964, + 15965, + 15966, + 15967, + 15968, + 15969, + 15970, + 15971, + 15972, + 15973, + 15974, + 15975, + 15976, + 15977, + 15978, + 15979, + 15980, + 15981, + 15982, + 15983, + 15984, + 15985, + 15986, + 15987, + 15988, + 15989, + 15990, + 15991, + 15992, + 15993, + 15994, + 15995, + 15996, + 15997, + 15998, + 15999, + 16000, + 16001, + 16002, + 16003, + 16004, + 16005, + 16006, + 16007, + 16008, + 16009, + 16010, + 16011, + 16012, + 16014, + 16015, + 16016, + 16017, + 16018, + 16019, + 16020, + 16021, + 16022, + 16023, + 16024, + 16025, + 16026, + 16027, + 16028, + 16029, + 16030, + 16031, + 16032, + 16033, + 16034, + 16035, + 16036, + 16037, + 16038, + 16039, + 16040, + 16041, + 16042, + 16043, + 16044, + 16045, + 16046, + 16047, + 16048, + 16049, + 16050, + 16051, + 16052, + 16053, + 16054, + 16055, + 16056, + 16057, + 16058, + 16059, + 16060, + 16061, + 16062, + 16063, + 16064, + 16065, + 16066, + 16067, + 16068, + 16069, + 16070, + 16071, + 16072, + 16073, + 16074, + 16075, + 16076, + 16077, + 16078, + 16079, + 16080, + 16081, + 16082, + 16083, + 16084, + 16085, + 16086, + 16087, + 16088, + 16089, + 16090, + 16091, + 16092, + 16093, + 16094, + 16095, + 16096, + 16097, + 16098, + 16099, + 16100, + 16101, + 16102, + 16103, + 16104, + 16105, + 16106, + 16107, + 16108, + 16110, + 16111, + 16112, + 16113, + 16114, + 16115, + 16116, + 16117, + 16118, + 16119, + 16120, + 16121, + 16122, + 16123, + 16124, + 16125, + 16126, + 16127, + 16128, + 16129, + 16130, + 16131, + 16132, + 16133, + 16134, + 16135, + 16136, + 16137, + 16138, + 16139, + 16140, + 16141, + 16142, + 16143, + 16144, + 16145, + 16146, + 16147, + 16148, + 16149, + 16150, + 16151, + 16152, + 16153, + 16154, + 16155, + 16156, + 16157, + 16158, + 16159, + 16160, + 16161, + 16162, + 16163, + 16164, + 16165, + 16167, + 16168, + 16169, + 16170, + 16171, + 16172, + 16173, + 16174, + 16175, + 16176, + 16177, + 16178, + 16179, + 16180, + 16181, + 16182, + 16183, + 16184, + 16185, + 16186, + 16187, + 16188, + 16189, + 16190, + 16191, + 16192, + 16193, + 16194, + 16195, + 16196, + 16197, + 16198, + 16199, + 16200, + 16201, + 16202, + 16203, + 16204, + 16205, + 16206, + 16207, + 16208, + 16209, + 16210, + 16211, + 16212, + 16213, + 16214, + 16215, + 16216, + 16217, + 16218, + 16219, + 16220, + 16221, + 16222, + 16223, + 16224, + 16225, + 16226, + 16227, + 16228, + 16229, + 16230, + 16231, + 16232, + 16233, + 16234, + 16235, + 16236, + 16237, + 16238, + 16239, + 16240, + 16241, + 16242, + 16243, + 16244, + 16245, + 16246, + 16247, + 16248, + 16249, + 16250, + 16251, + 16252, + 16253, + 16254, + 16255, + 16256, + 16257, + 16258, + 16259, + 16260, + 16261, + 16262, + 16263, + 16264, + 16265, + 16266, + 16267, + 16268, + 16269, + 16270, + 16271, + 16272, + 16273, + 16274, + 16275, + 16276, + 16277, + 16278, + 16279, + 16280, + 16281, + 16282, + 16283, + 16285, + 16286, + 16287, + 16288, + 16289, + 16290, + 16291, + 16292, + 16293, + 16294, + 16295, + 16296, + 16297, + 16298, + 16299, + 16300, + 16301, + 16302, + 16303, + 16304, + 16305, + 16306, + 16307, + 16308, + 16309, + 16310, + 16311, + 16312, + 16313, + 16314, + 16315, + 16316, + 16317, + 16318, + 16319, + 16320, + 16321, + 16322, + 16323, + 16324, + 16325, + 16326, + 16327, + 16328, + 16329, + 16330, + 16331, + 16332, + 16333, + 16334, + 16335, + 16336, + 16337, + 16338, + 16339, + 16340, + 16341, + 16342, + 16343, + 16344, + 16345, + 16346, + 16347, + 16348, + 16349, + 16350, + 16351, + 16352, + 16353, + 16354, + 16355, + 16356, + 16357, + 16358, + 16359, + 16360, + 16361, + 16362, + 16363, + 16364, + 16365, + 16366, + 16367, + 16368, + 16369, + 16370, + 16371, + 16372, + 16373, + 16374, + 16375, + 16376, + 16377, + 16378, + 16379, + 16380, + 16381, + 16382, + 16383, + 16384, + 16385, + 16386, + 16387, + 16388, + 16389, + 16390, + 16391, + 16392, + 16393, + 16394, + 16395, + 16396, + 16397, + 16398, + 16399, + 16400, + 16401, + 16402, + 16403, + 16404, + 16405, + 16406, + 16407, + 16408, + 16409, + 16410, + 16411, + 16412, + 16413, + 16414, + 16415, + 16416, + 16417, + 16418, + 16419, + 16420, + 16421, + 16422, + 16423, + 16424, + 16425, + 16426, + 16427, + 16428, + 16429, + 16430, + 16431, + 16432, + 16434, + 16435, + 16436, + 16437, + 16438, + 16439, + 16440, + 16441, + 16442, + 16443, + 16445, + 16446, + 16447, + 16448, + 16449, + 16450, + 16451, + 16452, + 16453, + 16454, + 16455, + 16456, + 16457, + 16458, + 16459, + 16460, + 16461, + 16462, + 16463, + 16464, + 16465, + 16466, + 16467, + 16468, + 16469, + 16470, + 16471, + 16472, + 16473, + 16474, + 16475, + 16476, + 16477, + 16478, + 16479, + 16480, + 16481, + 16482, + 16483, + 16484, + 16485, + 16486, + 16487, + 16488, + 16489, + 16490, + 16491, + 16492, + 16493, + 16494, + 16495, + 16496, + 16497, + 16498, + 16499, + 16500, + 16501, + 16502, + 16503, + 16504, + 16505, + 16506, + 16507, + 16508, + 16509, + 16510, + 16511, + 16512, + 16513, + 16514, + 16515, + 16516, + 16517, + 16518, + 16519, + 16520, + 16521, + 16522, + 16523, + 16524, + 16525, + 16526, + 16527, + 16528, + 16529, + 16530, + 16532, + 16533, + 16534, + 16535, + 16536, + 16537, + 16538, + 16539, + 16540, + 16541, + 16542, + 16543, + 16544, + 16545, + 16546, + 16547, + 16548, + 16549, + 16550, + 16551, + 16552, + 16553, + 16555, + 16556, + 16557, + 16558, + 16559, + 16560, + 16561, + 16562, + 16563, + 16564, + 16565, + 16566, + 16567, + 16568, + 16569, + 16570, + 16571, + 16572, + 16573, + 16574, + 16575, + 16576, + 16577, + 16578, + 16579, + 16580, + 16581, + 16582, + 16583, + 16584, + 16586, + 16587, + 16588, + 16589, + 16590, + 16591, + 16592, + 16593, + 16594, + 16595, + 16596, + 16597, + 16598, + 16599, + 16600, + 16601, + 16602, + 16603, + 16604, + 16605, + 16606, + 16607, + 16608, + 16609, + 16610, + 16611, + 16612, + 16613, + 16614, + 16615, + 16616, + 16617, + 16618, + 16619, + 16620, + 16621, + 16622, + 16623, + 16624, + 16625, + 16626, + 16627, + 16628, + 16629, + 16630, + 16631, + 16632, + 16633, + 16634, + 16635, + 16636, + 16637, + 16638, + 16639, + 16640, + 16641, + 16642, + 16643, + 16644, + 16645, + 16646, + 16647, + 16648, + 16649, + 16650, + 16651, + 16652, + 16653, + 16654, + 16655, + 16656, + 16657, + 16658, + 16659, + 16660, + 16661, + 16662, + 16663, + 16665, + 16666, + 16667, + 16668, + 16669, + 16670, + 16671, + 16672, + 16673, + 16674, + 16675, + 16676, + 16677, + 16678, + 16679, + 16680, + 16681, + 16682, + 16683, + 16684, + 16685, + 16686, + 16687, + 16688, + 16689, + 16690, + 16691, + 16692, + 16693, + 16694, + 16695, + 16696, + 16697, + 16698, + 16699, + 16700, + 16701, + 16702, + 16703, + 16704, + 16705, + 16706, + 16708, + 16709, + 16710, + 16711, + 16712, + 16713, + 16714, + 16715, + 16716, + 16717, + 16718, + 16719, + 16720, + 16721, + 16722, + 16723, + 16724, + 16725, + 16726, + 16727, + 16728, + 16729, + 16730, + 16731, + 16732, + 16733, + 16734, + 16735, + 16736, + 16737, + 16738, + 16739, + 16740, + 16741, + 16742, + 16743, + 16744, + 16745, + 16746, + 16747, + 16748, + 16749, + 16750, + 16751, + 16752, + 16753, + 16754, + 16755, + 16756, + 16757, + 16758, + 16759, + 16761, + 16762, + 16763, + 16764, + 16765, + 16766, + 16767, + 16768, + 16769, + 16770, + 16771, + 16772, + 16773, + 16774, + 16775, + 16776, + 16777, + 16778, + 16779, + 16780, + 16781, + 16782, + 16783, + 16784, + 16785, + 16786, + 16787, + 16788, + 16789, + 16790, + 16792, + 16793, + 16794, + 16795, + 16796, + 16797, + 16798, + 16799, + 16800, + 16801, + 16802, + 16803, + 16804, + 16805, + 16806, + 16807, + 16808, + 16809, + 16810, + 16811, + 16812, + 16813, + 16814, + 16815, + 16816, + 16817, + 16818, + 16819, + 16820, + 16821, + 16822, + 16824, + 16825, + 16826, + 16827, + 16828, + 16829, + 16830, + 16831, + 16832, + 16833, + 16834, + 16835, + 16836, + 16837, + 16838, + 16839, + 16840, + 16841, + 16842, + 16843, + 16844, + 16845, + 16846, + 16847, + 16848, + 16849, + 16850, + 16851, + 16852, + 16853, + 16854, + 16856, + 16857, + 16858, + 16859, + 16860, + 16861, + 16862, + 16863, + 16864, + 16865, + 16866, + 16867, + 16868, + 16869, + 16870, + 16871, + 16872, + 16873, + 16874, + 16875, + 16876, + 16877, + 16878, + 16879, + 16880, + 16881, + 16882, + 16883, + 16884, + 16885, + 16886, + 16887, + 16888, + 16889, + 16890, + 16891, + 16892, + 16893, + 16894, + 16895, + 16896, + 16897, + 16898, + 16899, + 16900, + 16901, + 16902, + 16903, + 16904, + 16905, + 16906, + 16907, + 16908, + 16909, + 16910, + 16911, + 16912, + 16913, + 16914, + 16915, + 16916, + 16917, + 16918, + 16919, + 16920, + 16921, + 16922, + 16923, + 16925, + 16926, + 16927, + 16928, + 16929, + 16930, + 16931, + 16932, + 16933, + 16934, + 16935, + 16936, + 16937, + 16938, + 16939, + 16940, + 16941, + 16942, + 16943, + 16944, + 16945, + 16946, + 16947, + 16948, + 16949, + 16950, + 16951, + 16952, + 16953, + 16954, + 16955, + 16956, + 16957, + 16958, + 16959, + 16960, + 16961, + 16962, + 16963, + 16964, + 16965, + 16966, + 16967, + 16968, + 16969, + 16970, + 16971, + 16972, + 16973, + 16974, + 16975, + 16976, + 16977, + 16978, + 16979, + 16980, + 16981, + 16982, + 16983, + 16984, + 16985, + 16986, + 16987, + 16988, + 16989, + 16990, + 16991, + 16992, + 16994, + 16995, + 16996, + 16997, + 16998, + 16999, + 17000, + 17001, + 17002, + 17003, + 17004, + 17005, + 17006, + 17007, + 17008, + 17010, + 17011, + 17012, + 17013, + 17014, + 17015, + 17016, + 17017, + 17018, + 17019, + 17020, + 17021, + 17022, + 17023, + 17024, + 17025, + 17026, + 17027, + 17028, + 17029, + 17031, + 17032, + 17033, + 17034, + 17035, + 17036, + 17037, + 17038, + 17039, + 17040, + 17041, + 17042, + 17043, + 17044, + 17045, + 17046, + 17047, + 17048, + 17049, + 17050, + 17051, + 17052, + 17053, + 17054, + 17055, + 17056, + 17057, + 17058, + 17060, + 17061, + 17062, + 17063, + 17064, + 17065, + 17066, + 17067, + 17068, + 17069, + 17070, + 17071, + 17072, + 17073, + 17074, + 17075, + 17076, + 17077, + 17078, + 17079, + 17080, + 17081, + 17082, + 17083, + 17084, + 17085, + 17086, + 17087, + 17088, + 17089, + 17090, + 17091, + 17092, + 17093, + 17094, + 17095, + 17096, + 17097, + 17098, + 17099, + 17100, + 17101, + 17102, + 17103, + 17104, + 17105, + 17106, + 17107, + 17108, + 17109, + 17110, + 17111, + 17112, + 17113, + 17114, + 17115, + 17117, + 17118, + 17119, + 17120, + 17121, + 17122, + 17123, + 17124, + 17125, + 17126, + 17127, + 17128, + 17129, + 17130, + 17132, + 17133, + 17134, + 17135, + 17136, + 17137, + 17138, + 17139, + 17140, + 17142, + 17143, + 17144, + 17145, + 17146, + 17147, + 17148, + 17149, + 17150, + 17151, + 17152, + 17153, + 17154, + 17155, + 17156, + 17157, + 17158, + 17159, + 17160, + 17161, + 17162, + 17163, + 17164, + 17165, + 17166, + 17167, + 17168, + 17169, + 17170, + 17171, + 17172, + 17173, + 17174, + 17175, + 17176, + 17177, + 17178, + 17179, + 17180, + 17181, + 17182, + 17183, + 17184, + 17185, + 17186, + 17187, + 17188, + 17189, + 17190, + 17191, + 17192, + 17193, + 17194, + 17195, + 17196, + 17197, + 17198, + 17199, + 17200, + 17201, + 17202, + 17203, + 17204, + 17205, + 17206, + 17207, + 17208, + 17209, + 17210, + 17211, + 17212, + 17213, + 17214, + 17215, + 17216, + 17217, + 17218, + 17219, + 17220, + 17221, + 17222, + 17223, + 17224, + 17225, + 17226, + 17227, + 17228, + 17229, + 17230, + 17231, + 17232, + 17233, + 17235, + 17236, + 17237, + 17238, + 17240, + 17241, + 17242, + 17243, + 17244, + 17245, + 17247, + 17248, + 17249, + 17250, + 17251, + 17253, + 17254, + 17255, + 17256, + 17257, + 17258, + 17259, + 17260, + 17261, + 17262, + 17263, + 17264, + 17265, + 17266, + 17267, + 17268, + 17269, + 17270, + 17271, + 17272, + 17273, + 17274, + 17275, + 17276, + 17277, + 17278, + 17279, + 17280, + 17281, + 17282, + 17283, + 17284, + 17285, + 17286, + 17287, + 17288, + 17289, + 17290, + 17291, + 17292, + 17293, + 17294, + 17295, + 17296, + 17297, + 17298, + 17299, + 17300, + 17301, + 17302, + 17303, + 17304, + 17305, + 17306, + 17307, + 17308, + 17309, + 17310, + 17311, + 17312, + 17313, + 17314, + 17315, + 17316, + 17317, + 17318, + 17319, + 17320, + 17321, + 17322, + 17323, + 17324, + 17325, + 17326, + 17327, + 17328, + 17329, + 17330, + 17331, + 17332, + 17333, + 17334, + 17335, + 17336, + 17337, + 17338, + 17339, + 17340, + 17341, + 17342, + 17343, + 17344, + 17345, + 17346, + 17347, + 17348, + 17349, + 17350, + 17351, + 17352, + 17353, + 17354, + 17355, + 17356, + 17357, + 17358, + 17359, + 17360, + 17361, + 17362, + 17363, + 17364, + 17365, + 17366, + 17367, + 17368, + 17369, + 17370, + 17371, + 17372, + 17373, + 17374, + 17375, + 17376, + 17377, + 17378, + 17379, + 17380, + 17381, + 17382, + 17383, + 17384, + 17385, + 17386, + 17387, + 17388, + 17389, + 17390, + 17391, + 17392, + 17393, + 17394, + 17395, + 17396, + 17397, + 17398, + 17399, + 17400, + 17401, + 17402, + 17403, + 17404, + 17405, + 17406, + 17407, + 17408, + 17409, + 17410, + 17411, + 17412, + 17413, + 17414, + 17415, + 17416, + 17417, + 17418, + 17419, + 17420, + 17421, + 17422, + 17423, + 17424, + 17425, + 17426, + 17427, + 17428, + 17429, + 17430, + 17431, + 17432, + 17433, + 17434, + 17435, + 17437, + 17438, + 17439, + 17440, + 17441, + 17442, + 17443, + 17444, + 17445, + 17446, + 17447, + 17448, + 17449, + 17451, + 17452, + 17453, + 17454, + 17455, + 17456, + 17458, + 17459, + 17460, + 17461, + 17462, + 17463, + 17464, + 17465, + 17466, + 17467, + 17468, + 17469, + 17470, + 17471, + 17472, + 17473, + 17474, + 17475, + 17476, + 17477, + 17478, + 17479, + 17480, + 17481, + 17482, + 17483, + 17484, + 17485, + 17486, + 17487, + 17488, + 17489, + 17491, + 17492, + 17493, + 17494, + 17495, + 17496, + 17497, + 17498, + 17499, + 17500, + 17501, + 17502, + 17503, + 17504, + 17505, + 17506, + 17507, + 17508, + 17509, + 17510, + 17513, + 17514, + 17515, + 17516, + 17517, + 17518, + 17519, + 17520, + 17521, + 17522, + 17523, + 17524, + 17525, + 17526, + 17527, + 17528, + 17529, + 17530, + 17531, + 17532, + 17533, + 17534, + 17536, + 17537, + 17538, + 17539, + 17540, + 17541, + 17542, + 17543, + 17544, + 17545, + 17546, + 17547, + 17548, + 17549, + 17550, + 17551, + 17552, + 17553, + 17554, + 17555, + 17556, + 17557, + 17558, + 17559, + 17560, + 17561, + 17562, + 17563, + 17564, + 17565, + 17566, + 17568, + 17569, + 17570, + 17571, + 17572, + 17573, + 17574, + 17575, + 17576, + 17577, + 17578, + 17579, + 17580, + 17581, + 17582, + 17583, + 17584, + 17585, + 17586, + 17587, + 17588, + 17589, + 17590, + 17592, + 17593, + 17594, + 17595, + 17596, + 17597, + 17598, + 17599, + 17600, + 17602, + 17603, + 17604, + 17605, + 17606, + 17607, + 17608, + 17609, + 17610, + 17611, + 17612, + 17614, + 17615, + 17617, + 17618, + 17620, + 17621, + 17622, + 17623, + 17624, + 17625, + 17626, + 17627, + 17628, + 17629, + 17630, + 17631, + 17632, + 17633, + 17634, + 17635, + 17636, + 17637, + 17638, + 17639, + 17640, + 17641, + 17642, + 17643, + 17644, + 17645, + 17646, + 17647, + 17648, + 17649, + 17650, + 17651, + 17652, + 17653, + 17654, + 17655, + 17656, + 17657, + 17658, + 17659, + 17660, + 17661, + 17662, + 17663, + 17664, + 17665, + 17666, + 17667, + 17668, + 17669, + 17670, + 17671, + 17672, + 17673, + 17674, + 17675, + 17676, + 17677, + 17678, + 17679, + 17680, + 17681, + 17682, + 17683, + 17684, + 17685, + 17686, + 17687, + 17688, + 17689, + 17690, + 17691, + 17692, + 17693, + 17694, + 17695, + 17696, + 17697, + 17698, + 17699, + 17700, + 17701, + 17702, + 17703, + 17704, + 17705, + 17706, + 17707, + 17708, + 17709, + 17710, + 17712, + 17713, + 17714, + 17715, + 17716, + 17717, + 17718, + 17719, + 17720, + 17721, + 17722, + 17723, + 17724, + 17725, + 17726, + 17727, + 17728, + 17729, + 17730, + 17731, + 17732, + 17733, + 17734, + 17735, + 17736, + 17737, + 17738, + 17739, + 17740, + 17741, + 17742, + 17743, + 17744, + 17745, + 17746, + 17747, + 17748, + 17749, + 17750, + 17751, + 17752, + 17753, + 17754, + 17755, + 17756, + 17757, + 17758, + 17759, + 17760, + 17761, + 17762, + 17763, + 17764, + 17765, + 17766, + 17767, + 17768, + 17769, + 17770, + 17771, + 17772, + 17773, + 17774, + 17775, + 17776, + 17777, + 17778, + 17779, + 17780, + 17781, + 17782, + 17783, + 17784, + 17785, + 17786, + 17787, + 17788, + 17789, + 17790, + 17791, + 17792, + 17793, + 17794, + 17795, + 17796, + 17797, + 17798, + 17799, + 17800, + 17801, + 17802, + 17803, + 17804, + 17805, + 17806, + 17807, + 17808, + 17809, + 17810, + 17811, + 17812, + 17813, + 17814, + 17815, + 17816, + 17817, + 17818, + 17819, + 17820, + 17821, + 17822, + 17823, + 17824, + 17825, + 17826, + 17827, + 17828, + 17829, + 17830, + 17831, + 17832, + 17833, + 17834, + 17835, + 17836, + 17837, + 17838, + 17839, + 17840, + 17841, + 17842, + 17843, + 17844, + 17845, + 17846, + 17847, + 17848, + 17849, + 17850, + 17851, + 17852, + 17853, + 17854, + 17855, + 17856, + 17857, + 17858, + 17859, + 17860, + 17861, + 17862, + 17863, + 17864, + 17865, + 17866, + 17867, + 17868, + 17869, + 17870, + 17871, + 17872, + 17873, + 17874, + 17875, + 17876, + 17877, + 17878, + 17879, + 17880, + 17881, + 17882, + 17883, + 17884, + 17885, + 17886, + 17887, + 17888, + 17889, + 17890, + 17891, + 17892, + 17893, + 17894, + 17895, + 17896, + 17897, + 17898, + 17899, + 17900, + 17901, + 17902, + 17903, + 17904, + 17905, + 17906, + 17907, + 17908, + 17909, + 17910, + 17911, + 17912, + 17913, + 17914, + 17915, + 17916, + 17917, + 17918, + 17919, + 17920, + 17921, + 17922, + 17923, + 17924, + 17925, + 17926, + 17927, + 17928, + 17929, + 17930, + 17931, + 17932, + 17933, + 17934, + 17935, + 17936, + 17937, + 17938, + 17939, + 17940, + 17941, + 17942, + 17943, + 17944, + 17945, + 17946, + 17947, + 17948, + 17949, + 17950, + 17951, + 17952, + 17953, + 17954, + 17955, + 17956, + 17957, + 17958, + 17959, + 17960, + 17961, + 17962, + 17963, + 17964, + 17965, + 17966, + 17967, + 17968, + 17969, + 17971, + 17972, + 17973, + 17974, + 17975, + 17976, + 17977, + 17978, + 17979, + 17980, + 17981, + 17982, + 17983, + 17984, + 17985, + 17986, + 17987, + 17988, + 17989, + 17990, + 17991, + 17992, + 17993, + 17994, + 17995, + 17996, + 17997, + 17998, + 17999, + 18000, + 18001, + 18003, + 18004, + 18005, + 18006, + 18007, + 18008, + 18009, + 18010, + 18011, + 18012, + 18013, + 18014, + 18015, + 18016, + 18017, + 18018, + 18019, + 18020, + 18021, + 18022, + 18023, + 18024, + 18025, + 18026, + 18027, + 18028, + 18029, + 18030, + 18034, + 18035, + 18036, + 18037, + 18039, + 18040, + 18041, + 18042, + 18043, + 18044, + 18045, + 18046, + 18048, + 18049, + 18050, + 18051, + 18052, + 18053, + 18054, + 18055, + 18056, + 18057, + 18058, + 18059, + 18060, + 18061, + 18062, + 18063, + 18064, + 18065, + 18066, + 18067, + 18068, + 18069, + 18070, + 18071, + 18072, + 18073, + 18074, + 18075, + 18076, + 18077, + 18079, + 18080, + 18081, + 18082, + 18083, + 18084, + 18085, + 18086, + 18087, + 18088, + 18089, + 18090, + 18091, + 18092, + 18093, + 18094, + 18095, + 18096, + 18097, + 18098, + 18099, + 18100, + 18101, + 18102, + 18103, + 18104, + 18105, + 18106, + 18107, + 18108, + 18109, + 18111, + 18112, + 18113, + 18114, + 18115, + 18116, + 18117, + 18118, + 18119, + 18120, + 18121, + 18122, + 18123, + 18124, + 18125, + 18126, + 18127, + 18128, + 18129, + 18130, + 18131, + 18132, + 18133, + 18134, + 18135, + 18136, + 18137, + 18138, + 18139, + 18140, + 18141, + 18142, + 18143, + 18144, + 18145, + 18146, + 18147, + 18148, + 18149, + 18150, + 18151, + 18152, + 18153, + 18154, + 18155, + 18156, + 18157, + 18158, + 18159, + 18160, + 18161, + 18162, + 18163, + 18164, + 18165, + 18166, + 18167, + 18168, + 18169, + 18170, + 18171, + 18172, + 18173, + 18174, + 18175, + 18176, + 18177, + 18178, + 18179, + 18180, + 18181, + 18182, + 18183, + 18184, + 18185, + 18186, + 18187, + 18188, + 18189, + 18190, + 18191, + 18192, + 18193, + 18194, + 18195, + 18196, + 18197, + 18198, + 18199, + 18200, + 18201, + 18202, + 18203, + 18204, + 18205, + 18206, + 18207, + 18208, + 18209, + 18210, + 18211, + 18212, + 18213, + 18214, + 18215, + 18216, + 18217, + 18218, + 18219, + 18220, + 18221, + 18222, + 18223, + 18224, + 18225, + 18226, + 18227, + 18228, + 18229, + 18230, + 18231, + 18232, + 18233, + 18234, + 18235, + 18236, + 18237, + 18238, + 18239, + 18240, + 18241, + 18242, + 18243, + 18244, + 18245, + 18246, + 18247, + 18248, + 18249, + 18251, + 18252, + 18253, + 18254, + 18255, + 18256, + 18257, + 18258, + 18259, + 18260, + 18261, + 18262, + 18263, + 18264, + 18265, + 18266, + 18267, + 18268, + 18269, + 18270, + 18271, + 18272, + 18273, + 18274, + 18275, + 18276, + 18277, + 18278, + 18279, + 18280, + 18282, + 18283, + 18284, + 18285, + 18286, + 18287, + 18288, + 18289, + 18290, + 18291, + 18292, + 18293, + 18294, + 18295, + 18296, + 18297, + 18298, + 18299, + 18300, + 18301, + 18302, + 18303, + 18304, + 18305, + 18306, + 18307, + 18308, + 18309, + 18310, + 18311, + 18312, + 18313, + 18314, + 18316, + 18317, + 18318, + 18319, + 18320, + 18321, + 18322, + 18323, + 18324, + 18325, + 18326, + 18327, + 18328, + 18329, + 18330, + 18331, + 18332, + 18333, + 18334, + 18335, + 18336, + 18337, + 18338, + 18339, + 18340, + 18341, + 18342, + 18343, + 18344, + 18345, + 18346, + 18347, + 18348, + 18349, + 18350, + 18351, + 18352, + 18353, + 18354, + 18355, + 18356, + 18357, + 18358, + 18359, + 18360, + 18361, + 18362, + 18363, + 18364, + 18365, + 18366, + 18367, + 18368, + 18369, + 18370, + 18371, + 18372, + 18373, + 18374, + 18375, + 18376, + 18377, + 18378, + 18379, + 18380, + 18381, + 18382, + 18383, + 18384, + 18385, + 18386, + 18387, + 18388, + 18389, + 18390, + 18391, + 18392, + 18393, + 18394, + 18395, + 18396, + 18397, + 18398, + 18399, + 18400, + 18401, + 18402, + 18403, + 18404, + 18405, + 18406, + 18407, + 18408, + 18409, + 18410, + 18411, + 18412, + 18413, + 18414, + 18415, + 18416, + 18417, + 18419, + 18420, + 18421, + 18422, + 18423, + 18424, + 18425, + 18426, + 18427, + 18428, + 18430, + 18431, + 18432, + 18433, + 18434, + 18435, + 18436, + 18437, + 18438, + 18439, + 18440, + 18441, + 18442, + 18443, + 18444, + 18445, + 18446, + 18447, + 18448, + 18449, + 18451, + 18452, + 18453, + 18454, + 18455, + 18456, + 18458, + 18459, + 18460, + 18461, + 18462, + 18463, + 18464, + 18465, + 18466, + 18467, + 18468, + 18469, + 18470, + 18471, + 18472, + 18473, + 18474, + 18475, + 18476, + 18477, + 18478, + 18479, + 18480, + 18481, + 18482, + 18483, + 18484, + 18485, + 18486, + 18487, + 18488, + 18489, + 18490, + 18491, + 18492, + 18493, + 18494, + 18495, + 18496, + 18497, + 18498, + 18499, + 18500, + 18501, + 18502, + 18503, + 18504, + 18505, + 18506, + 18507, + 18508, + 18509, + 18510, + 18511, + 18512, + 18513, + 18514, + 18515, + 18516, + 18517, + 18518, + 18519, + 18520, + 18521, + 18522, + 18523, + 18524, + 18525, + 18526, + 18527, + 18528, + 18529, + 18530, + 18531, + 18532, + 18533, + 18534, + 18535, + 18536, + 18537, + 18538, + 18539, + 18540, + 18541, + 18542, + 18543, + 18544, + 18545, + 18546, + 18547, + 18548, + 18549, + 18550, + 18551, + 18552, + 18553, + 18554, + 18555, + 18556, + 18557, + 18558, + 18559, + 18560, + 18561, + 18562, + 18563, + 18564, + 18566, + 18567, + 18568, + 18569, + 18570, + 18571, + 18572, + 18573, + 18574, + 18575, + 18576, + 18577, + 18578, + 18579, + 18580, + 18581, + 18582, + 18583, + 18584, + 18585, + 18586, + 18587, + 18588, + 18589, + 18590, + 18591, + 18592, + 18593, + 18594, + 18595, + 18596, + 18597, + 18598, + 18599, + 18600, + 18601, + 18602, + 18603, + 18604, + 18606, + 18607, + 18608, + 18609, + 18610, + 18611, + 18612, + 18613, + 18614, + 18615, + 18616, + 18617, + 18618, + 18619, + 18620, + 18621, + 18622, + 18623, + 18624, + 18625, + 18626, + 18627, + 18628, + 18629, + 18630, + 18631, + 18632, + 18633, + 18634, + 18635, + 18636, + 18637, + 18638, + 18639, + 18640, + 18641, + 18642, + 18643, + 18644, + 18645, + 18646, + 18647, + 18648, + 18649, + 18650, + 18651, + 18652, + 18653, + 18654, + 18655, + 18656, + 18657, + 18658, + 18659, + 18660, + 18661, + 18662, + 18663, + 18664, + 18666, + 18667, + 18668, + 18669, + 18670, + 18671, + 18672, + 18673, + 18674, + 18675, + 18676, + 18677, + 18678, + 18679, + 18680, + 18681, + 18682, + 18683, + 18684, + 18685, + 18686, + 18687, + 18688, + 18689, + 18690, + 18691, + 18692, + 18693, + 18694, + 18695, + 18696, + 18697, + 18698, + 18699, + 18700, + 18701, + 18702, + 18703, + 18704, + 18705, + 18706, + 18707, + 18708, + 18709, + 18710, + 18711, + 18712, + 18713, + 18714, + 18715, + 18716, + 18717, + 18718, + 18719, + 18720, + 18721, + 18722, + 18723, + 18724, + 18725, + 18726, + 18727, + 18728, + 18729, + 18730, + 18731, + 18732, + 18733, + 18734, + 18735, + 18736, + 18737, + 18738, + 18740, + 18741, + 18742, + 18743, + 18744, + 18745, + 18746, + 18747, + 18748, + 18749, + 18750, + 18751, + 18752, + 18753, + 18754, + 18755, + 18756, + 18757, + 18758, + 18759, + 18760, + 18761, + 18762, + 18763, + 18764, + 18765, + 18766, + 18767, + 18768, + 18769, + 18770, + 18771, + 18772, + 18773, + 18774, + 18775, + 18776, + 18777, + 18779, + 18781, + 18782, + 18783, + 18784, + 18785, + 18786, + 18787, + 18788, + 18789, + 18790, + 18791, + 18792, + 18793, + 18794, + 18795, + 18796, + 18797, + 18798, + 18799, + 18800, + 18801, + 18802, + 18803, + 18804, + 18805, + 18806, + 18807, + 18808, + 18809, + 18810, + 18811, + 18812, + 18813, + 18814, + 18815, + 18816, + 18817, + 18818, + 18819, + 18820, + 18821, + 18822, + 18823, + 18824, + 18825, + 18826, + 18827, + 18828, + 18829, + 18830, + 18831, + 18832, + 18833, + 18834, + 18835, + 18836, + 18837, + 18838, + 18839, + 18840, + 18841, + 18842, + 18843, + 18844, + 18845, + 18846, + 18847, + 18848, + 18849, + 18850, + 18851, + 18852, + 18853, + 18854, + 18855, + 18856, + 18857, + 18858, + 18859, + 18860, + 18861, + 18862, + 18863, + 18864, + 18865, + 18866, + 18867, + 18868, + 18869, + 18870, + 18871, + 18872, + 18873, + 18874, + 18875, + 18876, + 18878, + 18879, + 18880, + 18881, + 18882, + 18883, + 18884, + 18885, + 18886, + 18887, + 18888, + 18889, + 18890, + 18891, + 18892, + 18893, + 18894, + 18895, + 18896, + 18897, + 18898, + 18899, + 18900, + 18901, + 18902, + 18903, + 18904, + 18905, + 18906, + 18907, + 18908, + 18909, + 18910, + 18911, + 18912, + 18913, + 18914, + 18915, + 18916, + 18917, + 18918, + 18919, + 18920, + 18921, + 18922, + 18923, + 18924, + 18925, + 18926, + 18927, + 18928, + 18929, + 18930, + 18931, + 18932, + 18933, + 18934, + 18935, + 18936, + 18937, + 18938, + 18939, + 18940, + 18941, + 18942, + 18943, + 18944, + 18945, + 18946, + 18947, + 18949, + 18950, + 18951, + 18952, + 18953, + 18954, + 18955, + 18956, + 18957, + 18958, + 18959, + 18960, + 18961, + 18962, + 18963, + 18964, + 18965, + 18966, + 18967, + 18968, + 18969, + 18970, + 18971, + 18972, + 18973, + 18974, + 18975, + 18976, + 18977, + 18978, + 18979, + 18980, + 18981, + 18982, + 18983, + 18984, + 18985, + 18986, + 18987, + 18988, + 18989, + 18990, + 18991, + 18992, + 18993, + 18994, + 18995, + 18996, + 18997, + 18998, + 18999, + 19000, + 19001, + 19002, + 19003, + 19004, + 19005, + 19006, + 19007, + 19008, + 19009, + 19010, + 19011, + 19013, + 19014, + 19015, + 19016, + 19017, + 19018, + 19019, + 19020, + 19021, + 19022, + 19023, + 19024, + 19025, + 19026, + 19027, + 19028, + 19029, + 19030, + 19031, + 19032, + 19033, + 19034, + 19035, + 19036, + 19037, + 19038, + 19039, + 19040, + 19041, + 19042, + 19043, + 19044, + 19045, + 19046, + 19047, + 19048, + 19049, + 19050, + 19051, + 19052, + 19053, + 19054, + 19055, + 19056, + 19057, + 19058, + 19059, + 19060, + 19061, + 19062, + 19063, + 19064, + 19065, + 19066, + 19067, + 19068, + 19069, + 19070, + 19071, + 19072, + 19073, + 19074, + 19075, + 19076, + 19077, + 19078, + 19079, + 19080, + 19081, + 19082, + 19083, + 19084, + 19085, + 19086, + 19087, + 19088, + 19089, + 19090, + 19091, + 19092, + 19093, + 19094, + 19095, + 19096, + 19097, + 19098, + 19099, + 19100, + 19101, + 19102, + 19103, + 19104, + 19105, + 19106, + 19107, + 19108, + 19109, + 19110, + 19111, + 19112, + 19113, + 19114, + 19115, + 19116, + 19117, + 19118, + 19119, + 19120, + 19121, + 19122, + 19123, + 19124, + 19125, + 19127, + 19128, + 19129, + 19130, + 19131, + 19132, + 19133, + 19134, + 19135, + 19136, + 19137, + 19138, + 19139, + 19140, + 19141, + 19142, + 19143, + 19144, + 19145, + 19146, + 19147, + 19148, + 19149, + 19150, + 19151, + 19152, + 19153, + 19154, + 19155, + 19156, + 19157, + 19158, + 19159, + 19160, + 19161, + 19162, + 19163, + 19164, + 19165, + 19166, + 19167, + 19168, + 19169, + 19170, + 19171, + 19172, + 19173, + 19174, + 19175, + 19176, + 19177, + 19178, + 19179, + 19180, + 19181, + 19182, + 19183, + 19184, + 19185, + 19186, + 19187, + 19188, + 19189, + 19190, + 19191, + 19192, + 19193, + 19194, + 19195, + 19196, + 19197, + 19198, + 19199, + 19200, + 19201, + 19202, + 19203, + 19204, + 19205, + 19206, + 19207, + 19208, + 19209, + 19210, + 19211, + 19212, + 19213, + 19214, + 19215, + 19216, + 19217, + 19218, + 19219, + 19220, + 19221, + 19222, + 19223, + 19224, + 19225, + 19226, + 19227, + 19228, + 19230, + 19231, + 19232, + 19233, + 19234, + 19235, + 19236, + 19237, + 19238, + 19239, + 19240, + 19241, + 19242, + 19243, + 19244, + 19245, + 19246, + 19247, + 19248, + 19249, + 19250, + 19251, + 19252, + 19253, + 19254, + 19255, + 19256, + 19257, + 19258, + 19259, + 19260, + 19261, + 19262, + 19263, + 19264, + 19265, + 19266, + 19267, + 19268, + 19269, + 19270, + 19271, + 19272, + 19273, + 19274, + 19275, + 19276, + 19277, + 19278, + 19279, + 19280, + 19281, + 19282, + 19283, + 19284, + 19285, + 19286, + 19287, + 19288, + 19289, + 19290, + 19291, + 19292, + 19293, + 19294, + 19295, + 19296, + 19297, + 19299, + 19300, + 19301, + 19302, + 19303, + 19304, + 19305, + 19306, + 19307, + 19308, + 19309, + 19310, + 19311, + 19312, + 19313, + 19314, + 19315, + 19316, + 19317, + 19318, + 19319, + 19320, + 19321, + 19322, + 19323, + 19324, + 19325, + 19326, + 19327, + 19328, + 19329, + 19330, + 19331, + 19332, + 19333, + 19334, + 19335, + 19336, + 19337, + 19338, + 19339, + 19340, + 19341, + 19342, + 19343, + 19344, + 19345, + 19346, + 19347, + 19348, + 19349, + 19350, + 19351, + 19352, + 19353, + 19354, + 19355, + 19356, + 19357, + 19358, + 19359, + 19360, + 19361, + 19362, + 19363, + 19364, + 19366, + 19367, + 19368, + 19369, + 19370, + 19371, + 19372, + 19373, + 19374, + 19375, + 19376, + 19377, + 19378, + 19379, + 19380, + 19381, + 19382, + 19383, + 19384, + 19385, + 19386, + 19387, + 19388, + 19389, + 19390, + 19391, + 19392, + 19393, + 19394, + 19395, + 19396, + 19397, + 19399, + 19400, + 19401, + 19402, + 19403, + 19404, + 19405, + 19406, + 19407, + 19408, + 19409, + 19410, + 19411, + 19412, + 19413, + 19414, + 19415, + 19416, + 19417, + 19418, + 19419, + 19420, + 19421, + 19422, + 19423, + 19424, + 19425, + 19426, + 19427, + 19428, + 19429, + 19430, + 19431, + 19432, + 19433, + 19434, + 19435, + 19436, + 19437, + 19438, + 19439, + 19440, + 19441, + 19442, + 19443, + 19444, + 19445, + 19446, + 19447, + 19448, + 19449, + 19450, + 19451, + 19452, + 19453, + 19454, + 19455, + 19456, + 19457, + 19458, + 19459, + 19460, + 19461, + 19462, + 19463, + 19464, + 19465, + 19466, + 19467, + 19468, + 19469, + 19470, + 19471, + 19472, + 19473, + 19474, + 19475, + 19476, + 19477, + 19478, + 19479, + 19481, + 19482, + 19483, + 19484, + 19485, + 19486, + 19487, + 19488, + 19489, + 19490, + 19491, + 19492, + 19493, + 19494, + 19495, + 19496, + 19497, + 19498, + 19499, + 19500, + 19501, + 19502, + 19503, + 19504, + 19505, + 19506, + 19507, + 19508, + 19509, + 19510, + 19511, + 19512, + 19513, + 19514, + 19515, + 19516, + 19517, + 19518, + 19519, + 19520, + 19521, + 19522, + 19523, + 19524, + 19525, + 19526, + 19527, + 19528, + 19529, + 19530, + 19531, + 19532, + 19533, + 19535, + 19536, + 19537, + 19538, + 19539, + 19540, + 19541, + 19542, + 19543, + 19544, + 19545, + 19546, + 19547, + 19548, + 19549, + 19550, + 19551, + 19552, + 19553, + 19554, + 19555, + 19556, + 19557, + 19558, + 19559, + 19560, + 19561, + 19562, + 19563, + 19564, + 19565, + 19566, + 19567, + 19568, + 19569, + 19570, + 19571, + 19572, + 19573, + 19574, + 19575, + 19576, + 19577, + 19578, + 19580, + 19581, + 19582, + 19583, + 19584, + 19585, + 19586, + 19587, + 19588, + 19589, + 19590, + 19591, + 19592, + 19593, + 19594, + 19595, + 19596, + 19597, + 19598, + 19599, + 19600, + 19601, + 19602, + 19603, + 19604, + 19605, + 19606, + 19607, + 19608, + 19609, + 19610, + 19611, + 19612, + 19613, + 19614, + 19615, + 19616, + 19617, + 19618, + 19619, + 19620, + 19621, + 19622, + 19623, + 19624, + 19625, + 19626, + 19627, + 19628, + 19629, + 19630, + 19631, + 19632, + 19633, + 19634, + 19635, + 19636, + 19637, + 19638, + 19639, + 19640, + 19641, + 19642, + 19643, + 19644, + 19645, + 19646, + 19647, + 19648, + 19649, + 19650, + 19651, + 19652, + 19653, + 19654, + 19655, + 19656, + 19657, + 19658, + 19659, + 19660, + 19661, + 19662, + 19663, + 19664, + 19665, + 19666, + 19667, + 19668, + 19669, + 19670, + 19671, + 19672, + 19673, + 19674, + 19675, + 19676, + 19677, + 19678, + 19679, + 19680, + 19681, + 19682, + 19683, + 19684, + 19685, + 19686, + 19687, + 19688, + 19689, + 19690, + 19691, + 19692, + 19693, + 19694, + 19695, + 19696, + 19697, + 19698, + 19699, + 19700, + 19701, + 19702, + 19703, + 19704, + 19705, + 19706, + 19707, + 19708, + 19709, + 19710, + 19711, + 19712, + 19713, + 19714, + 19715, + 19716, + 19717, + 19718, + 19719, + 19720, + 19721, + 19722, + 19723, + 19724, + 19725, + 19726, + 19727, + 19728, + 19729, + 19730, + 19731, + 19732, + 19734, + 19735, + 19736, + 19737, + 19738, + 19739, + 19740, + 19741, + 19742, + 19743, + 19744, + 19745, + 19746, + 19747, + 19748, + 19749, + 19750, + 19752, + 19753, + 19754, + 19755, + 19756, + 19757, + 19758, + 19759, + 19760, + 19761, + 19762, + 19763, + 19764, + 19765, + 19766, + 19767, + 19768, + 19769, + 19770, + 19771, + 19772, + 19773, + 19774, + 19775, + 19776, + 19777, + 19778, + 19779, + 19780, + 19781, + 19782, + 19783, + 19784, + 19785, + 19786, + 19787, + 19788, + 19789, + 19790, + 19791, + 19792, + 19793, + 19794, + 19795, + 19796, + 19797, + 19798, + 19799, + 19800, + 19801, + 19802, + 19803, + 19804, + 19805, + 19806, + 19807, + 19808, + 19809, + 19810, + 19811, + 19812, + 19813, + 19814, + 19815, + 19816, + 19817, + 19818, + 19819, + 19820, + 19821, + 19822, + 19823, + 19824, + 19825, + 19826, + 19827, + 19828, + 19829, + 19830, + 19831, + 19832, + 19833, + 19834, + 19835, + 19836, + 19837, + 19838, + 19839, + 19840, + 19841, + 19842, + 19843, + 19844, + 19845, + 19846, + 19847, + 19848, + 19849, + 19850, + 19852, + 19853, + 19854, + 19855, + 19856, + 19857, + 19858, + 19859, + 19860, + 19861, + 19862, + 19863, + 19864, + 19865, + 19866, + 19867, + 19868, + 19869, + 19870, + 19871, + 19872, + 19873, + 19874, + 19875, + 19876, + 19877, + 19878, + 19879, + 19880, + 19881, + 19882, + 19883, + 19884, + 19885, + 19886, + 19887, + 19888, + 19889, + 19890, + 19891, + 19892, + 19893, + 19894, + 19895, + 19896, + 19897, + 19898, + 19899, + 19900, + 19901, + 19902, + 19903, + 19904, + 19905, + 19906, + 19907, + 19908, + 19909, + 19910, + 19911, + 19912, + 19913, + 19914, + 19915, + 19916, + 19917, + 19918, + 19919, + 19920, + 19921, + 19922, + 19923, + 19924, + 19925, + 19926, + 19927, + 19928, + 19929, + 19930, + 19931, + 19932, + 19933, + 19934, + 19935, + 19936, + 19937, + 19938, + 19939, + 19940, + 19941, + 19942, + 19943, + 19944, + 19945, + 19946, + 19947, + 19948, + 19949, + 19950, + 19951, + 19952, + 19953, + 19955, + 19956, + 19957, + 19958, + 19959, + 19960, + 19961, + 19962, + 19963, + 19964, + 19965, + 19966, + 19967, + 19968, + 19969, + 19970, + 19971, + 19972, + 19973, + 19974, + 19975, + 19976, + 19977, + 19978, + 19979, + 19980, + 19981, + 19982, + 19983, + 19984, + 19985, + 19986, + 19987, + 19988, + 19989, + 19990, + 19991, + 19992, + 19993, + 19994, + 19995, + 19996, + 19997, + 19998, + 19999, + 20000, + 20001, + 20002, + 20003, + 20004, + 20005, + 20006, + 20007, + 20008, + 20009, + 20010, + 20011, + 20012, + 20013, + 20014, + 20015, + 20016, + 20017, + 20018, + 20019, + 20020, + 20021, + 20022, + 20023, + 20024, + 20025, + 20026, + 20027, + 20028, + 20029, + 20030, + 20031, + 20032, + 20033, + 20034, + 20035, + 20036, + 20037, + 20038, + 20039, + 20040, + 20041, + 20042, + 20043, + 20044, + 20045, + 20046, + 20047, + 20048, + 20049, + 20050, + 20051, + 20052, + 20053, + 20054, + 20055, + 20056, + 20057, + 20058, + 20059, + 20060, + 20061, + 20062, + 20063, + 20064, + 20065, + 20066, + 20067, + 20068, + 20069, + 20070, + 20071, + 20072, + 20073, + 20074, + 20075, + 20076, + 20077, + 20078, + 20079, + 20080, + 20081, + 20082, + 20083, + 20084, + 20085, + 20086, + 20087, + 20088, + 20089, + 20090, + 20091, + 20092, + 20093, + 20094, + 20095, + 20096, + 20097, + 20099, + 20100, + 20101, + 20102, + 20103, + 20104, + 20105, + 20106, + 20107, + 20108, + 20109, + 20110, + 20111, + 20112, + 20113, + 20114, + 20115, + 20116, + 20117, + 20118, + 20119, + 20120, + 20121, + 20122, + 20123, + 20124, + 20125, + 20126, + 20127, + 20128, + 20129, + 20130, + 20132, + 20133, + 20134, + 20135, + 20136, + 20137, + 20138, + 20139, + 20140, + 20141, + 20142, + 20143, + 20144, + 20145, + 20146, + 20147, + 20148, + 20149, + 20150, + 20151, + 20152, + 20153, + 20154, + 20155, + 20156, + 20157, + 20158, + 20159, + 20160, + 20161, + 20162, + 20163, + 20164, + 20165, + 20166, + 20167, + 20168, + 20169, + 20170, + 20171, + 20172, + 20174, + 20175, + 20176, + 20177, + 20178, + 20179, + 20180, + 20181, + 20182, + 20183, + 20184, + 20185, + 20186, + 20187, + 20188, + 20189, + 20190, + 20191, + 20192, + 20193, + 20194, + 20195, + 20196, + 20197, + 20198, + 20199, + 20200, + 20201, + 20202, + 20203, + 20204, + 20205, + 20207, + 20208, + 20209, + 20210, + 20212, + 20213, + 20214, + 20215, + 20216, + 20217, + 20218, + 20219, + 20220, + 20221, + 20222, + 20223, + 20224, + 20225, + 20226, + 20227, + 20228, + 20229, + 20230, + 20231, + 20232, + 20233, + 20234, + 20235, + 20236, + 20237, + 20238, + 20239, + 20240, + 20241, + 20242, + 20243, + 20244, + 20245, + 20246, + 20247, + 20248, + 20249, + 20250, + 20251, + 20252, + 20253, + 20254, + 20255, + 20256, + 20257, + 20258, + 20259, + 20260, + 20261, + 20262, + 20263, + 20264, + 20265, + 20266, + 20267, + 20268, + 20269, + 20270, + 20271, + 20272, + 20273, + 20274, + 20275, + 20276, + 20277, + 20278, + 20279, + 20280, + 20281, + 20282, + 20283, + 20284, + 20285, + 20286, + 20287, + 20288, + 20289, + 20290, + 20291, + 20292, + 20293, + 20294, + 20295, + 20296, + 20297, + 20298, + 20299, + 20300, + 20301, + 20302, + 20303, + 20304, + 20305, + 20306, + 20307, + 20308, + 20309, + 20310, + 20311, + 20312, + 20313, + 20314, + 20315, + 20317, + 20318, + 20319, + 20320, + 20321, + 20322, + 20323, + 20324, + 20325, + 20326, + 20327, + 20328, + 20329, + 20330, + 20331, + 20332, + 20334, + 20335, + 20336, + 20337, + 20338, + 20339, + 20340, + 20341, + 20342, + 20343, + 20344, + 20345, + 20346, + 20347, + 20348, + 20349, + 20350, + 20351, + 20353, + 20354, + 20355, + 20356, + 20357, + 20358, + 20359, + 20360, + 20361, + 20362, + 20363, + 20364, + 20365, + 20366, + 20367, + 20368, + 20369, + 20370, + 20371, + 20372, + 20373, + 20374, + 20375, + 20376, + 20377, + 20378, + 20379, + 20380, + 20381, + 20382, + 20383, + 20384, + 20385, + 20386, + 20387, + 20388, + 20389, + 20390, + 20391, + 20392, + 20393, + 20394, + 20395, + 20396, + 20397, + 20398, + 20399, + 20400, + 20401, + 20402, + 20403, + 20404, + 20405, + 20406, + 20407, + 20408, + 20409, + 20410, + 20411, + 20412, + 20413, + 20414, + 20415, + 20416, + 20418, + 20419, + 20420, + 20421, + 20422, + 20423, + 20424, + 20425, + 20426, + 20427, + 20428, + 20429, + 20430, + 20431, + 20432, + 20433, + 20434, + 20435, + 20436, + 20437, + 20438, + 20439, + 20440, + 20441, + 20442, + 20443, + 20444, + 20445, + 20446, + 20447, + 20448, + 20449, + 20451, + 20452, + 20453, + 20454, + 20455, + 20456, + 20457, + 20458, + 20459, + 20460, + 20461, + 20462, + 20463, + 20464, + 20465, + 20466, + 20467, + 20468, + 20469, + 20470, + 20471, + 20472, + 20473, + 20474, + 20475, + 20476, + 20477, + 20478, + 20479, + 20480, + 20481, + 20483, + 20484, + 20485, + 20486, + 20487, + 20488, + 20489, + 20490, + 20491, + 20492, + 20493, + 20494, + 20495, + 20496, + 20497, + 20498, + 20499, + 20500, + 20501, + 20502, + 20503, + 20504, + 20505, + 20506, + 20507, + 20508, + 20509, + 20510, + 20511, + 20512, + 20513, + 20514, + 20515, + 20516, + 20517, + 20518, + 20519, + 20520, + 20521, + 20522, + 20523, + 20524, + 20525, + 20526, + 20527, + 20528, + 20529, + 20530, + 20531, + 20532, + 20533, + 20534, + 20535, + 20536, + 20537, + 20538, + 20539, + 20540, + 20541, + 20542, + 20543, + 20544, + 20545, + 20546, + 20547, + 20548, + 20549, + 20550, + 20551, + 20552, + 20553, + 20554, + 20555, + 20556, + 20558, + 20559, + 20560, + 20561, + 20562, + 20563, + 20564, + 20565, + 20566, + 20567, + 20568, + 20569, + 20570, + 20571, + 20572, + 20573, + 20574, + 20575, + 20576, + 20577, + 20578, + 20579, + 20580, + 20581, + 20582, + 20583, + 20584, + 20585, + 20586, + 20587, + 20588, + 20589, + 20590, + 20591, + 20592, + 20593, + 20594, + 20595, + 20596, + 20597, + 20598, + 20599, + 20600, + 20601, + 20602, + 20603, + 20604, + 20605, + 20606, + 20607, + 20608, + 20609, + 20610, + 20611, + 20612, + 20613, + 20614, + 20615, + 20616, + 20617, + 20618, + 20619, + 20620, + 20621, + 20622, + 20623, + 20625, + 20626, + 20627, + 20628, + 20629, + 20630, + 20631, + 20632, + 20633, + 20634, + 20635, + 20636, + 20637, + 20638, + 20639, + 20640, + 20641, + 20642, + 20643, + 20644, + 20645, + 20646, + 20647, + 20648, + 20649, + 20650, + 20651, + 20652, + 20653, + 20654, + 20655, + 20656, + 20657, + 20658, + 20659, + 20660, + 20661, + 20662, + 20663, + 20664, + 20665, + 20666, + 20667, + 20668, + 20669, + 20670, + 20671, + 20672, + 20673, + 20674, + 20675, + 20676, + 20677, + 20678, + 20679, + 20680, + 20681, + 20682, + 20683, + 20684, + 20685, + 20686, + 20687, + 20688, + 20689, + 20690, + 20691, + 20692, + 20693, + 20694, + 20695, + 20696, + 20697, + 20698, + 20699, + 20700, + 20701, + 20702, + 20703, + 20704, + 20705, + 20706, + 20707, + 20708, + 20709, + 20710, + 20711, + 20712, + 20713, + 20714, + 20715, + 20716, + 20717, + 20718, + 20719, + 20720, + 20721, + 20723, + 20724, + 20725, + 20726, + 20727, + 20728, + 20729, + 20730, + 20732, + 20733, + 20734, + 20735, + 20736, + 20737, + 20738, + 20739, + 20740, + 20742, + 20743, + 20744, + 20745, + 20746, + 20747, + 20748, + 20749, + 20750, + 20751, + 20752, + 20754, + 20755, + 20756, + 20757, + 20758, + 20759, + 20760, + 20761, + 20762, + 20763, + 20764, + 20765, + 20766, + 20767, + 20768, + 20769, + 20770, + 20771, + 20772, + 20773, + 20774, + 20775, + 20776, + 20777, + 20778, + 20779, + 20780, + 20781, + 20782, + 20783, + 20784, + 20785, + 20786, + 20787, + 20788, + 20789, + 20790, + 20791, + 20792, + 20793, + 20794, + 20795, + 20796, + 20797, + 20798, + 20799, + 20800, + 20801, + 20802, + 20803, + 20804, + 20805, + 20806, + 20807, + 20808, + 20809, + 20810, + 20811, + 20812, + 20813, + 20814, + 20815, + 20816, + 20817, + 20818, + 20819, + 20821, + 20822, + 20823, + 20824, + 20825, + 20826, + 20828, + 20829, + 20830, + 20831, + 20832, + 20833, + 20834, + 20835, + 20836, + 20838, + 20840, + 20841, + 20842, + 20843, + 20844, + 20845, + 20846, + 20847, + 20848, + 20849, + 20850, + 20851, + 20852, + 20853, + 20854, + 20855, + 20856, + 20857, + 20858, + 20859, + 20860, + 20861, + 20862, + 20863, + 20864, + 20865, + 20866, + 20867, + 20868, + 20869, + 20870, + 20871, + 20872, + 20873, + 20875, + 20876, + 20877, + 20878, + 20879, + 20880, + 20881, + 20882, + 20883, + 20884, + 20885, + 20886, + 20887, + 20888, + 20889, + 20890, + 20891, + 20892, + 20893, + 20894, + 20895, + 20896, + 20897, + 20898, + 20899, + 20900, + 20901, + 20902, + 20903, + 20904, + 20905, + 20906, + 20907, + 20908, + 20909, + 20910, + 20911, + 20912, + 20913, + 20914, + 20915, + 20916, + 20917, + 20918, + 20919, + 20920, + 20921, + 20922, + 20923, + 20924, + 20925, + 20926, + 20927, + 20928, + 20929, + 20930, + 20931, + 20932, + 20933, + 20934, + 20935, + 20936, + 20937, + 20938, + 20939, + 20940, + 20941, + 20942, + 20943, + 20944, + 20945, + 20946, + 20947, + 20948, + 20949, + 20950, + 20951, + 20952, + 20953, + 20954, + 20955, + 20956, + 20957, + 20958, + 20959, + 20960, + 20961, + 20962, + 20963, + 20964, + 20965, + 20966, + 20967, + 20968, + 20970, + 20971, + 20972, + 20973, + 20974, + 20975, + 20976, + 20977, + 20978, + 20979, + 20980, + 20981, + 20982, + 20983, + 20984, + 20985, + 20987, + 20988, + 20989, + 20990, + 20991, + 20992, + 20993, + 20994, + 20995, + 20996, + 20997, + 20998, + 20999, + 21000, + 21001, + 21002, + 21003, + 21004, + 21005, + 21006, + 21007, + 21008, + 21009, + 21010, + 21011, + 21012, + 21013, + 21014, + 21015, + 21016, + 21017, + 21018, + 21019, + 21020, + 21021, + 21022, + 21023, + 21024, + 21025, + 21026, + 21027, + 21028, + 21029, + 21030, + 21031, + 21032, + 21033, + 21034, + 21035, + 21036, + 21037, + 21038, + 21039, + 21040, + 21041, + 21042, + 21043, + 21044, + 21045, + 21046, + 21047, + 21048, + 21049, + 21051, + 21052, + 21053, + 21054, + 21055, + 21056, + 21057, + 21058, + 21059, + 21060, + 21061, + 21062, + 21063, + 21064, + 21065, + 21066, + 21067, + 21068, + 21069, + 21070, + 21071, + 21072, + 21073, + 21074, + 21075, + 21076, + 21077, + 21078, + 21079, + 21080, + 21081, + 21082, + 21083, + 21084, + 21085, + 21086, + 21087, + 21088, + 21089, + 21090, + 21091, + 21092, + 21093, + 21094, + 21095, + 21096, + 21097, + 21098, + 21099, + 21100, + 21101, + 21102, + 21103, + 21104, + 21105, + 21106, + 21107, + 21108, + 21109, + 21110, + 21111, + 21112, + 21113, + 21114, + 21115, + 21116, + 21117, + 21118, + 21119, + 21120, + 21121, + 21122, + 21123, + 21124, + 21125, + 21126, + 21127, + 21128, + 21129, + 21130, + 21131, + 21132, + 21133, + 21134, + 21135, + 21136, + 21137, + 21138, + 21139, + 21140, + 21141, + 21142, + 21143, + 21144, + 21145, + 21146, + 21147, + 21148, + 21149, + 21150, + 21151, + 21152, + 21154, + 21155, + 21156, + 21157, + 21158, + 21159, + 21160, + 21161, + 21163, + 21164, + 21166, + 21167, + 21168, + 21169, + 21170, + 21171, + 21172, + 21173, + 21174, + 21175, + 21176, + 21177, + 21178, + 21179, + 21180, + 21181, + 21182, + 21183, + 21184, + 21185, + 21186, + 21187, + 21188, + 21189, + 21190, + 21191, + 21192, + 21194, + 21195, + 21196, + 21197, + 21198, + 21199, + 21200, + 21201, + 21202, + 21203, + 21204, + 21205, + 21206, + 21207, + 21208, + 21209, + 21210, + 21211, + 21212, + 21213, + 21214, + 21215, + 21216, + 21217, + 21218, + 21219, + 21220, + 21221, + 21222, + 21223, + 21224, + 21225, + 21226, + 21227, + 21228, + 21229, + 21230, + 21231, + 21232, + 21233, + 21234, + 21235, + 21236, + 21237, + 21238, + 21239, + 21240, + 21241, + 21242, + 21243, + 21244, + 21245, + 21246, + 21247, + 21249, + 21250, + 21251, + 21252, + 21253, + 21254, + 21255, + 21256, + 21257, + 21258, + 21260, + 21261, + 21262, + 21263, + 21264, + 21265, + 21266, + 21267, + 21268, + 21269, + 21270, + 21271, + 21272, + 21273, + 21274, + 21275, + 21276, + 21277, + 21278, + 21280, + 21281, + 21282, + 21283, + 21285, + 21286, + 21287, + 21288, + 21289, + 21290, + 21291, + 21292, + 21293, + 21294, + 21295, + 21296, + 21297, + 21298, + 21299, + 21300, + 21301, + 21302, + 21303, + 21304, + 21305, + 21306, + 21307, + 21308, + 21309, + 21310, + 21311, + 21312, + 21313, + 21314, + 21315, + 21316, + 21317, + 21318, + 21319, + 21320, + 21322, + 21323, + 21324, + 21325, + 21326, + 21327, + 21328, + 21329, + 21330, + 21331, + 21332, + 21333, + 21334, + 21335, + 21336, + 21337, + 21338, + 21339, + 21340, + 21341, + 21342, + 21343, + 21344, + 21345, + 21346, + 21347, + 21348, + 21349, + 21350, + 21351, + 21352, + 21353, + 21354, + 21355, + 21356, + 21357, + 21358, + 21359, + 21360, + 21361, + 21362, + 21363, + 21364, + 21365, + 21366, + 21367, + 21368, + 21369, + 21370, + 21371, + 21372, + 21373, + 21374, + 21375, + 21376, + 21377, + 21378, + 21379, + 21380, + 21381, + 21382, + 21383, + 21384, + 21385, + 21386, + 21387, + 21388, + 21389, + 21390, + 21391, + 21393, + 21394, + 21395, + 21396, + 21397, + 21398, + 21399, + 21400, + 21401, + 21402, + 21403, + 21404, + 21405, + 21406, + 21407, + 21408, + 21409, + 21410, + 21411, + 21412, + 21413, + 21414, + 21415, + 21416, + 21417, + 21418, + 21419, + 21420, + 21421, + 21422, + 21423, + 21424, + 21425, + 21426, + 21427, + 21428, + 21429, + 21430, + 21431, + 21432, + 21433, + 21434, + 21435, + 21436, + 21437, + 21438, + 21439, + 21441, + 21442, + 21443, + 21444, + 21445, + 21446, + 21447, + 21448, + 21449, + 21450, + 21451, + 21452, + 21454, + 21455, + 21456, + 21457, + 21458, + 21459, + 21460, + 21461, + 21462, + 21463, + 21464, + 21465, + 21466, + 21467, + 21468, + 21469, + 21470, + 21471, + 21472, + 21473, + 21474, + 21475, + 21476, + 21477, + 21478, + 21479, + 21480, + 21481, + 21482, + 21483, + 21484, + 21485, + 21486, + 21487, + 21488, + 21489, + 21490, + 21491, + 21492, + 21493, + 21494, + 21495, + 21496, + 21497, + 21498, + 21499, + 21500, + 21501, + 21502, + 21503, + 21504, + 21505, + 21506, + 21507, + 21508, + 21509, + 21510, + 21511, + 21512, + 21513, + 21514, + 21515, + 21516, + 21517, + 21518, + 21519, + 21520, + 21521, + 21522, + 21523, + 21524, + 21525, + 21526, + 21527, + 21528, + 21529, + 21530, + 21531, + 21532, + 21533, + 21534, + 21535, + 21536, + 21537, + 21538, + 21539, + 21540, + 21541, + 21542, + 21543, + 21544, + 21545, + 21546, + 21547, + 21548, + 21549, + 21550, + 21551, + 21552, + 21553, + 21554, + 21555, + 21556, + 21557, + 21558, + 21559, + 21560, + 21561, + 21562, + 21563, + 21564, + 21565, + 21566, + 21567, + 21568, + 21569, + 21570, + 21571, + 21572, + 21573, + 21574, + 21575, + 21576, + 21577, + 21578, + 21579, + 21580, + 21581, + 21582, + 21583, + 21584, + 21585, + 21586, + 21588, + 21589, + 21590, + 21591, + 21592, + 21593, + 21594, + 21595, + 21596, + 21597, + 21598, + 21599, + 21600, + 21601, + 21602, + 21603, + 21604, + 21605, + 21606, + 21607, + 21608, + 21609, + 21610, + 21612, + 21613, + 21614, + 21615, + 21616, + 21617, + 21618, + 21619, + 21620, + 21621, + 21622, + 21623, + 21624, + 21625, + 21626, + 21627, + 21628, + 21629, + 21630, + 21631, + 21632, + 21633, + 21634, + 21635, + 21636, + 21637, + 21638, + 21639, + 21640, + 21641, + 21642, + 21643, + 21644, + 21645, + 21646, + 21647, + 21648, + 21649, + 21650, + 21651, + 21652, + 21653, + 21654, + 21655, + 21656, + 21657, + 21658, + 21659, + 21660, + 21661, + 21663, + 21664, + 21665, + 21666, + 21667, + 21668, + 21669, + 21670, + 21671, + 21672, + 21673, + 21674, + 21675, + 21676, + 21677, + 21678, + 21679, + 21680, + 21681, + 21682, + 21683, + 21684, + 21685, + 21686, + 21687, + 21688, + 21689, + 21690, + 21691, + 21692, + 21693, + 21694, + 21695, + 21696, + 21697, + 21698, + 21699, + 21700, + 21701, + 21702, + 21703, + 21704, + 21705, + 21706, + 21707, + 21708, + 21710, + 21711, + 21712, + 21713, + 21714, + 21715, + 21716, + 21717, + 21718, + 21719, + 21720, + 21721, + 21722, + 21723, + 21724, + 21725, + 21726, + 21727, + 21728, + 21729, + 21730, + 21731, + 21732, + 21733, + 21734, + 21735, + 21736, + 21737, + 21738, + 21739, + 21740, + 21741, + 21742, + 21743, + 21744, + 21745, + 21746, + 21747, + 21748, + 21749, + 21750, + 21751, + 21752, + 21753, + 21754, + 21755, + 21756, + 21757, + 21758, + 21759, + 21760, + 21761, + 21762, + 21763, + 21764, + 21765, + 21766, + 21767, + 21768, + 21769, + 21770, + 21771, + 21772, + 21773, + 21774, + 21775, + 21776, + 21777, + 21778, + 21779, + 21780, + 21781, + 21782, + 21783, + 21784, + 21785, + 21786, + 21787, + 21788, + 21789, + 21791, + 21792, + 21794, + 21795, + 21796, + 21797, + 21798, + 21799, + 21800, + 21801, + 21802, + 21803, + 21804, + 21805, + 21806, + 21807, + 21808, + 21809, + 21810, + 21811, + 21812, + 21813, + 21814, + 21815, + 21816, + 21817, + 21818, + 21819, + 21820, + 21821, + 21822, + 21823, + 21824, + 21825, + 21826, + 21828, + 21829, + 21830, + 21831, + 21832, + 21833, + 21834, + 21835, + 21836, + 21837, + 21838, + 21839, + 21840, + 21841, + 21842, + 21843, + 21844, + 21845, + 21846, + 21847, + 21848, + 21849, + 21850, + 21851, + 21852, + 21853, + 21854, + 21855, + 21856, + 21857, + 21858, + 21859, + 21860, + 21861, + 21862, + 21863, + 21864, + 21865, + 21866, + 21867, + 21868, + 21869, + 21870, + 21871, + 21872, + 21873, + 21874, + 21875, + 21876, + 21877, + 21878, + 21879, + 21880, + 21881, + 21882, + 21883, + 21884, + 21885, + 21886, + 21887, + 21888, + 21889, + 21890, + 21891, + 21892, + 21893, + 21894, + 21895, + 21896, + 21897, + 21898, + 21899, + 21900, + 21901, + 21902, + 21903, + 21904, + 21905, + 21906, + 21907, + 21908, + 21909, + 21910, + 21911, + 21912, + 21913, + 21914, + 21915, + 21916, + 21917, + 21918, + 21919, + 21920, + 21921, + 21922, + 21923, + 21924, + 21925, + 21926, + 21927, + 21928, + 21929, + 21930, + 21931, + 21932, + 21933, + 21934, + 21935, + 21936, + 21937, + 21938, + 21939, + 21940, + 21941, + 21942, + 21943, + 21944, + 21945, + 21946, + 21947, + 21948, + 21949, + 21950, + 21951, + 21952, + 21953, + 21955, + 21956, + 21957, + 21958, + 21959, + 21960, + 21961, + 21962, + 21963, + 21964, + 21965, + 21966, + 21967, + 21968, + 21969, + 21970, + 21971, + 21972, + 21973, + 21974, + 21975, + 21976, + 21977, + 21978, + 21979, + 21980, + 21981, + 21983, + 21984, + 21985, + 21986, + 21987, + 21988, + 21989, + 21990, + 21991, + 21992, + 21993, + 21994, + 21995, + 21996, + 21997, + 21998, + 21999, + 22000, + 22001, + 22002, + 22003, + 22004, + 22005, + 22006, + 22007, + 22008, + 22009, + 22010, + 22011, + 22012, + 22013, + 22014, + 22015, + 22016, + 22017, + 22018, + 22019, + 22020, + 22021, + 22022, + 22023, + 22024, + 22025, + 22026, + 22027, + 22028, + 22029, + 22030, + 22031, + 22032, + 22033, + 22034, + 22035, + 22036, + 22037, + 22038, + 22039, + 22040, + 22041, + 22042, + 22043, + 22044, + 22045, + 22046, + 22047, + 22048, + 22049, + 22050, + 22051, + 22052, + 22053, + 22054, + 22055, + 22056, + 22057, + 22058, + 22059, + 22060, + 22061, + 22062, + 22063, + 22064, + 22065, + 22066, + 22067, + 22068, + 22069, + 22070, + 22071, + 22072, + 22073, + 22074, + 22075, + 22076, + 22077, + 22078, + 22079, + 22080, + 22081, + 22082, + 22083, + 22084, + 22085, + 22086, + 22087, + 22088, + 22089, + 22090, + 22091, + 22092, + 22093, + 22094, + 22095, + 22096, + 22097, + 22098, + 22099, + 22100, + 22101, + 22102, + 22103, + 22105, + 22106, + 22107, + 22108, + 22109, + 22111, + 22112, + 22113, + 22114, + 22115, + 22116, + 22117, + 22118, + 22119, + 22120, + 22121, + 22122, + 22123, + 22124, + 22125, + 22126, + 22127, + 22128, + 22129, + 22130, + 22131, + 22132, + 22133, + 22134, + 22135, + 22136, + 22137, + 22138, + 22139, + 22140, + 22141, + 22142, + 22143, + 22144, + 22145, + 22146, + 22147, + 22148, + 22149, + 22150, + 22151, + 22152, + 22153, + 22154, + 22155, + 22156, + 22157, + 22158, + 22159, + 22160, + 22161, + 22162, + 22163, + 22164, + 22165, + 22166, + 22167, + 22168, + 22169, + 22170, + 22171, + 22172, + 22173, + 22174, + 22175, + 22176, + 22177, + 22178, + 22179, + 22180, + 22181, + 22182, + 22183, + 22184, + 22186, + 22187, + 22188, + 22189, + 22190, + 22191, + 22192, + 22193, + 22194, + 22195, + 22196, + 22198, + 22199, + 22200, + 22201, + 22202, + 22203, + 22204, + 22205, + 22206, + 22207, + 22208, + 22209, + 22210, + 22211, + 22212, + 22214, + 22215, + 22216, + 22217, + 22218, + 22219, + 22220, + 22221, + 22222, + 22223, + 22224, + 22225, + 22226, + 22227, + 22228, + 22230, + 22231, + 22232, + 22233, + 22234, + 22235, + 22236, + 22237, + 22238, + 22239, + 22240, + 22241, + 22242, + 22243, + 22244, + 22246, + 22247, + 22248, + 22249, + 22250, + 22251, + 22252, + 22253, + 22254, + 22255, + 22256, + 22257, + 22258, + 22259, + 22260, + 22261, + 22262, + 22263, + 22264, + 22265, + 22266, + 22267, + 22268, + 22269, + 22270, + 22271, + 22272, + 22273, + 22274, + 22275, + 22276, + 22277, + 22278, + 22280, + 22281, + 22282, + 22283, + 22284, + 22285, + 22286, + 22287, + 22288, + 22289, + 22290, + 22291, + 22292, + 22293, + 22294, + 22295, + 22296, + 22297, + 22298, + 22299, + 22300, + 22301, + 22302, + 22303, + 22304, + 22305, + 22306, + 22307, + 22308, + 22309, + 22310, + 22311, + 22312, + 22313, + 22314, + 22315, + 22316, + 22317, + 22318, + 22319, + 22320, + 22321, + 22322, + 22323, + 22324, + 22325, + 22326, + 22327, + 22328, + 22329, + 22330, + 22331, + 22332, + 22333, + 22334, + 22335, + 22336, + 22337, + 22338, + 22339, + 22340, + 22341, + 22342, + 22343, + 22344, + 22345, + 22346, + 22347, + 22348, + 22349, + 22350, + 22351, + 22352, + 22353, + 22354, + 22355, + 22356, + 22357, + 22358, + 22359, + 22360, + 22361, + 22362, + 22363, + 22364, + 22365, + 22366, + 22367, + 22368, + 22369, + 22370, + 22371, + 22372, + 22373, + 22374, + 22375, + 22376, + 22377, + 22378, + 22379, + 22380, + 22381, + 22382, + 22383, + 22384, + 22385, + 22386, + 22387, + 22388, + 22389, + 22390, + 22391, + 22392, + 22393, + 22394, + 22395, + 22396, + 22397, + 22398, + 22399, + 22400, + 22401, + 22402, + 22403, + 22404, + 22405, + 22406, + 22407, + 22408, + 22409, + 22410, + 22411, + 22412, + 22413, + 22414, + 22415, + 22416, + 22417, + 22418, + 22419, + 22420, + 22421, + 22422, + 22423, + 22424, + 22425, + 22426, + 22427, + 22428, + 22429, + 22430, + 22431, + 22432, + 22433, + 22434, + 22436, + 22437, + 22438, + 22439, + 22440, + 22441, + 22442, + 22443, + 22444, + 22445, + 22446, + 22447, + 22448, + 22449, + 22450, + 22451, + 22452, + 22453, + 22454, + 22455, + 22456, + 22457, + 22458, + 22459, + 22460, + 22461, + 22462, + 22463, + 22464, + 22465, + 22466, + 22467, + 22468, + 22469, + 22470, + 22471, + 22472, + 22473, + 22474, + 22475, + 22476, + 22477, + 22478, + 22479, + 22480, + 22481, + 22482, + 22483, + 22484, + 22485, + 22486, + 22487, + 22488, + 22489, + 22490, + 22491, + 22493, + 22494, + 22495, + 22496, + 22497, + 22498, + 22499, + 22500, + 22501, + 22502, + 22503, + 22504, + 22505, + 22506, + 22507, + 22508, + 22509, + 22510, + 22511, + 22512, + 22513, + 22514, + 22515, + 22516, + 22517, + 22519, + 22520, + 22521, + 22522, + 22523, + 22524, + 22525, + 22526, + 22527, + 22528, + 22529, + 22530, + 22531, + 22532, + 22533, + 22534, + 22535, + 22536, + 22537, + 22538, + 22540, + 22541, + 22542, + 22543, + 22544, + 22545, + 22546, + 22547, + 22548, + 22549, + 22550, + 22551, + 22552, + 22553, + 22554, + 22555, + 22556, + 22557, + 22558, + 22559, + 22560, + 22561, + 22562, + 22563, + 22564, + 22565, + 22566, + 22567, + 22568, + 22569, + 22570, + 22571, + 22572, + 22573, + 22574, + 22575, + 22576, + 22577, + 22578, + 22579, + 22580, + 22581, + 22582, + 22583, + 22584, + 22585, + 22586, + 22587, + 22588, + 22589, + 22590, + 22591, + 22592, + 22593, + 22594, + 22595, + 22596, + 22597, + 22598, + 22599, + 22600, + 22601, + 22602, + 22603, + 22604, + 22605, + 22606, + 22607, + 22608, + 22610, + 22611, + 22612, + 22613, + 22614, + 22615, + 22616, + 22617, + 22618, + 22619, + 22620, + 22621, + 22622, + 22623, + 22624, + 22625, + 22626, + 22627, + 22628, + 22629, + 22630, + 22631, + 22632, + 22633, + 22634, + 22635, + 22636, + 22637, + 22638, + 22639, + 22640, + 22641, + 22642, + 22643, + 22644, + 22645, + 22646, + 22647, + 22648, + 22649, + 22650, + 22651, + 22652, + 22653, + 22654, + 22655, + 22656, + 22657, + 22658, + 22659, + 22660, + 22661, + 22662, + 22663, + 22665, + 22666, + 22667, + 22668, + 22669, + 22670, + 22671, + 22672, + 22673, + 22674, + 22675, + 22676, + 22677, + 22678, + 22679, + 22680, + 22681, + 22682, + 22683, + 22684, + 22685, + 22686, + 22687, + 22688, + 22689, + 22691, + 22692, + 22693, + 22694, + 22695, + 22696, + 22697, + 22698, + 22699, + 22700, + 22701, + 22702, + 22703, + 22704, + 22705, + 22706, + 22707, + 22708, + 22709, + 22710, + 22711, + 22712, + 22713, + 22714, + 22715, + 22716, + 22717, + 22718, + 22719, + 22720, + 22721, + 22722, + 22723, + 22724, + 22725, + 22726, + 22727, + 22728, + 22729, + 22730, + 22731, + 22732, + 22733, + 22734, + 22735, + 22736, + 22737, + 22738, + 22739, + 22740, + 22741, + 22742, + 22743, + 22744, + 22745, + 22746, + 22747, + 22748, + 22749, + 22750, + 22751, + 22752, + 22753, + 22754, + 22756, + 22757, + 22758, + 22759, + 22760, + 22761, + 22762, + 22763, + 22764, + 22765, + 22766, + 22767, + 22768, + 22769, + 22770, + 22771, + 22772, + 22773, + 22774, + 22775, + 22776, + 22777, + 22778, + 22779, + 22781, + 22782, + 22783, + 22784, + 22785, + 22786, + 22787, + 22788, + 22789, + 22790, + 22791, + 22792, + 22793, + 22794, + 22795, + 22796, + 22797, + 22798, + 22799, + 22800, + 22801, + 22802, + 22803, + 22804, + 22805, + 22806, + 22807, + 22808, + 22809, + 22810, + 22811, + 22812, + 22813, + 22814, + 22815, + 22816, + 22817, + 22818, + 22819, + 22820, + 22822, + 22823, + 22824, + 22825, + 22826, + 22827, + 22828, + 22830, + 22831, + 22832, + 22833, + 22834, + 22835, + 22836, + 22837, + 22838, + 22839, + 22840, + 22841, + 22842, + 22843, + 22844, + 22845, + 22846, + 22847, + 22848, + 22849, + 22850, + 22851, + 22852, + 22853, + 22854, + 22855, + 22856, + 22857, + 22858, + 22859, + 22860, + 22861, + 22862, + 22863, + 22864, + 22865, + 22866, + 22867, + 22868, + 22869, + 22870, + 22871, + 22872, + 22873, + 22874, + 22875, + 22876, + 22877, + 22878, + 22879, + 22880, + 22881, + 22882, + 22883, + 22884, + 22885, + 22886, + 22887, + 22888, + 22889, + 22890, + 22891, + 22892, + 22893, + 22894, + 22895, + 22896, + 22897, + 22898, + 22899, + 22900, + 22901, + 22902, + 22903, + 22904, + 22905, + 22906, + 22907, + 22908, + 22909, + 22910, + 22911, + 22912, + 22913, + 22914, + 22915, + 22916, + 22917, + 22918, + 22919, + 22920, + 22921, + 22922, + 22923, + 22924, + 22925, + 22926, + 22927, + 22928, + 22929, + 22930, + 22931, + 22932, + 22933, + 22934, + 22935, + 22936, + 22937, + 22938, + 22939, + 22940, + 22941, + 22942, + 22943, + 22944, + 22945, + 22947, + 22948, + 22949, + 22951, + 22952, + 22953, + 22954, + 22955, + 22956, + 22957, + 22958, + 22959, + 22961, + 22962, + 22963, + 22964, + 22965, + 22966, + 22967, + 22968, + 22969, + 22970, + 22971, + 22972, + 22974, + 22975, + 22976, + 22977, + 22978, + 22979, + 22980, + 22981, + 22982, + 22983, + 22984, + 22985, + 22986, + 22987, + 22988, + 22989, + 22990, + 22991, + 22992, + 22993, + 22994, + 22995, + 22996, + 22997, + 22998, + 23000, + 23001, + 23002, + 23003, + 23004, + 23005, + 23006, + 23007, + 23008, + 23009, + 23010, + 23011, + 23012, + 23013, + 23014, + 23015, + 23016, + 23017, + 23018, + 23019, + 23020, + 23021, + 23022, + 23023, + 23024, + 23025, + 23026, + 23027, + 23028, + 23029, + 23030, + 23031, + 23032, + 23033, + 23034, + 23035, + 23036, + 23037, + 23038, + 23039, + 23040, + 23041, + 23042, + 23043, + 23044, + 23045, + 23046, + 23047, + 23048, + 23049, + 23050, + 23051, + 23052, + 23053, + 23054, + 23055, + 23056, + 23057, + 23058, + 23059, + 23060, + 23061, + 23062, + 23063, + 23064, + 23065, + 23066, + 23067, + 23068, + 23069, + 23070, + 23071, + 23072, + 23073, + 23074, + 23075, + 23076, + 23078, + 23079, + 23080, + 23081, + 23082, + 23083, + 23084, + 23085, + 23086, + 23087, + 23088, + 23089, + 23091, + 23092, + 23093, + 23094, + 23095, + 23096, + 23097, + 23098, + 23099, + 23100, + 23101, + 23102, + 23103, + 23104, + 23105, + 23106, + 23107, + 23108, + 23109, + 23110, + 23111, + 23112, + 23113, + 23114, + 23115, + 23116, + 23117, + 23118, + 23119, + 23120, + 23121, + 23122, + 23123, + 23124, + 23125, + 23126, + 23127, + 23128, + 23129, + 23130, + 23131, + 23132, + 23133, + 23134, + 23135, + 23136, + 23137, + 23139, + 23140, + 23141, + 23142, + 23143, + 23144, + 23145, + 23146, + 23147, + 23148, + 23149, + 23150, + 23151, + 23152, + 23154, + 23155, + 23156, + 23157, + 23158, + 23159, + 23160, + 23161, + 23162, + 23163, + 23164, + 23165, + 23166, + 23167, + 23168, + 23169, + 23170, + 23171, + 23172, + 23173, + 23174, + 23175, + 23176, + 23177, + 23178, + 23179, + 23180, + 23181, + 23182, + 23183, + 23184, + 23185, + 23186, + 23187, + 23188, + 23189, + 23190, + 23191, + 23192, + 23193, + 23194, + 23195, + 23196, + 23197, + 23198, + 23199, + 23200, + 23201, + 23202, + 23203, + 23204, + 23205, + 23206, + 23207, + 23208, + 23209, + 23210, + 23211, + 23212, + 23213, + 23214, + 23215, + 23216, + 23217, + 23218, + 23219, + 23220, + 23221, + 23222, + 23223, + 23224, + 23225, + 23226, + 23227, + 23228, + 23229, + 23230, + 23231, + 23232, + 23233, + 23234, + 23235, + 23236, + 23237, + 23238, + 23239, + 23240, + 23241, + 23242, + 23243, + 23244, + 23245, + 23247, + 23248, + 23249, + 23250, + 23251, + 23252, + 23253, + 23254, + 23255, + 23256, + 23257, + 23258, + 23259, + 23260, + 23261, + 23262, + 23263, + 23264, + 23265, + 23266, + 23267, + 23268, + 23269, + 23270, + 23271, + 23272, + 23273, + 23274, + 23275, + 23276, + 23277, + 23278, + 23279, + 23280, + 23281, + 23282, + 23283, + 23284, + 23285, + 23286, + 23287, + 23288, + 23289, + 23290, + 23291, + 23292, + 23293, + 23294, + 23295, + 23296, + 23297, + 23298, + 23299, + 23300, + 23301, + 23302, + 23303, + 23304, + 23305, + 23306, + 23307, + 23308, + 23309, + 23310, + 23311, + 23312, + 23313, + 23314, + 23315, + 23316, + 23317, + 23318, + 23319, + 23320, + 23321, + 23322, + 23323, + 23324, + 23325, + 23326, + 23327, + 23328, + 23329, + 23330, + 23331, + 23332, + 23333, + 23334, + 23335, + 23336, + 23337, + 23338, + 23339, + 23340, + 23341, + 23342, + 23343, + 23344, + 23345, + 23346, + 23347, + 23348, + 23349, + 23350, + 23351, + 23352, + 23353, + 23354, + 23355, + 23356, + 23357, + 23358, + 23359, + 23360, + 23361, + 23362, + 23363, + 23364, + 23365, + 23366, + 23367, + 23368, + 23369, + 23370, + 23371, + 23372, + 23373, + 23374, + 23375, + 23376, + 23377, + 23378, + 23379, + 23380, + 23381, + 23382, + 23383, + 23384, + 23385, + 23386, + 23387, + 23388, + 23389, + 23390, + 23391, + 23392, + 23393, + 23394, + 23396, + 23397, + 23398, + 23399, + 23400, + 23401, + 23402, + 23403, + 23404, + 23405, + 23406, + 23407, + 23408, + 23409, + 23410, + 23411, + 23412, + 23413, + 23414, + 23415, + 23416, + 23417, + 23418, + 23419, + 23420, + 23422, + 23423, + 23424, + 23425, + 23426, + 23427, + 23428, + 23429, + 23430, + 23431, + 23432, + 23433, + 23434, + 23435, + 23436, + 23437, + 23438, + 23439, + 23440, + 23441, + 23442, + 23443, + 23444, + 23445, + 23446, + 23447, + 23448, + 23449, + 23450, + 23451, + 23452, + 23453, + 23454, + 23455, + 23456, + 23457, + 23458, + 23459, + 23460, + 23461, + 23462, + 23463, + 23464, + 23465, + 23466, + 23467, + 23468, + 23469, + 23470, + 23471, + 23472, + 23473, + 23474, + 23475, + 23476, + 23477, + 23478, + 23479, + 23480, + 23481, + 23482, + 23483, + 23484, + 23485, + 23486, + 23487, + 23488, + 23489, + 23490, + 23491, + 23492, + 23493, + 23494, + 23495, + 23496, + 23497, + 23498, + 23499, + 23500, + 23501, + 23502, + 23503, + 23504, + 23505, + 23506, + 23507, + 23508, + 23509, + 23510, + 23511, + 23512, + 23513, + 23514, + 23515, + 23516, + 23517, + 23518, + 23519, + 23520, + 23521, + 23522, + 23523, + 23524, + 23525, + 23526, + 23527, + 23528, + 23529, + 23530, + 23531, + 23532, + 23533, + 23534, + 23535, + 23536, + 23537, + 23538, + 23539, + 23540, + 23541, + 23542, + 23543, + 23544, + 23545, + 23546, + 23547, + 23548, + 23549, + 23550, + 23551, + 23552, + 23553, + 23554, + 23556, + 23557, + 23558, + 23559, + 23560, + 23561, + 23562, + 23563, + 23564, + 23565, + 23566, + 23567, + 23568, + 23569, + 23570, + 23571, + 23572, + 23573, + 23574, + 23575, + 23576, + 23577, + 23578, + 23579, + 23580, + 23581, + 23582, + 23583, + 23584, + 23585, + 23586, + 23587, + 23588, + 23589, + 23590, + 23592, + 23593, + 23594, + 23595, + 23596, + 23597, + 23598, + 23599, + 23600, + 23601, + 23602, + 23603, + 23605, + 23606, + 23607, + 23608, + 23609, + 23610, + 23611, + 23612, + 23613, + 23614, + 23615, + 23616, + 23617, + 23618, + 23619, + 23620, + 23621, + 23622, + 23623, + 23624, + 23625, + 23626, + 23627, + 23628, + 23629, + 23630, + 23631, + 23632, + 23633, + 23634, + 23635, + 23636, + 23637, + 23638, + 23639, + 23640, + 23641, + 23642, + 23643, + 23644, + 23645, + 23646, + 23647, + 23648, + 23649, + 23650, + 23651, + 23652, + 23653, + 23654, + 23655, + 23656, + 23657, + 23658, + 23659, + 23660, + 23661, + 23662, + 23663, + 23664, + 23665, + 23666, + 23667, + 23668, + 23669, + 23670, + 23671, + 23672, + 23673, + 23674, + 23675, + 23676, + 23677, + 23678, + 23679, + 23680, + 23681, + 23682, + 23683, + 23684, + 23685, + 23686, + 23687, + 23688, + 23689, + 23690, + 23691, + 23692, + 23693, + 23694, + 23695, + 23696, + 23697, + 23698, + 23699, + 23700, + 23701, + 23702, + 23703, + 23704, + 23705, + 23706, + 23707, + 23708, + 23709, + 23710, + 23711, + 23712, + 23713, + 23714, + 23715, + 23716, + 23717, + 23718, + 23719, + 23720, + 23721, + 23722, + 23723, + 23724, + 23725, + 23726, + 23727, + 23728, + 23729, + 23730, + 23731, + 23733, + 23734, + 23735, + 23736, + 23737, + 23738, + 23739, + 23740, + 23741, + 23742, + 23743, + 23744, + 23745, + 23746, + 23747, + 23748, + 23749, + 23750, + 23751, + 23752, + 23753, + 23754, + 23755, + 23756, + 23757, + 23758, + 23759, + 23760, + 23761, + 23762, + 23763, + 23764, + 23765, + 23766, + 23767, + 23768, + 23769, + 23770, + 23771, + 23772, + 23773, + 23775, + 23776, + 23777, + 23778, + 23779, + 23780, + 23781, + 23782, + 23783, + 23784, + 23785, + 23786, + 23787, + 23788, + 23789, + 23790, + 23791, + 23792, + 23793, + 23794, + 23795, + 23797, + 23798, + 23799, + 23800, + 23801, + 23802, + 23803, + 23804, + 23805, + 23806, + 23807, + 23808, + 23809, + 23810, + 23811, + 23812, + 23813, + 23814, + 23815, + 23816, + 23817, + 23818, + 23819, + 23820, + 23821, + 23822, + 23823, + 23824, + 23825, + 23826, + 23827, + 23828, + 23829, + 23830, + 23831, + 23832, + 23834, + 23835, + 23836, + 23837, + 23838, + 23839, + 23840, + 23841, + 23842, + 23843, + 23844, + 23845, + 23846, + 23847, + 23848, + 23849, + 23850, + 23851, + 23852, + 23853, + 23854, + 23855, + 23856, + 23857, + 23858, + 23859, + 23860, + 23861, + 23862, + 23863, + 23864, + 23865, + 23866, + 23867, + 23868, + 23869, + 23870, + 23871, + 23872, + 23873, + 23874, + 23875, + 23876, + 23877, + 23878, + 23879, + 23880, + 23881, + 23882, + 23883, + 23884, + 23885, + 23886, + 23887, + 23888, + 23889, + 23890, + 23891, + 23892, + 23893, + 23894, + 23895, + 23896, + 23897, + 23898, + 23899, + 23900, + 23901, + 23902, + 23903, + 23904, + 23905, + 23906, + 23907, + 23908, + 23909, + 23910, + 23911, + 23912, + 23913, + 23914, + 23915, + 23916, + 23917, + 23918, + 23919, + 23920, + 23921, + 23922, + 23923, + 23924, + 23925, + 23926, + 23927, + 23928, + 23929, + 23930, + 23931, + 23932, + 23933, + 23934, + 23935, + 23936, + 23937, + 23938, + 23939, + 23940, + 23941, + 23942, + 23943, + 23945, + 23946, + 23947, + 23948, + 23949, + 23950, + 23951, + 23952, + 23953, + 23954, + 23955, + 23956, + 23957, + 23958, + 23959, + 23960, + 23961, + 23962, + 23963, + 23964, + 23965, + 23966, + 23967, + 23968, + 23969, + 23970, + 23971, + 23972, + 23973, + 23974, + 23975, + 23977, + 23978, + 23979, + 23980, + 23982, + 23983, + 23984, + 23985, + 23986, + 23987, + 23988, + 23989, + 23990, + 23991, + 23992, + 23993, + 23994, + 23995, + 23996, + 23997, + 23998, + 23999, + 24000, + 24001, + 24002, + 24003, + 24004, + 24005, + 24006, + 24007, + 24008, + 24009, + 24010, + 24011, + 24012, + 24013, + 24014, + 24015, + 24016, + 24017, + 24018, + 24019, + 24020, + 24022, + 24023, + 24024, + 24025, + 24026, + 24027, + 24028, + 24029, + 24030, + 24031, + 24032, + 24033, + 24034, + 24035, + 24036, + 24037, + 24038, + 24039, + 24040, + 24041, + 24042, + 24043, + 24044, + 24045, + 24046, + 24047, + 24048, + 24049, + 24050, + 24051, + 24052, + 24053, + 24054, + 24055, + 24056, + 24057, + 24058, + 24059, + 24060, + 24061, + 24062, + 24063, + 24064, + 24065, + 24066, + 24067, + 24068, + 24069, + 24070, + 24071, + 24072, + 24073, + 24074, + 24075, + 24076, + 24077, + 24078, + 24079, + 24080, + 24081, + 24082, + 24083, + 24084, + 24085, + 24086, + 24087, + 24088, + 24089, + 24090, + 24091, + 24092, + 24093, + 24094, + 24095, + 24096, + 24097, + 24098, + 24099, + 24100, + 24101, + 24102, + 24103, + 24104, + 24105, + 24106, + 24107, + 24108, + 24109, + 24110, + 24111, + 24112, + 24113, + 24114, + 24115, + 24116, + 24117, + 24118, + 24119, + 24120, + 24121, + 24122, + 24124, + 24125, + 24126, + 24127, + 24128, + 24129, + 24130, + 24131, + 24132, + 24133, + 24134, + 24135, + 24136, + 24137, + 24138, + 24139, + 24140, + 24141, + 24142, + 24143, + 24144, + 24145, + 24146, + 24147, + 24148, + 24149, + 24150, + 24151, + 24152, + 24154, + 24155, + 24156, + 24157, + 24158, + 24159, + 24160, + 24161, + 24162, + 24163, + 24164, + 24165, + 24166, + 24167, + 24168, + 24169, + 24170, + 24171, + 24172, + 24173, + 24174, + 24175, + 24176, + 24177, + 24178, + 24179, + 24180, + 24181, + 24182, + 24183, + 24184, + 24185, + 24186, + 24187, + 24188, + 24189, + 24190, + 24191, + 24192, + 24193, + 24194, + 24195, + 24196, + 24197, + 24198, + 24199, + 24200, + 24201, + 24202, + 24203, + 24204, + 24205, + 24206, + 24207, + 24208, + 24209, + 24210, + 24211, + 24212, + 24213, + 24214, + 24215, + 24216, + 24217, + 24218, + 24219, + 24220, + 24221, + 24222, + 24223, + 24225, + 24226, + 24227, + 24228, + 24229, + 24230, + 24231, + 24232, + 24233, + 24234, + 24235, + 24236, + 24237, + 24238, + 24239, + 24240, + 24241, + 24242, + 24243, + 24244, + 24245, + 24246, + 24247, + 24248, + 24249, + 24250, + 24252, + 24253, + 24254, + 24255, + 24256, + 24257, + 24258, + 24259, + 24260, + 24261, + 24262, + 24263, + 24264, + 24265, + 24266, + 24267, + 24268, + 24269, + 24270, + 24271, + 24272, + 24273, + 24274, + 24275, + 24276, + 24277, + 24279, + 24280, + 24281, + 24282, + 24283, + 24284, + 24285, + 24286, + 24287, + 24288, + 24289, + 24290, + 24291, + 24292, + 24293, + 24294, + 24295, + 24296, + 24297, + 24298, + 24299, + 24300, + 24301, + 24302, + 24303, + 24304, + 24305, + 24306, + 24307, + 24308, + 24309, + 24310, + 24311, + 24312, + 24313, + 24314, + 24315, + 24316, + 24317, + 24318, + 24319, + 24320, + 24321, + 24322, + 24323, + 24324, + 24325, + 24326, + 24327, + 24328, + 24329, + 24330, + 24331, + 24332, + 24333, + 24334, + 24335, + 24336, + 24337, + 24338, + 24339, + 24340, + 24341, + 24342, + 24343, + 24344, + 24345, + 24346, + 24347, + 24348, + 24349, + 24350, + 24351, + 24352, + 24353, + 24354, + 24355, + 24356, + 24357, + 24358, + 24359, + 24360, + 24361, + 24362, + 24363, + 24364, + 24365, + 24366, + 24367, + 24368, + 24369, + 24370, + 24371, + 24372, + 24373, + 24374, + 24375, + 24376, + 24377, + 24378, + 24379, + 24380, + 24381, + 24383, + 24384, + 24385, + 24386, + 24387, + 24388, + 24389, + 24390, + 24391, + 24392, + 24393, + 24394, + 24395, + 24396, + 24397, + 24398, + 24399, + 24400, + 24401, + 24402, + 24403, + 24404, + 24405, + 24406, + 24407, + 24408, + 24409, + 24410, + 24411, + 24412, + 24413, + 24414, + 24415, + 24416, + 24417, + 24418, + 24419, + 24420, + 24421, + 24422, + 24423, + 24424, + 24427, + 24428, + 24429, + 24430, + 24431, + 24432, + 24433, + 24434, + 24435, + 24436, + 24437, + 24438, + 24439, + 24440, + 24441, + 24442, + 24443, + 24444, + 24445, + 24446, + 24447, + 24448, + 24449, + 24450, + 24451, + 24452, + 24453, + 24454, + 24455, + 24457, + 24458, + 24459, + 24460, + 24461, + 24462, + 24463, + 24464, + 24465, + 24466, + 24467, + 24468, + 24469, + 24470, + 24471, + 24472, + 24473, + 24474, + 24475, + 24476, + 24477, + 24478, + 24479, + 24480, + 24481, + 24482, + 24483, + 24484, + 24485, + 24486, + 24487, + 24488, + 24489, + 24490, + 24491, + 24492, + 24493, + 24494, + 24495, + 24496, + 24497, + 24498, + 24499, + 24500, + 24501, + 24502, + 24503, + 24504, + 24505, + 24506, + 24507, + 24508, + 24509, + 24510, + 24511, + 24512, + 24513, + 24514, + 24515, + 24516, + 24517, + 24518, + 24519, + 24520, + 24521, + 24522, + 24523, + 24524, + 24525, + 24526, + 24528, + 24529, + 24530, + 24531, + 24532, + 24534, + 24535, + 24536, + 24537, + 24538, + 24539, + 24540, + 24541, + 24542, + 24543, + 24544, + 24545, + 24546, + 24547, + 24548, + 24549, + 24550, + 24551, + 24552, + 24553, + 24554, + 24555, + 24556, + 24557, + 24558, + 24559, + 24560, + 24561, + 24562, + 24563, + 24564, + 24565, + 24566, + 24567, + 24568, + 24569, + 24570, + 24571, + 24572, + 24573, + 24574, + 24575, + 24576, + 24577, + 24578, + 24579, + 24580, + 24581, + 24582, + 24583, + 24584, + 24585, + 24586, + 24587, + 24588, + 24589, + 24590, + 24591, + 24592, + 24593, + 24594, + 24595, + 24596, + 24597, + 24598, + 24599, + 24600, + 24601, + 24602, + 24603, + 24604, + 24605, + 24606, + 24607, + 24608, + 24609, + 24610, + 24611, + 24612, + 24613, + 24614, + 24615, + 24616, + 24617, + 24618, + 24619, + 24620, + 24621, + 24622, + 24623, + 24624, + 24625, + 24626, + 24627, + 24628, + 24629, + 24630, + 24631, + 24632, + 24633, + 24634, + 24635, + 24636, + 24637, + 24638, + 24639, + 24640, + 24641, + 24642, + 24643, + 24644, + 24645, + 24646, + 24647, + 24648, + 24649, + 24650, + 24651, + 24652, + 24654, + 24655, + 24656, + 24658, + 24659, + 24660, + 24661, + 24662, + 24663, + 24664, + 24665, + 24666, + 24667, + 24668, + 24669, + 24670, + 24671, + 24672, + 24673, + 24674, + 24675, + 24676, + 24677, + 24678, + 24679, + 24680, + 24681, + 24682, + 24683, + 24684, + 24685, + 24686, + 24687, + 24689, + 24690, + 24691, + 24692, + 24693, + 24694, + 24695, + 24696, + 24697, + 24698, + 24699, + 24700, + 24701, + 24702, + 24703, + 24704, + 24705, + 24706, + 24707, + 24708, + 24709, + 24710, + 24711, + 24712, + 24713, + 24714, + 24715, + 24716, + 24717, + 24718, + 24719, + 24720, + 24721, + 24722, + 24723, + 24724, + 24725, + 24726, + 24727, + 24728, + 24729, + 24731, + 24732, + 24733, + 24734, + 24735, + 24736, + 24737, + 24738, + 24739, + 24740, + 24741, + 24742, + 24743, + 24744, + 24745, + 24746, + 24747, + 24748, + 24749, + 24750, + 24751, + 24752, + 24753, + 24754, + 24755, + 24758, + 24759, + 24760, + 24761, + 24762, + 24763, + 24764, + 24765, + 24766, + 24767, + 24768, + 24769, + 24770, + 24771, + 24772, + 24773, + 24774, + 24775, + 24776, + 24777, + 24778, + 24779, + 24780, + 24781, + 24782, + 24783, + 24784, + 24785, + 24786, + 24787, + 24788, + 24789, + 24790, + 24791, + 24792, + 24793, + 24794, + 24795, + 24796, + 24797, + 24798, + 24799, + 24800, + 24801, + 24802, + 24804, + 24805, + 24806, + 24807, + 24808, + 24809, + 24810, + 24811, + 24812, + 24813, + 24814, + 24815, + 24816, + 24817, + 24818, + 24819, + 24820, + 24821, + 24822, + 24823, + 24824, + 24825, + 24826, + 24827, + 24828, + 24829, + 24831, + 24832, + 24833, + 24834, + 24835, + 24836, + 24837, + 24838, + 24839, + 24840, + 24841, + 24842, + 24843, + 24844, + 24846, + 24847, + 24848, + 24849, + 24850, + 24851, + 24852, + 24853, + 24854, + 24855, + 24856, + 24857, + 24858, + 24859, + 24860, + 24861, + 24862, + 24863, + 24864, + 24865, + 24866, + 24867, + 24868, + 24869, + 24870, + 24871, + 24872, + 24873, + 24874, + 24875, + 24876, + 24877, + 24878, + 24879, + 24880, + 24881, + 24882, + 24883, + 24884, + 24885, + 24886, + 24887, + 24888, + 24889, + 24890, + 24891, + 24892, + 24893, + 24894, + 24895, + 24896, + 24897, + 24898, + 24899, + 24900, + 24901, + 24902, + 24903, + 24904, + 24905, + 24906, + 24907, + 24908, + 24909, + 24910, + 24911, + 24912, + 24913, + 24914, + 24915, + 24916, + 24917, + 24918, + 24919, + 24920, + 24921, + 24922, + 24923, + 24924, + 24926, + 24927, + 24928, + 24929, + 24930, + 24931, + 24932, + 24933, + 24934, + 24935, + 24936, + 24937, + 24938, + 24939, + 24940, + 24941, + 24942, + 24943, + 24944, + 24945, + 24946, + 24947, + 24948, + 24949, + 24950, + 24951, + 24952, + 24953, + 24954, + 24955, + 24956, + 24957, + 24958, + 24959, + 24960, + 24961, + 24962, + 24963, + 24964, + 24965, + 24966, + 24967, + 24968, + 24969, + 24970, + 24972, + 24973, + 24974, + 24975, + 24976, + 24977, + 24978, + 24979, + 24980, + 24981, + 24982, + 24983, + 24984, + 24985, + 24986, + 24987, + 24988, + 24989, + 24990, + 24991, + 24992, + 24993, + 24994, + 24995, + 24996, + 24997, + 24998, + 24999, + 25000, + 25001, + 25002, + 25003, + 25004, + 25005, + 25006, + 25007, + 25008, + 25009, + 25010, + 25011, + 25012, + 25013, + 25014, + 25015, + 25016, + 25017, + 25018, + 25019, + 25020, + 25021, + 25022, + 25023, + 25024, + 25025, + 25026, + 25027, + 25028, + 25029, + 25030, + 25031, + 25032, + 25033, + 25034, + 25035, + 25036, + 25037, + 25038, + 25039, + 25040, + 25041, + 25042, + 25043, + 25044, + 25045, + 25046, + 25047, + 25048, + 25049, + 25050, + 25051, + 25052, + 25053, + 25054, + 25055, + 25056, + 25057, + 25058, + 25059, + 25060, + 25061, + 25062, + 25063, + 25064, + 25065, + 25066, + 25067, + 25068, + 25069, + 25070, + 25071, + 25072, + 25073, + 25074, + 25075, + 25076, + 25077, + 25078, + 25079, + 25080, + 25081, + 25082, + 25083, + 25084, + 25085, + 25086, + 25087, + 25088, + 25089, + 25090, + 25091, + 25092, + 25093, + 25094, + 25095, + 25096, + 25097, + 25098, + 25099, + 25100, + 25101, + 25102, + 25103, + 25104, + 25105, + 25106, + 25107, + 25108, + 25109, + 25110, + 25111, + 25112, + 25113, + 25114, + 25115, + 25116, + 25117, + 25118, + 25119, + 25120, + 25121, + 25122, + 25123, + 25124, + 25125, + 25126, + 25127, + 25128, + 25129, + 25130, + 25131, + 25132, + 25133, + 25134, + 25135, + 25136, + 25137, + 25138, + 25139, + 25140, + 25141, + 25142, + 25143, + 25144, + 25145, + 25146, + 25147, + 25148, + 25149, + 25150, + 25151, + 25152, + 25153, + 25154, + 25155, + 25156, + 25157, + 25158, + 25159, + 25160, + 25161, + 25162, + 25163, + 25164, + 25165, + 25166, + 25167, + 25168, + 25169, + 25170, + 25171, + 25172, + 25173, + 25174, + 25175, + 25176, + 25178, + 25179, + 25180, + 25181, + 25182, + 25183, + 25184, + 25185, + 25186, + 25187, + 25188, + 25189, + 25190, + 25191, + 25192, + 25193, + 25194, + 25195, + 25196, + 25197, + 25198, + 25199, + 25200, + 25201, + 25202, + 25203, + 25204, + 25205, + 25206, + 25207, + 25208, + 25209, + 25210, + 25211, + 25212, + 25213, + 25214, + 25215, + 25216, + 25217, + 25218, + 25219, + 25220, + 25221, + 25222, + 25223, + 25224, + 25225, + 25226, + 25227, + 25228, + 25229, + 25230, + 25231, + 25232, + 25233, + 25234, + 25235, + 25236, + 25237, + 25238, + 25239, + 25240, + 25241, + 25242, + 25243, + 25244, + 25245, + 25246, + 25247, + 25248, + 25249, + 25250, + 25251, + 25252, + 25253, + 25254, + 25255, + 25256, + 25257, + 25258, + 25260, + 25261, + 25262, + 25263, + 25264, + 25265, + 25266, + 25267, + 25268, + 25269, + 25270, + 25271, + 25272, + 25273, + 25274, + 25275, + 25276, + 25277, + 25278, + 25279, + 25280, + 25281, + 25282, + 25283, + 25284, + 25285, + 25286, + 25287, + 25288, + 25289, + 25290, + 25291, + 25292, + 25293, + 25294, + 25295, + 25296, + 25297, + 25298, + 25299, + 25300, + 25301, + 25302, + 25303, + 25304, + 25305, + 25306, + 25307, + 25308, + 25309, + 25310, + 25311, + 25312, + 25313, + 25314, + 25315, + 25316, + 25317, + 25318, + 25319, + 25320, + 25321, + 25322, + 25323, + 25324, + 25325, + 25326, + 25327, + 25328, + 25329, + 25330, + 25331, + 25332, + 25333, + 25334, + 25335, + 25336, + 25337, + 25338, + 25339, + 25340, + 25341, + 25342, + 25343, + 25344, + 25345, + 25346, + 25347, + 25348, + 25349, + 25350, + 25351, + 25352, + 25353, + 25354, + 25355, + 25356, + 25357, + 25358, + 25359, + 25360, + 25361, + 25362, + 25363, + 25364, + 25365, + 25366, + 25367, + 25368, + 25369, + 25370, + 25371, + 25372, + 25373, + 25374, + 25375, + 25376, + 25377, + 25378, + 25379, + 25380, + 25381, + 25382, + 25383, + 25385, + 25386, + 25387, + 25388, + 25389, + 25390, + 25391, + 25392, + 25393, + 25394, + 25395, + 25396, + 25397, + 25398, + 25399, + 25400, + 25401, + 25402, + 25403, + 25404, + 25405, + 25406, + 25407, + 25408, + 25409, + 25410, + 25411, + 25412, + 25413, + 25414, + 25415, + 25416, + 25417, + 25418, + 25419, + 25420, + 25421, + 25422, + 25423, + 25424, + 25425, + 25426, + 25427, + 25428, + 25429, + 25430, + 25431, + 25432, + 25433, + 25434, + 25435, + 25436, + 25437, + 25438, + 25440, + 25441, + 25442, + 25444, + 25445, + 25446, + 25447, + 25448, + 25449, + 25450, + 25451, + 25452, + 25453, + 25454, + 25455, + 25456, + 25457, + 25458, + 25460, + 25461, + 25462, + 25463, + 25464, + 25465, + 25466, + 25467, + 25468, + 25469, + 25470, + 25471, + 25472, + 25473, + 25474, + 25475, + 25476, + 25477, + 25478, + 25479, + 25480, + 25481, + 25482, + 25483, + 25484, + 25485, + 25486, + 25487, + 25488, + 25489, + 25490, + 25491, + 25492, + 25493, + 25494, + 25495, + 25496, + 25497, + 25498, + 25499, + 25500, + 25501, + 25502, + 25503, + 25504, + 25505, + 25506, + 25507, + 25508, + 25509, + 25510, + 25511, + 25512, + 25513, + 25514, + 25515, + 25516, + 25517, + 25518, + 25519, + 25520, + 25521, + 25522, + 25523, + 25524, + 25525, + 25526, + 25527, + 25528, + 25529, + 25530, + 25531, + 25533, + 25534, + 25535, + 25536, + 25537, + 25538, + 25539, + 25541, + 25542, + 25543, + 25544, + 25545, + 25546, + 25547, + 25548, + 25549, + 25550, + 25551, + 25553, + 25554, + 25555, + 25556, + 25557, + 25558, + 25559, + 25560, + 25561, + 25562, + 25563, + 25564, + 25565, + 25566, + 25567, + 25568, + 25569, + 25571, + 25572, + 25574, + 25575, + 25576, + 25577, + 25578, + 25579, + 25580, + 25581, + 25582, + 25583, + 25584, + 25585, + 25586, + 25587, + 25588, + 25589, + 25590, + 25591, + 25592, + 25593, + 25594, + 25595, + 25596, + 25597, + 25598, + 25599, + 25600, + 25601, + 25602, + 25603, + 25604, + 25605, + 25606, + 25607, + 25608, + 25609, + 25610, + 25611, + 25612, + 25613, + 25614, + 25615, + 25616, + 25617, + 25618, + 25620, + 25621, + 25623, + 25624, + 25625, + 25626, + 25627, + 25628, + 25629, + 25630, + 25631, + 25632, + 25633, + 25634, + 25635, + 25636, + 25637, + 25638, + 25639, + 25640, + 25641, + 25642, + 25643, + 25644, + 25645, + 25646, + 25647, + 25648, + 25649, + 25650, + 25651, + 25652, + 25653, + 25654, + 25655, + 25656, + 25657, + 25658, + 25659, + 25660, + 25661, + 25662, + 25663, + 25664, + 25665, + 25666, + 25667, + 25668, + 25669, + 25670, + 25671, + 25672, + 25673, + 25674, + 25675, + 25676, + 25677, + 25678, + 25679, + 25680, + 25681, + 25682, + 25683, + 25684, + 25685, + 25686, + 25687, + 25688, + 25689, + 25690, + 25691, + 25692, + 25693, + 25694, + 25695, + 25696, + 25697, + 25698, + 25699, + 25700, + 25701, + 25702, + 25703, + 25704, + 25705, + 25706, + 25707, + 25708, + 25709, + 25710, + 25711, + 25712, + 25713, + 25714, + 25715, + 25716, + 25717, + 25718, + 25719, + 25720, + 25721, + 25722, + 25723, + 25724, + 25725, + 25726, + 25727, + 25728, + 25729, + 25730, + 25731, + 25732, + 25733, + 25734, + 25735, + 25736, + 25737, + 25738, + 25739, + 25740, + 25741, + 25742, + 25743, + 25744, + 25745, + 25746, + 25747, + 25748, + 25749, + 25750, + 25751, + 25752, + 25753, + 25754, + 25755, + 25756, + 25757, + 25758, + 25759, + 25760, + 25761, + 25762, + 25763, + 25765, + 25766, + 25767, + 25768, + 25769, + 25770, + 25771, + 25772, + 25773, + 25774, + 25775, + 25776, + 25777, + 25778, + 25779, + 25780, + 25781, + 25782, + 25783, + 25784, + 25785, + 25786, + 25787, + 25788, + 25789, + 25790, + 25791, + 25792, + 25793, + 25794, + 25795, + 25796, + 25797, + 25798, + 25799, + 25800, + 25801, + 25802, + 25803, + 25804, + 25805, + 25806, + 25807, + 25808, + 25809, + 25810, + 25811, + 25812, + 25813, + 25814, + 25816, + 25817, + 25818, + 25820, + 25821, + 25822, + 25823, + 25824, + 25825, + 25826, + 25827, + 25828, + 25829, + 25830, + 25831, + 25832, + 25833, + 25834, + 25835, + 25836, + 25837, + 25838, + 25839, + 25840, + 25841, + 25842, + 25843, + 25844, + 25845, + 25846, + 25847, + 25848, + 25849, + 25850, + 25851, + 25852, + 25853, + 25854, + 25855, + 25856, + 25857, + 25858, + 25859, + 25860, + 25861, + 25862, + 25863, + 25864, + 25865, + 25866, + 25867, + 25868, + 25869, + 25870, + 25871, + 25872, + 25873, + 25874, + 25875, + 25876, + 25877, + 25878, + 25879, + 25880, + 25881, + 25882, + 25883, + 25884, + 25885, + 25886, + 25887, + 25888, + 25889, + 25890, + 25891, + 25892, + 25893, + 25894, + 25895, + 25896, + 25897, + 25898, + 25899, + 25900, + 25901, + 25902, + 25903, + 25904, + 25905, + 25906, + 25907, + 25908, + 25909, + 25910, + 25911, + 25912, + 25913, + 25914, + 25915, + 25916, + 25917, + 25918, + 25919, + 25920, + 25921, + 25922, + 25923, + 25924, + 25925, + 25926, + 25927, + 25928, + 25929, + 25930, + 25931, + 25932, + 25933, + 25934, + 25935, + 25936, + 25937, + 25938, + 25939, + 25940, + 25941, + 25942, + 25943, + 25944, + 25945, + 25946, + 25947, + 25948, + 25949, + 25950, + 25951, + 25952, + 25953, + 25954, + 25955, + 25956, + 25957, + 25958, + 25959, + 25960, + 25961, + 25962, + 25963, + 25964, + 25965, + 25966, + 25967, + 25968, + 25969, + 25970, + 25971, + 25972, + 25973, + 25974, + 25975, + 25976, + 25977, + 25978, + 25979, + 25980, + 25981, + 25982, + 25983, + 25984, + 25985, + 25986, + 25987, + 25988, + 25989, + 25990, + 25991, + 25992, + 25993, + 25994, + 25995, + 25996, + 25997, + 25998, + 25999, + 26000, + 26001, + 26002, + 26003, + 26004, + 26005, + 26006, + 26007, + 26008, + 26009, + 26010, + 26011, + 26012, + 26013, + 26014, + 26015, + 26016, + 26017, + 26018, + 26019, + 26020, + 26022, + 26023, + 26024, + 26025, + 26026, + 26027, + 26028, + 26029, + 26030, + 26031, + 26032, + 26033, + 26034, + 26035, + 26036, + 26037, + 26038, + 26039, + 26040, + 26041, + 26043, + 26044, + 26045, + 26046, + 26047, + 26048, + 26049, + 26050, + 26051, + 26052, + 26053, + 26054, + 26055, + 26056, + 26057, + 26058, + 26059, + 26060, + 26061, + 26062, + 26063, + 26064, + 26065, + 26066, + 26067, + 26068, + 26069, + 26070, + 26071, + 26072, + 26073, + 26074, + 26075, + 26076, + 26077, + 26078, + 26079, + 26080, + 26081, + 26082, + 26083, + 26084, + 26085, + 26086, + 26087, + 26088, + 26089, + 26090, + 26091, + 26092, + 26093, + 26094, + 26095, + 26096, + 26097, + 26098, + 26099, + 26100, + 26101, + 26102, + 26103, + 26104, + 26105, + 26106, + 26107, + 26108, + 26110, + 26111, + 26112, + 26113, + 26114, + 26115, + 26116, + 26117, + 26118, + 26119, + 26120, + 26121, + 26122, + 26123, + 26124, + 26125, + 26126, + 26127, + 26128, + 26129, + 26130, + 26131, + 26132, + 26133, + 26134, + 26135, + 26136, + 26137, + 26138, + 26139, + 26140, + 26141, + 26142, + 26143, + 26144, + 26145, + 26146, + 26147, + 26148, + 26149, + 26150, + 26151, + 26152, + 26153, + 26154, + 26155, + 26156, + 26157, + 26158, + 26159, + 26160, + 26161, + 26162, + 26163, + 26164, + 26165, + 26166, + 26168, + 26169, + 26170, + 26171, + 26172, + 26173, + 26174, + 26175, + 26176, + 26177, + 26178, + 26179, + 26180, + 26181, + 26182, + 26183, + 26184, + 26185, + 26186, + 26187, + 26188, + 26189, + 26190, + 26191, + 26192, + 26193, + 26194, + 26195, + 26196, + 26197, + 26198, + 26199, + 26200, + 26201, + 26202, + 26203, + 26204, + 26205, + 26206, + 26207, + 26208, + 26209, + 26210, + 26211, + 26212, + 26213, + 26214, + 26215, + 26216, + 26217, + 26218, + 26219, + 26220, + 26221, + 26222, + 26223, + 26224, + 26225, + 26226, + 26228, + 26229, + 26230, + 26231, + 26232, + 26233, + 26234, + 26235, + 26236, + 26237, + 26238, + 26239, + 26240, + 26241, + 26242, + 26243, + 26244, + 26245, + 26246, + 26247, + 26248, + 26249, + 26250, + 26251, + 26252, + 26253, + 26254, + 26255, + 26256, + 26257, + 26258, + 26259, + 26260, + 26261, + 26262, + 26263, + 26264, + 26265, + 26266, + 26267, + 26268, + 26269, + 26270, + 26271, + 26272, + 26273, + 26274, + 26275, + 26276, + 26277, + 26278, + 26279, + 26280, + 26281, + 26282, + 26283, + 26284, + 26285, + 26286, + 26287, + 26288, + 26289, + 26290, + 26291, + 26292, + 26293, + 26294, + 26295, + 26296, + 26297, + 26298, + 26299, + 26300, + 26301, + 26302, + 26303, + 26305, + 26306, + 26307, + 26308, + 26309, + 26310, + 26311, + 26312, + 26313, + 26314, + 26315, + 26316, + 26317, + 26318, + 26319, + 26320, + 26321, + 26322, + 26323, + 26324, + 26325, + 26326, + 26327, + 26328, + 26329, + 26330, + 26331, + 26332, + 26333, + 26334, + 26335, + 26336, + 26337, + 26338, + 26339, + 26340, + 26341, + 26342, + 26343, + 26344, + 26345, + 26346, + 26347, + 26348, + 26349, + 26350, + 26351, + 26352, + 26353, + 26354, + 26356, + 26357, + 26358, + 26359, + 26360, + 26361, + 26362, + 26363, + 26364, + 26365, + 26366, + 26367, + 26368, + 26369, + 26370, + 26372, + 26373, + 26374, + 26375, + 26376, + 26377, + 26378, + 26379, + 26380, + 26381, + 26382, + 26383, + 26384, + 26385, + 26386, + 26387, + 26388, + 26389, + 26390, + 26391, + 26392, + 26393, + 26394, + 26395, + 26397, + 26398, + 26399, + 26400, + 26401, + 26402, + 26403, + 26404, + 26405, + 26406, + 26407, + 26408, + 26409, + 26410, + 26412, + 26413, + 26414, + 26415, + 26416, + 26417, + 26418, + 26419, + 26420, + 26421, + 26422, + 26423, + 26424, + 26425, + 26426, + 26427, + 26428, + 26429, + 26430, + 26431, + 26432, + 26433, + 26434, + 26435, + 26436, + 26437, + 26438, + 26439, + 26440, + 26441, + 26442, + 26443, + 26444, + 26445, + 26446, + 26447, + 26448, + 26449, + 26450, + 26451, + 26452, + 26453, + 26454, + 26455, + 26456, + 26458, + 26459, + 26460, + 26461, + 26462, + 26463, + 26464, + 26465, + 26466, + 26467, + 26468, + 26469, + 26470, + 26471, + 26472, + 26473, + 26474, + 26475, + 26476, + 26477, + 26478, + 26479, + 26480, + 26481, + 26482, + 26483, + 26484, + 26485, + 26486, + 26487, + 26488, + 26489, + 26490, + 26491, + 26492, + 26493, + 26494, + 26495, + 26496, + 26497, + 26498, + 26499, + 26500, + 26501, + 26502, + 26504, + 26505, + 26506, + 26508, + 26509, + 26510, + 26511, + 26512, + 26513, + 26514, + 26515, + 26516, + 26517, + 26518, + 26519, + 26520, + 26522, + 26523, + 26524, + 26525, + 26526, + 26528, + 26529, + 26530, + 26531, + 26532, + 26533, + 26534, + 26535, + 26536, + 26537, + 26538, + 26539, + 26540, + 26541, + 26542, + 26543, + 26544, + 26545, + 26546, + 26547, + 26548, + 26549, + 26550, + 26551, + 26552, + 26553, + 26554, + 26555, + 26556, + 26557, + 26558, + 26559, + 26560, + 26561, + 26562, + 26563, + 26564, + 26565, + 26566, + 26567, + 26568, + 26569, + 26570, + 26571, + 26572, + 26573, + 26574, + 26575, + 26576, + 26577, + 26578, + 26579, + 26580, + 26581, + 26582, + 26583, + 26584, + 26585, + 26586, + 26587, + 26588, + 26589, + 26590, + 26591, + 26592, + 26593, + 26594, + 26595, + 26596, + 26597, + 26598, + 26599, + 26600, + 26601, + 26602, + 26603, + 26604, + 26605, + 26606, + 26607, + 26608, + 26609, + 26610, + 26611, + 26612, + 26613, + 26614, + 26615, + 26616, + 26617, + 26618, + 26620, + 26621, + 26622, + 26623, + 26624, + 26625, + 26626, + 26627, + 26628, + 26629, + 26630, + 26631, + 26632, + 26633, + 26634, + 26635, + 26636, + 26637, + 26638, + 26639, + 26640, + 26641, + 26642, + 26643, + 26644, + 26645, + 26646, + 26647, + 26648, + 26649, + 26650, + 26651, + 26652, + 26653, + 26654, + 26655, + 26656, + 26657, + 26658, + 26659, + 26660, + 26661, + 26662, + 26663, + 26664, + 26665, + 26666, + 26667, + 26668, + 26669, + 26670, + 26671, + 26672, + 26673, + 26674, + 26675, + 26676, + 26677, + 26678, + 26679, + 26680, + 26681, + 26682, + 26683, + 26684, + 26685, + 26686, + 26687, + 26688, + 26689, + 26690, + 26691, + 26692, + 26693, + 26694, + 26695, + 26696, + 26697, + 26698, + 26699, + 26700, + 26701, + 26702, + 26703, + 26704, + 26705, + 26706, + 26707, + 26709, + 26710, + 26711, + 26712, + 26713, + 26714, + 26715, + 26716, + 26717, + 26718, + 26719, + 26720, + 26721, + 26722, + 26723, + 26724, + 26725, + 26726, + 26727, + 26728, + 26729, + 26730, + 26731, + 26732, + 26734, + 26735, + 26736, + 26737, + 26738, + 26739, + 26740, + 26741, + 26742, + 26743, + 26744, + 26745, + 26746, + 26747, + 26748, + 26750, + 26751, + 26752, + 26753, + 26754, + 26755, + 26756, + 26757, + 26758, + 26759, + 26760, + 26761, + 26762, + 26763, + 26764, + 26765, + 26766, + 26767, + 26768, + 26769, + 26770, + 26771, + 26772, + 26773, + 26774, + 26775, + 26776, + 26777, + 26778, + 26779, + 26780, + 26781, + 26782, + 26783, + 26784, + 26785, + 26786, + 26787, + 26788, + 26789, + 26790, + 26791, + 26792, + 26793, + 26794, + 26795, + 26796, + 26797, + 26798, + 26799, + 26800, + 26801, + 26802, + 26803, + 26804, + 26805, + 26806, + 26807, + 26808, + 26809, + 26810, + 26811, + 26812, + 26813, + 26814, + 26815, + 26816, + 26817, + 26818, + 26819, + 26820, + 26821, + 26822, + 26823, + 26824, + 26825, + 26826, + 26827, + 26828, + 26829, + 26830, + 26831, + 26832, + 26833, + 26834, + 26835, + 26836, + 26837, + 26838, + 26839, + 26840, + 26841, + 26842, + 26843, + 26844, + 26845, + 26846, + 26847, + 26848, + 26849, + 26850, + 26851, + 26852, + 26853, + 26854, + 26855, + 26856, + 26857, + 26858, + 26859, + 26860, + 26861, + 26862, + 26863, + 26864, + 26865, + 26866, + 26867, + 26868, + 26869, + 26870, + 26871, + 26872, + 26873, + 26874, + 26875, + 26876, + 26877, + 26878, + 26879, + 26880, + 26881, + 26882, + 26883, + 26885, + 26886, + 26887, + 26888, + 26889, + 26890, + 26891, + 26892, + 26893, + 26894, + 26895, + 26896, + 26897, + 26898, + 26899, + 26900, + 26901, + 26902, + 26903, + 26904, + 26905, + 26906, + 26907, + 26908, + 26909, + 26910, + 26911, + 26912, + 26913, + 26914, + 26915, + 26916, + 26917, + 26918, + 26919, + 26920, + 26921, + 26922, + 26923, + 26924, + 26925, + 26926, + 26927, + 26928, + 26929, + 26930, + 26931, + 26932, + 26933, + 26934, + 26935, + 26936, + 26937, + 26938, + 26939, + 26940, + 26941, + 26942, + 26943, + 26944, + 26945, + 26946, + 26947, + 26948, + 26949, + 26950, + 26951, + 26952, + 26953, + 26954, + 26955, + 26956, + 26957, + 26958, + 26959, + 26960, + 26961, + 26962, + 26963, + 26964, + 26965, + 26966, + 26967, + 26968, + 26969, + 26970, + 26971, + 26972, + 26973, + 26974, + 26975, + 26976, + 26977, + 26978, + 26979, + 26980, + 26981, + 26982, + 26983, + 26984, + 26985, + 26986, + 26987, + 26988, + 26989, + 26990, + 26991, + 26992, + 26993, + 26994, + 26996, + 26997, + 26998, + 26999, + 27000, + 27001, + 27002, + 27003, + 27004, + 27005, + 27006, + 27007, + 27008, + 27009, + 27011, + 27012, + 27013, + 27014, + 27015, + 27016, + 27017, + 27018, + 27019, + 27020, + 27021, + 27022, + 27023, + 27024, + 27025, + 27027, + 27028, + 27029, + 27030, + 27032, + 27033, + 27034, + 27035, + 27036, + 27037, + 27038, + 27039, + 27040, + 27041, + 27042, + 27043, + 27044, + 27045, + 27046, + 27047, + 27048, + 27049, + 27050, + 27051, + 27052, + 27053, + 27054, + 27055, + 27056, + 27057, + 27058, + 27059, + 27060, + 27061, + 27062, + 27063, + 27064, + 27065, + 27066, + 27067, + 27068, + 27069, + 27070, + 27071, + 27072, + 27073, + 27074, + 27075, + 27076, + 27077, + 27078, + 27079, + 27080, + 27081, + 27082, + 27083, + 27084, + 27085, + 27086, + 27087, + 27088, + 27089, + 27090, + 27091, + 27093, + 27094, + 27095, + 27096, + 27097, + 27098, + 27099, + 27100, + 27101, + 27102, + 27103, + 27104, + 27105, + 27106, + 27107, + 27108, + 27109, + 27110, + 27111, + 27112, + 27113, + 27114, + 27115, + 27116, + 27117, + 27118, + 27119, + 27120, + 27121, + 27122, + 27123, + 27124, + 27125, + 27126, + 27127, + 27128, + 27129, + 27130, + 27131, + 27132, + 27133, + 27134, + 27135, + 27136, + 27137, + 27138, + 27139, + 27140, + 27141, + 27142, + 27143, + 27144, + 27145, + 27146, + 27147, + 27148, + 27149, + 27150, + 27151, + 27152, + 27153, + 27154, + 27155, + 27156, + 27157, + 27158, + 27159, + 27160, + 27161, + 27162, + 27163, + 27164, + 27165, + 27166, + 27167, + 27168, + 27169, + 27170, + 27171, + 27172, + 27173, + 27174, + 27175, + 27176, + 27177, + 27178, + 27179, + 27180, + 27182, + 27183, + 27184, + 27185, + 27186, + 27187, + 27188, + 27189, + 27190, + 27191, + 27192, + 27193, + 27194, + 27195, + 27196, + 27198, + 27199, + 27200, + 27201, + 27202, + 27203, + 27204, + 27205, + 27206, + 27207, + 27208, + 27209, + 27210, + 27211, + 27212, + 27213, + 27214, + 27215, + 27216, + 27217, + 27218, + 27219, + 27220, + 27221, + 27222, + 27223, + 27224, + 27225, + 27226, + 27227, + 27228, + 27229, + 27230, + 27231, + 27232, + 27233, + 27234, + 27235, + 27236, + 27237, + 27238, + 27239, + 27240, + 27241, + 27242, + 27243, + 27244, + 27245, + 27246, + 27247, + 27248, + 27249, + 27250, + 27251, + 27252, + 27253, + 27254, + 27255, + 27256, + 27257, + 27258, + 27259, + 27261, + 27262, + 27263, + 27264, + 27265, + 27266, + 27267, + 27268, + 27269, + 27270, + 27271, + 27272, + 27273, + 27274, + 27275, + 27276, + 27277, + 27278, + 27279, + 27280, + 27281, + 27282, + 27283, + 27284, + 27285, + 27286, + 27287, + 27288, + 27289, + 27290, + 27291, + 27292, + 27293, + 27294, + 27295, + 27296, + 27297, + 27298, + 27299, + 27300, + 27301, + 27302, + 27303, + 27304, + 27305, + 27306, + 27307, + 27308, + 27309, + 27310, + 27311, + 27312, + 27313, + 27314, + 27315, + 27316, + 27317, + 27318, + 27319, + 27320, + 27321, + 27322, + 27323, + 27324, + 27326, + 27327, + 27328, + 27330, + 27331, + 27332, + 27333, + 27334, + 27335, + 27336, + 27337, + 27338, + 27339, + 27340, + 27341, + 27342, + 27343, + 27344, + 27345, + 27346, + 27347, + 27348, + 27350, + 27351, + 27352, + 27353, + 27354, + 27355, + 27356, + 27357, + 27358, + 27359, + 27360, + 27361, + 27362, + 27363, + 27364, + 27365, + 27366, + 27367, + 27368, + 27370, + 27371, + 27372, + 27373, + 27374, + 27375, + 27377, + 27378, + 27379, + 27380, + 27381, + 27382, + 27383, + 27384, + 27385, + 27386, + 27387, + 27388, + 27389, + 27390, + 27391, + 27392, + 27393, + 27394, + 27395, + 27396, + 27397, + 27398, + 27399, + 27400, + 27401, + 27402, + 27403, + 27404, + 27405, + 27406, + 27407, + 27408, + 27409, + 27410, + 27411, + 27412, + 27413, + 27414, + 27415, + 27416, + 27417, + 27418, + 27419, + 27420, + 27421, + 27423, + 27424, + 27425, + 27426, + 27427, + 27428, + 27429, + 27430, + 27431, + 27432, + 27433, + 27434, + 27435, + 27436, + 27437, + 27438, + 27439, + 27440, + 27441, + 27442, + 27443, + 27444, + 27445, + 27446, + 27447, + 27448, + 27449, + 27450, + 27451, + 27452, + 27453, + 27454, + 27455, + 27456, + 27457, + 27458, + 27459, + 27460, + 27461, + 27462, + 27463, + 27464, + 27465, + 27466, + 27467, + 27468, + 27469, + 27470, + 27471, + 27472, + 27473, + 27474, + 27475, + 27476, + 27477, + 27478, + 27480, + 27481, + 27482, + 27483, + 27484, + 27485, + 27486, + 27487, + 27488, + 27489, + 27490, + 27491, + 27492, + 27493, + 27494, + 27495, + 27496, + 27497, + 27498, + 27499, + 27500, + 27501, + 27502, + 27503, + 27504, + 27505, + 27506, + 27507, + 27508, + 27509, + 27510, + 27511, + 27512, + 27513, + 27514, + 27515, + 27516, + 27517, + 27518, + 27519, + 27520, + 27521, + 27522, + 27523, + 27524, + 27525, + 27526, + 27527, + 27528, + 27529, + 27530, + 27531, + 27532, + 27533, + 27534, + 27535, + 27536, + 27537, + 27538, + 27539, + 27540, + 27541, + 27542, + 27543, + 27544, + 27545, + 27546, + 27547, + 27548, + 27549, + 27550, + 27551, + 27552, + 27553, + 27554, + 27555, + 27556, + 27557, + 27558, + 27559, + 27560, + 27561, + 27562, + 27563, + 27564, + 27565, + 27566, + 27567, + 27568, + 27569, + 27570, + 27571, + 27573, + 27574, + 27575, + 27576, + 27577, + 27578, + 27579, + 27580, + 27581, + 27582, + 27583, + 27584, + 27585, + 27586, + 27587, + 27588, + 27589, + 27590, + 27591, + 27593, + 27594, + 27595, + 27596, + 27597, + 27598, + 27599, + 27600, + 27601, + 27602, + 27603, + 27604, + 27605, + 27606, + 27607, + 27608, + 27609, + 27610, + 27611, + 27612, + 27613, + 27614, + 27615, + 27616, + 27617, + 27618, + 27619, + 27620, + 27622, + 27623, + 27624, + 27625, + 27626, + 27627, + 27628, + 27629, + 27630, + 27631, + 27632, + 27633, + 27634, + 27635, + 27636, + 27637, + 27638, + 27639, + 27640, + 27641, + 27642, + 27643, + 27644, + 27645, + 27646, + 27647, + 27648, + 27649, + 27650, + 27651, + 27652, + 27653, + 27654, + 27655, + 27656, + 27657, + 27658, + 27659, + 27660, + 27661, + 27662, + 27663, + 27664, + 27665, + 27666, + 27667, + 27668, + 27669, + 27670, + 27671, + 27672, + 27673, + 27674, + 27675, + 27676, + 27677, + 27679, + 27680, + 27681, + 27682, + 27683, + 27684, + 27685, + 27686, + 27687, + 27688, + 27689, + 27690, + 27691, + 27692, + 27693, + 27694, + 27695, + 27696, + 27697, + 27698, + 27699, + 27700, + 27701, + 27702, + 27703, + 27704, + 27705, + 27706, + 27707, + 27708, + 27709, + 27710, + 27711, + 27712, + 27713, + 27714, + 27715, + 27717, + 27718, + 27719, + 27720, + 27721, + 27722, + 27723, + 27724, + 27725, + 27726, + 27727, + 27728, + 27729, + 27730, + 27731, + 27732, + 27733, + 27734, + 27735, + 27736, + 27737, + 27738, + 27739, + 27740, + 27741, + 27742, + 27743, + 27744, + 27745, + 27746, + 27747, + 27748, + 27749, + 27750, + 27751, + 27752, + 27753, + 27754, + 27755, + 27756, + 27757, + 27758, + 27759, + 27760, + 27762, + 27763, + 27764, + 27765, + 27766, + 27767, + 27768, + 27769, + 27770, + 27771, + 27772, + 27773, + 27774, + 27775, + 27776, + 27777, + 27779, + 27780, + 27781, + 27782, + 27783, + 27784, + 27785, + 27786, + 27787, + 27788, + 27789, + 27790, + 27791, + 27792, + 27793, + 27794, + 27795, + 27796, + 27797, + 27798, + 27799, + 27800, + 27801, + 27802, + 27803, + 27804, + 27805, + 27806, + 27807, + 27808, + 27810, + 27811, + 27812, + 27813, + 27814, + 27815, + 27816, + 27817, + 27818, + 27819, + 27820, + 27821, + 27822, + 27823, + 27824, + 27825, + 27826, + 27827, + 27828, + 27829, + 27830, + 27831, + 27832, + 27833, + 27834, + 27835, + 27836, + 27837, + 27838, + 27839, + 27840, + 27841, + 27842, + 27843, + 27844, + 27846, + 27847, + 27849, + 27850, + 27851, + 27852, + 27853, + 27854, + 27855, + 27856, + 27858, + 27859, + 27860, + 27861, + 27862, + 27863, + 27864, + 27865, + 27866, + 27867, + 27868, + 27869, + 27870, + 27871, + 27872, + 27873, + 27874, + 27875, + 27876, + 27877, + 27878, + 27879, + 27880, + 27881, + 27882, + 27883, + 27884, + 27885, + 27886, + 27887, + 27888, + 27889, + 27890, + 27891, + 27892, + 27893, + 27894, + 27895, + 27896, + 27897, + 27898, + 27899, + 27900, + 27901, + 27902, + 27903, + 27904, + 27905, + 27906, + 27907, + 27908, + 27909, + 27910, + 27911, + 27912, + 27913, + 27914, + 27915, + 27916, + 27917, + 27918, + 27919, + 27920, + 27921, + 27922, + 27923, + 27924, + 27925, + 27926, + 27927, + 27928, + 27929, + 27930, + 27931, + 27933, + 27934, + 27935, + 27936, + 27937, + 27938, + 27939, + 27940, + 27941, + 27942, + 27943, + 27944, + 27945, + 27946, + 27947, + 27948, + 27949, + 27950, + 27951, + 27952, + 27953, + 27955, + 27956, + 27957, + 27958, + 27959, + 27960, + 27961, + 27962, + 27963, + 27964, + 27965, + 27966, + 27967, + 27968, + 27969, + 27970, + 27971, + 27972, + 27973, + 27974, + 27975, + 27976, + 27977, + 27978, + 27979, + 27980, + 27981, + 27982, + 27983, + 27984, + 27985, + 27986, + 27987, + 27988, + 27989, + 27990, + 27991, + 27992, + 27993, + 27994, + 27995, + 27996, + 27997, + 27998, + 27999, + 28000, + 28001, + 28002, + 28005, + 28006, + 28007, + 28008, + 28009, + 28010, + 28011, + 28012, + 28013, + 28014, + 28015, + 28016, + 28017, + 28018, + 28019, + 28020, + 28021, + 28022, + 28023, + 28024, + 28025, + 28026, + 28027, + 28028, + 28029, + 28030, + 28031, + 28032, + 28033, + 28034, + 28035, + 28036, + 28037, + 28038, + 28039, + 28040, + 28041, + 28042, + 28043, + 28044, + 28045, + 28046, + 28047, + 28048, + 28049, + 28050, + 28051, + 28052, + 28053, + 28054, + 28055, + 28056, + 28057, + 28058, + 28059, + 28060, + 28061, + 28062, + 28063, + 28064, + 28065, + 28066, + 28067, + 28068, + 28069, + 28070, + 28071, + 28072, + 28073, + 28074, + 28075, + 28076, + 28077, + 28078, + 28079, + 28080, + 28081, + 28082, + 28083, + 28084, + 28085, + 28086, + 28087, + 28088, + 28089, + 28090, + 28091, + 28092, + 28093, + 28094, + 28095, + 28096, + 28097, + 28098, + 28099, + 28100, + 28101, + 28102, + 28103, + 28104, + 28105, + 28106, + 28107, + 28108, + 28109, + 28110, + 28111, + 28112, + 28113, + 28114, + 28115, + 28116, + 28117, + 28118, + 28119, + 28120, + 28121, + 28122, + 28123, + 28124, + 28125, + 28126, + 28127, + 28128, + 28129, + 28130, + 28131, + 28132, + 28133, + 28134, + 28135, + 28136, + 28137, + 28138, + 28139, + 28140, + 28141, + 28142, + 28143, + 28144, + 28145, + 28146, + 28147, + 28148, + 28149, + 28150, + 28151, + 28152, + 28153, + 28154, + 28155, + 28156, + 28157, + 28158, + 28159, + 28160, + 28161, + 28162, + 28163, + 28164, + 28165, + 28166, + 28167, + 28168, + 28169, + 28170, + 28171, + 28172, + 28173, + 28175, + 28176, + 28177, + 28178, + 28179, + 28180, + 28181, + 28182, + 28183, + 28184, + 28185, + 28186, + 28187, + 28188, + 28189, + 28190, + 28191, + 28192, + 28193, + 28194, + 28195, + 28196, + 28197, + 28198, + 28199, + 28200, + 28201, + 28202, + 28203, + 28205, + 28206, + 28207, + 28209, + 28210, + 28211, + 28212, + 28213, + 28214, + 28215, + 28216, + 28217, + 28218, + 28219, + 28220, + 28221, + 28222, + 28223, + 28224, + 28225, + 28226, + 28227, + 28228, + 28229, + 28231, + 28232, + 28233, + 28234, + 28235, + 28236, + 28237, + 28238, + 28239, + 28240, + 28241, + 28243, + 28244, + 28245, + 28246, + 28247, + 28248, + 28249, + 28251, + 28252, + 28253, + 28254, + 28255, + 28256, + 28257, + 28258, + 28259, + 28260, + 28261, + 28262, + 28263, + 28265, + 28266, + 28267, + 28268, + 28269, + 28270, + 28271, + 28272, + 28273, + 28274, + 28275, + 28276, + 28277, + 28279, + 28280, + 28281, + 28282, + 28283, + 28284, + 28285, + 28286, + 28287, + 28288, + 28289, + 28290, + 28291, + 28292, + 28293, + 28294, + 28295, + 28296, + 28297, + 28298, + 28299, + 28301, + 28302, + 28303, + 28304, + 28305, + 28306, + 28307, + 28308, + 28309, + 28310, + 28311, + 28312, + 28313, + 28314, + 28315, + 28316, + 28317, + 28318, + 28319, + 28320, + 28321, + 28322, + 28323, + 28324, + 28325, + 28326, + 28327, + 28328, + 28329, + 28330, + 28332, + 28334, + 28335, + 28336, + 28337, + 28338, + 28339, + 28341, + 28343, + 28344, + 28345, + 28346, + 28347, + 28348, + 28349, + 28350, + 28351, + 28352, + 28353, + 28354, + 28355, + 28356, + 28357, + 28358, + 28359, + 28360, + 28361, + 28362, + 28363, + 28364, + 28365, + 28366, + 28368, + 28369, + 28370, + 28371, + 28372, + 28373, + 28374, + 28375, + 28376, + 28377, + 28378, + 28379, + 28380, + 28381, + 28382, + 28383, + 28384, + 28385, + 28386, + 28387, + 28388, + 28389, + 28390, + 28391, + 28392, + 28393, + 28394, + 28395, + 28396, + 28397, + 28398, + 28399, + 28400, + 28401, + 28402, + 28403, + 28404, + 28405, + 28406, + 28407, + 28408, + 28409, + 28410, + 28411, + 28412, + 28413, + 28414, + 28415, + 28417, + 28418, + 28419, + 28420, + 28421, + 28422, + 28423, + 28424, + 28425, + 28426, + 28427, + 28428, + 28429, + 28430, + 28431, + 28432, + 28433, + 28434, + 28435, + 28437, + 28438, + 28439, + 28440, + 28441, + 28442, + 28443, + 28444, + 28445, + 28446, + 28447, + 28448, + 28449, + 28450, + 28451, + 28452, + 28453, + 28454, + 28455, + 28456, + 28457, + 28458, + 28459, + 28460, + 28461, + 28462, + 28463, + 28464, + 28465, + 28466, + 28467, + 28468, + 28469, + 28470, + 28471, + 28472, + 28473, + 28475, + 28476, + 28477, + 28478, + 28479, + 28480, + 28482, + 28483, + 28484, + 28485, + 28486, + 28487, + 28488, + 28489, + 28490, + 28491, + 28492, + 28493, + 28495, + 28496, + 28497, + 28498, + 28499, + 28500, + 28501, + 28502, + 28503, + 28504, + 28505, + 28506, + 28507, + 28508, + 28509, + 28510, + 28511, + 28512, + 28513, + 28514, + 28515, + 28516, + 28517, + 28518, + 28519, + 28520, + 28521, + 28522, + 28523, + 28524, + 28525, + 28526, + 28527, + 28528, + 28529, + 28530, + 28531, + 28532, + 28533, + 28534, + 28535, + 28536, + 28537, + 28538, + 28539, + 28540, + 28541, + 28542, + 28543, + 28544, + 28545, + 28546, + 28547, + 28548, + 28549, + 28550, + 28551, + 28552, + 28553, + 28554, + 28555, + 28556, + 28557, + 28558, + 28559, + 28560, + 28561, + 28562, + 28563, + 28564, + 28565, + 28566, + 28567, + 28568, + 28569, + 28570, + 28571, + 28572, + 28573, + 28574, + 28575, + 28576, + 28577, + 28578, + 28579, + 28580, + 28581, + 28582, + 28583, + 28584, + 28585, + 28586, + 28587, + 28588, + 28589, + 28590, + 28591, + 28592, + 28593, + 28594, + 28595, + 28596, + 28597, + 28599, + 28600, + 28601, + 28602, + 28603, + 28604, + 28605, + 28606, + 28607, + 28608, + 28609, + 28610, + 28611, + 28612, + 28613, + 28614, + 28615, + 28616, + 28617, + 28618, + 28619, + 28620, + 28621, + 28622, + 28623, + 28624, + 28625, + 28626, + 28627, + 28628, + 28629, + 28630, + 28631, + 28632, + 28633, + 28634, + 28635, + 28636, + 28637, + 28638, + 28639, + 28640, + 28641, + 28642, + 28643, + 28644, + 28645, + 28646, + 28647, + 28648, + 28649, + 28650, + 28651, + 28652, + 28653, + 28654, + 28655, + 28656, + 28657, + 28658, + 28659, + 28660, + 28661, + 28662, + 28663, + 28664, + 28665, + 28666, + 28667, + 28668, + 28669, + 28670, + 28671, + 28672, + 28673, + 28674, + 28675, + 28676, + 28677, + 28678, + 28679, + 28680, + 28681, + 28682, + 28683, + 28684, + 28685, + 28686, + 28687, + 28688, + 28689, + 28690, + 28691, + 28692, + 28693, + 28694, + 28695, + 28696, + 28697, + 28698, + 28699, + 28700, + 28701, + 28702, + 28703, + 28704, + 28705, + 28706, + 28707, + 28708, + 28709, + 28710, + 28711, + 28712, + 28713, + 28714, + 28715, + 28716, + 28717, + 28718, + 28719, + 28720, + 28721, + 28722, + 28723, + 28724, + 28725, + 28726, + 28727, + 28728, + 28729, + 28730, + 28731, + 28732, + 28733, + 28734, + 28735, + 28736, + 28737, + 28738, + 28740, + 28741, + 28742, + 28743, + 28744, + 28745, + 28746, + 28747, + 28748, + 28749, + 28750, + 28751, + 28752, + 28753, + 28754, + 28755, + 28756, + 28757, + 28758, + 28759, + 28760, + 28761, + 28762, + 28763, + 28764, + 28765, + 28766, + 28767, + 28768, + 28769, + 28770, + 28771, + 28772, + 28773, + 28774, + 28775, + 28776, + 28777, + 28778, + 28779, + 28780, + 28781, + 28782, + 28783, + 28784, + 28785, + 28786, + 28787, + 28788, + 28789, + 28790, + 28791, + 28793, + 28794, + 28795, + 28796, + 28797, + 28798, + 28799, + 28800, + 28801, + 28802, + 28803, + 28804, + 28805, + 28806, + 28807, + 28808, + 28809, + 28810, + 28811, + 28812, + 28813, + 28814, + 28815, + 28816, + 28817, + 28818, + 28819, + 28821, + 28822, + 28823, + 28824, + 28825, + 28826, + 28827, + 28828, + 28829, + 28830, + 28831, + 28832, + 28833, + 28834, + 28835, + 28836, + 28837, + 28838, + 28839, + 28840, + 28841, + 28842, + 28843, + 28844, + 28845, + 28846, + 28847, + 28848, + 28849, + 28850, + 28851, + 28852, + 28853, + 28854, + 28855, + 28856, + 28857, + 28858, + 28859, + 28860, + 28861, + 28862, + 28863, + 28864, + 28865, + 28866, + 28868, + 28869, + 28870, + 28871, + 28872, + 28873, + 28874, + 28875, + 28876, + 28877, + 28878, + 28879, + 28880, + 28881, + 28882, + 28883, + 28884, + 28885, + 28886, + 28887, + 28888, + 28889, + 28890, + 28891, + 28892, + 28893, + 28894, + 28895, + 28896, + 28897, + 28898, + 28899, + 28900, + 28901, + 28902, + 28903, + 28904, + 28905, + 28906, + 28907, + 28908, + 28909, + 28910, + 28911, + 28912, + 28913, + 28914, + 28915, + 28916, + 28917, + 28918, + 28919, + 28920, + 28921, + 28922, + 28923, + 28924, + 28925, + 28926, + 28927, + 28928, + 28929, + 28930, + 28931, + 28932, + 28933, + 28934, + 28935, + 28936, + 28937, + 28938, + 28939, + 28940, + 28941, + 28942, + 28943, + 28944, + 28945, + 28946, + 28948, + 28949, + 28950, + 28951, + 28952, + 28954, + 28955, + 28956, + 28957, + 28958, + 28959, + 28960, + 28961, + 28962, + 28963, + 28965, + 28966, + 28967, + 28968, + 28969, + 28970, + 28971, + 28972, + 28973, + 28974, + 28975, + 28976, + 28977, + 28978, + 28979, + 28980, + 28981, + 28982, + 28983, + 28984, + 28985, + 28986, + 28987, + 28988, + 28989, + 28990, + 28992, + 28993, + 28994, + 28995, + 28996, + 28997, + 28998, + 28999, + 29000, + 29001, + 29002, + 29003, + 29004, + 29005, + 29006, + 29007, + 29008, + 29009, + 29010, + 29011, + 29012, + 29013, + 29014, + 29015, + 29016, + 29017, + 29018, + 29019, + 29020, + 29021, + 29022, + 29023, + 29024, + 29025, + 29026, + 29027, + 29028, + 29029, + 29030, + 29031, + 29032, + 29033, + 29034, + 29035, + 29036, + 29037, + 29038, + 29039, + 29040, + 29041, + 29042, + 29043, + 29044, + 29045, + 29046, + 29047, + 29048, + 29049, + 29050, + 29051, + 29052, + 29054, + 29055, + 29056, + 29057, + 29058, + 29059, + 29060, + 29061, + 29062, + 29063, + 29064, + 29065, + 29066, + 29067, + 29068, + 29069, + 29070, + 29071, + 29072, + 29073, + 29074, + 29075, + 29076, + 29077, + 29078, + 29079, + 29080, + 29081, + 29082, + 29083, + 29084, + 29085, + 29086, + 29087, + 29088, + 29089, + 29090, + 29091, + 29092, + 29093, + 29094, + 29095, + 29096, + 29097, + 29099, + 29100, + 29101, + 29102, + 29103, + 29104, + 29105, + 29106, + 29107, + 29108, + 29109, + 29110, + 29111, + 29112, + 29113, + 29114, + 29115, + 29116, + 29117, + 29118, + 29119, + 29120, + 29121, + 29122, + 29123, + 29124, + 29125, + 29126, + 29127, + 29128, + 29129, + 29130, + 29131, + 29132, + 29133, + 29134, + 29135, + 29136, + 29137, + 29138, + 29139, + 29140, + 29141, + 29142, + 29143, + 29144, + 29145, + 29146, + 29147, + 29148, + 29149, + 29150, + 29151, + 29152, + 29153, + 29154, + 29155, + 29156, + 29157, + 29158, + 29159, + 29160, + 29161, + 29162, + 29163, + 29164, + 29165, + 29166, + 29167, + 29168, + 29169, + 29170, + 29171, + 29172, + 29173, + 29174, + 29175, + 29176, + 29177, + 29178, + 29179, + 29180, + 29181, + 29183, + 29184, + 29185, + 29186, + 29187, + 29188, + 29190, + 29191, + 29192, + 29193, + 29194, + 29195, + 29196, + 29197, + 29198, + 29199, + 29200, + 29201, + 29202, + 29203, + 29204, + 29205, + 29206, + 29207, + 29208, + 29209, + 29210, + 29211, + 29212, + 29213, + 29214, + 29215, + 29216, + 29217, + 29219, + 29220, + 29221, + 29222, + 29223, + 29224, + 29225, + 29226, + 29227, + 29228, + 29229, + 29230, + 29231, + 29232, + 29233, + 29234, + 29235, + 29236, + 29237, + 29238, + 29239, + 29240, + 29241, + 29242, + 29243, + 29244, + 29245, + 29246, + 29247, + 29248, + 29249, + 29250, + 29251, + 29252, + 29253, + 29254, + 29255, + 29256, + 29257, + 29258, + 29259, + 29260, + 29261, + 29262, + 29263, + 29264, + 29265, + 29266, + 29267, + 29268, + 29269, + 29270, + 29271, + 29272, + 29273, + 29274, + 29275, + 29276, + 29277, + 29278, + 29279, + 29280, + 29281, + 29282, + 29283, + 29284, + 29285, + 29286, + 29287, + 29288, + 29289, + 29290, + 29291, + 29292, + 29293, + 29294, + 29295, + 29296, + 29297, + 29298, + 29299, + 29300, + 29301, + 29302, + 29303, + 29304, + 29305, + 29306, + 29307, + 29308, + 29309, + 29310, + 29311, + 29312, + 29313, + 29314, + 29315, + 29316, + 29317, + 29318, + 29319, + 29320, + 29321, + 29322, + 29323, + 29324, + 29325, + 29326, + 29327, + 29328, + 29329, + 29330, + 29331, + 29332, + 29333, + 29334, + 29335, + 29336, + 29337, + 29338, + 29339, + 29340, + 29341, + 29342, + 29343, + 29344, + 29345, + 29346, + 29347, + 29348, + 29349, + 29350, + 29351, + 29352, + 29353, + 29354, + 29355, + 29356, + 29357, + 29358, + 29359, + 29360, + 29361, + 29362, + 29363, + 29364, + 29365, + 29367, + 29368, + 29369, + 29370, + 29371, + 29372, + 29373, + 29374, + 29375, + 29376, + 29377, + 29378, + 29379, + 29380, + 29381, + 29382, + 29384, + 29385, + 29386, + 29387, + 29388, + 29389, + 29390, + 29391, + 29392, + 29393, + 29394, + 29395, + 29396, + 29397, + 29398, + 29399, + 29400, + 29401, + 29402, + 29403, + 29404, + 29405, + 29406, + 29407, + 29408, + 29409, + 29410, + 29411, + 29412, + 29413, + 29414, + 29415, + 29416, + 29417, + 29418, + 29419, + 29420, + 29421, + 29422, + 29423, + 29424, + 29425, + 29426, + 29427, + 29428, + 29429, + 29430, + 29431, + 29432, + 29433, + 29434, + 29435, + 29436, + 29437, + 29438, + 29439, + 29440, + 29442, + 29443, + 29444, + 29445, + 29446, + 29447, + 29448, + 29449, + 29450, + 29451, + 29452, + 29453, + 29454, + 29455, + 29456, + 29457, + 29458, + 29459, + 29460, + 29461, + 29462, + 29463, + 29464, + 29465, + 29466, + 29467, + 29468, + 29469, + 29470, + 29471, + 29472, + 29473, + 29474, + 29475, + 29476, + 29477, + 29478, + 29479, + 29480, + 29481, + 29482, + 29483, + 29484, + 29485, + 29486, + 29487, + 29488, + 29489, + 29490, + 29491, + 29492, + 29493, + 29494, + 29495, + 29496, + 29497, + 29498, + 29499, + 29500, + 29501, + 29502, + 29503, + 29504, + 29505, + 29506, + 29507, + 29508, + 29510, + 29511, + 29512, + 29513, + 29514, + 29515, + 29516, + 29517, + 29518, + 29519, + 29520, + 29521, + 29522, + 29523, + 29524, + 29525, + 29526, + 29527, + 29528, + 29529, + 29530, + 29531, + 29532, + 29533, + 29534, + 29535, + 29537, + 29538, + 29539, + 29540, + 29541, + 29542, + 29543, + 29544, + 29545, + 29546, + 29547, + 29548, + 29549, + 29550, + 29551, + 29552, + 29553, + 29554, + 29555, + 29556, + 29557, + 29558, + 29559, + 29560, + 29561, + 29562, + 29563, + 29564, + 29565, + 29566, + 29567, + 29568, + 29569, + 29570, + 29571, + 29572, + 29573, + 29574, + 29575, + 29576, + 29577, + 29578, + 29579, + 29580, + 29581, + 29582, + 29583, + 29584, + 29585, + 29586, + 29587, + 29588, + 29589, + 29590, + 29591, + 29592, + 29593, + 29594, + 29595, + 29596, + 29597, + 29598, + 29599, + 29600, + 29601, + 29602, + 29603, + 29604, + 29605, + 29606, + 29607, + 29608, + 29609, + 29610, + 29611, + 29612, + 29613, + 29614, + 29615, + 29616, + 29617, + 29618, + 29619, + 29620, + 29621, + 29622, + 29623, + 29624, + 29625, + 29626, + 29627, + 29628, + 29629, + 29630, + 29631, + 29632, + 29633, + 29634, + 29635, + 29636, + 29637, + 29638, + 29639, + 29640, + 29641, + 29642, + 29643, + 29644, + 29645, + 29646, + 29647, + 29648, + 29649, + 29650, + 29651, + 29652, + 29653, + 29654, + 29655, + 29656, + 29657, + 29658, + 29659, + 29660, + 29661, + 29662, + 29663, + 29664, + 29665, + 29666, + 29667, + 29668, + 29669, + 29670, + 29671, + 29672, + 29673, + 29674, + 29675, + 29676, + 29677, + 29678, + 29679, + 29680, + 29681, + 29682, + 29683, + 29684, + 29685, + 29686, + 29687, + 29689, + 29690, + 29691, + 29692, + 29693, + 29694, + 29695, + 29696, + 29697, + 29698, + 29699, + 29700, + 29701, + 29702, + 29703, + 29704, + 29705, + 29706, + 29707, + 29708, + 29709, + 29710, + 29711, + 29712, + 29713, + 29714, + 29715, + 29716, + 29717, + 29718, + 29719, + 29720, + 29721, + 29722, + 29723, + 29724, + 29725, + 29726, + 29727, + 29728, + 29729, + 29730, + 29731, + 29732, + 29733, + 29734, + 29735, + 29736, + 29737, + 29738, + 29739, + 29740, + 29741, + 29742, + 29743, + 29744, + 29745, + 29746, + 29747, + 29748, + 29749, + 29750, + 29751, + 29752, + 29753, + 29754, + 29755, + 29756, + 29757, + 29758, + 29759, + 29760, + 29761, + 29762, + 29763, + 29764, + 29765, + 29766, + 29767, + 29768, + 29769, + 29770, + 29771, + 29772, + 29773, + 29774, + 29775, + 29776, + 29777, + 29778, + 29779, + 29780, + 29781, + 29782, + 29783, + 29784, + 29785, + 29786, + 29787, + 29788, + 29789, + 29790, + 29791, + 29792, + 29793, + 29794, + 29795, + 29796, + 29797, + 29798, + 29799, + 29800, + 29801, + 29802, + 29803, + 29804, + 29805, + 29806, + 29807, + 29808, + 29809, + 29810, + 29811, + 29812, + 29813, + 29814, + 29815, + 29816, + 29817, + 29818, + 29819, + 29820, + 29821, + 29822, + 29824, + 29825, + 29826, + 29827, + 29828, + 29829, + 29830, + 29831, + 29833, + 29834, + 29835, + 29836, + 29838, + 29839, + 29840, + 29841, + 29842, + 29843, + 29844, + 29845, + 29846, + 29847, + 29848, + 29849, + 29850, + 29851, + 29852, + 29853, + 29854, + 29855, + 29856, + 29857, + 29858, + 29859, + 29860, + 29861, + 29863, + 29864, + 29865, + 29867, + 29868, + 29869, + 29870, + 29871, + 29872, + 29873, + 29874, + 29875, + 29876, + 29877, + 29878, + 29879, + 29880, + 29881, + 29882, + 29883, + 29884, + 29885, + 29886, + 29887, + 29888, + 29889, + 29891, + 29892, + 29893, + 29894, + 29895, + 29896, + 29898, + 29899, + 29900, + 29901, + 29902, + 29903, + 29904, + 29905, + 29906, + 29907, + 29908, + 29909, + 29910, + 29911, + 29912, + 29913, + 29914, + 29915, + 29916, + 29917, + 29918, + 29919, + 29920, + 29921, + 29922, + 29923, + 29924, + 29925, + 29926, + 29927, + 29928, + 29929, + 29930, + 29931, + 29932, + 29933, + 29934, + 29935, + 29936, + 29937, + 29938, + 29939, + 29940, + 29941, + 29942, + 29943, + 29945, + 29946, + 29947, + 29948, + 29949, + 29950, + 29951, + 29952, + 29953, + 29954, + 29955, + 29956, + 29957, + 29958, + 29959, + 29960, + 29961, + 29962, + 29964, + 29965, + 29966, + 29967, + 29968, + 29969, + 29970, + 29971, + 29972, + 29973, + 29974, + 29975, + 29976, + 29977, + 29978, + 29979, + 29980, + 29981, + 29982, + 29983, + 29984, + 29985, + 29986, + 29987, + 29988, + 29989, + 29990, + 29991, + 29992, + 29993, + 29994, + 29995, + 29996, + 29997, + 29998, + 29999, + 30000, + 30001, + 30002, + 30004, + 30005, + 30006, + 30007, + 30008, + 30009, + 30010, + 30011, + 30012, + 30013, + 30014, + 30015, + 30016, + 30017, + 30018, + 30019, + 30020, + 30021, + 30022, + 30023, + 30024, + 30025, + 30026, + 30027, + 30028, + 30029, + 30030, + 30031, + 30032, + 30033, + 30034, + 30035, + 30036, + 30037, + 30038, + 30039, + 30040, + 30041, + 30042, + 30043, + 30044, + 30045, + 30046, + 30047, + 30048, + 30049, + 30050, + 30051, + 30052, + 30053, + 30054, + 30055, + 30056, + 30057, + 30058, + 30059, + 30060, + 30061, + 30062, + 30063, + 30064, + 30065, + 30066, + 30067, + 30068, + 30069, + 30070, + 30071, + 30072, + 30073, + 30074, + 30075, + 30076, + 30077, + 30078, + 30079, + 30080, + 30081, + 30083, + 30084, + 30085, + 30086, + 30087, + 30088, + 30089, + 30090, + 30091, + 30092, + 30093, + 30094, + 30095, + 30097, + 30098, + 30099, + 30100, + 30101, + 30102, + 30103, + 30105, + 30106, + 30107, + 30108, + 30109, + 30110, + 30111, + 30112, + 30113, + 30114, + 30115, + 30116, + 30117, + 30118, + 30119, + 30120, + 30121, + 30122, + 30124, + 30125, + 30126, + 30127, + 30128, + 30129, + 30130, + 30131, + 30132, + 30133, + 30134, + 30135, + 30136, + 30137, + 30138, + 30139, + 30140, + 30141, + 30142, + 30143, + 30144, + 30145, + 30146, + 30147, + 30148, + 30149, + 30150, + 30151, + 30152, + 30153, + 30154, + 30155, + 30156, + 30157, + 30158, + 30159, + 30160, + 30161, + 30162, + 30163, + 30164, + 30165, + 30166, + 30167, + 30168, + 30169, + 30171, + 30172, + 30173, + 30174, + 30175, + 30176, + 30177, + 30178, + 30179, + 30180, + 30181, + 30182, + 30183, + 30184, + 30185, + 30186, + 30187, + 30188, + 30189, + 30190, + 30191, + 30192, + 30193, + 30194, + 30195, + 30196, + 30197, + 30198, + 30199, + 30200, + 30201, + 30202, + 30203, + 30204, + 30205, + 30206, + 30207, + 30208, + 30209, + 30210, + 30211, + 30212, + 30213, + 30215, + 30216, + 30217, + 30218, + 30219, + 30220, + 30221, + 30222, + 30223, + 30224, + 30225, + 30226, + 30227, + 30228, + 30229, + 30230, + 30231, + 30232, + 30233, + 30234, + 30235, + 30236, + 30237, + 30238, + 30239, + 30240, + 30241, + 30242, + 30243, + 30244, + 30245, + 30246, + 30247, + 30248, + 30249, + 30250, + 30251, + 30252, + 30253, + 30254, + 30255, + 30256, + 30257, + 30258, + 30259, + 30260, + 30261, + 30262, + 30263, + 30264, + 30265, + 30266, + 30267, + 30268, + 30269, + 30270, + 30271, + 30272, + 30273, + 30274, + 30275, + 30276, + 30277, + 30278, + 30279, + 30280, + 30281, + 30282, + 30283, + 30284, + 30285, + 30286, + 30287, + 30288, + 30289, + 30290, + 30291, + 30292, + 30293, + 30294, + 30295, + 30296, + 30297, + 30298, + 30299, + 30300, + 30301, + 30302, + 30303, + 30304, + 30305, + 30306, + 30307, + 30308, + 30309, + 30310, + 30311, + 30312, + 30313, + 30314, + 30315, + 30316, + 30317, + 30318, + 30319, + 30320, + 30321, + 30322, + 30323, + 30324, + 30325, + 30326, + 30327, + 30328, + 30329, + 30330, + 30331, + 30332, + 30333, + 30334, + 30335, + 30336, + 30337, + 30338, + 30339, + 30340, + 30341, + 30342, + 30343, + 30344, + 30345, + 30346, + 30347, + 30348, + 30349, + 30350, + 30351, + 30352, + 30353, + 30354, + 30355, + 30356, + 30357, + 30358, + 30359, + 30360, + 30361, + 30362, + 30363, + 30364, + 30365, + 30366, + 30367, + 30368, + 30369, + 30370, + 30371, + 30372, + 30373, + 30374, + 30375, + 30376, + 30378, + 30379, + 30381, + 30382, + 30383, + 30384, + 30385, + 30386, + 30387, + 30388, + 30389, + 30390, + 30391, + 30392, + 30393, + 30394, + 30395, + 30396, + 30397, + 30398, + 30399, + 30400, + 30401, + 30402, + 30403, + 30404, + 30405, + 30406, + 30407, + 30408, + 30409, + 30410, + 30411, + 30412, + 30413, + 30415, + 30416, + 30417, + 30418, + 30419, + 30420, + 30421, + 30422, + 30423, + 30424, + 30425, + 30426, + 30427, + 30428, + 30429, + 30430, + 30431, + 30432, + 30433, + 30434, + 30435, + 30436, + 30437, + 30438, + 30439, + 30440, + 30441, + 30442, + 30443, + 30444, + 30445, + 30446, + 30447, + 30448, + 30449, + 30450, + 30451, + 30452, + 30453, + 30454, + 30455, + 30456, + 30457, + 30458, + 30459, + 30460, + 30461, + 30462, + 30463, + 30464, + 30465, + 30466, + 30467, + 30469, + 30470, + 30471, + 30472, + 30473, + 30474, + 30475, + 30476, + 30477, + 30479, + 30480, + 30481, + 30482, + 30483, + 30484, + 30485, + 30486, + 30487, + 30488, + 30489, + 30490, + 30491, + 30492, + 30493, + 30494, + 30495, + 30496, + 30497, + 30498, + 30499, + 30500, + 30501, + 30502, + 30503, + 30504, + 30505, + 30506, + 30507, + 30508, + 30509, + 30511, + 30512, + 30513, + 30514, + 30515, + 30516, + 30517, + 30518, + 30519, + 30520, + 30521, + 30522, + 30523, + 30524, + 30525, + 30526, + 30527, + 30528, + 30529, + 30530, + 30531, + 30532, + 30533, + 30534, + 30535, + 30536, + 30538, + 30539, + 30540, + 30541, + 30542, + 30543, + 30544, + 30545, + 30546, + 30547, + 30548, + 30549, + 30550, + 30551, + 30552, + 30553, + 30554, + 30555, + 30556, + 30557, + 30558, + 30559, + 30560, + 30561, + 30562, + 30563, + 30564, + 30565, + 30566, + 30567, + 30568, + 30569, + 30570, + 30571, + 30572, + 30573, + 30574, + 30575, + 30576, + 30577, + 30578, + 30579, + 30580, + 30581, + 30582, + 30583, + 30584, + 30585, + 30586, + 30587, + 30588, + 30589, + 30590, + 30591, + 30592, + 30593, + 30594, + 30595, + 30596, + 30597, + 30598, + 30599, + 30600, + 30601, + 30602, + 30603, + 30604, + 30605, + 30606, + 30607, + 30608, + 30609, + 30610, + 30611, + 30612, + 30613, + 30614, + 30615, + 30616, + 30617, + 30618, + 30619, + 30620, + 30621, + 30622, + 30623, + 30624, + 30626, + 30627, + 30628, + 30629, + 30630, + 30631, + 30632, + 30633, + 30634, + 30635, + 30636, + 30637, + 30638, + 30639, + 30640, + 30641, + 30642, + 30643, + 30644, + 30645, + 30646, + 30648, + 30649, + 30650, + 30651, + 30652, + 30653, + 30654, + 30655, + 30656, + 30657, + 30658, + 30659, + 30660, + 30661, + 30662, + 30663, + 30664, + 30665, + 30667, + 30668, + 30669, + 30670, + 30671, + 30672, + 30673, + 30674, + 30675, + 30676, + 30677, + 30678, + 30679, + 30680, + 30681, + 30682, + 30683, + 30684, + 30685, + 30686, + 30687, + 30688, + 30689, + 30690, + 30691, + 30692, + 30693, + 30694, + 30695, + 30696, + 30697, + 30698, + 30699, + 30700, + 30701, + 30702, + 30703, + 30704, + 30705, + 30706, + 30707, + 30708, + 30709, + 30710, + 30711, + 30712, + 30713, + 30714, + 30715, + 30716, + 30717, + 30718, + 30719, + 30720, + 30721, + 30722, + 30723, + 30724, + 30725, + 30726, + 30727, + 30728, + 30729, + 30730, + 30731, + 30732, + 30733, + 30735, + 30736, + 30737, + 30738, + 30739, + 30740, + 30741, + 30742, + 30743, + 30744, + 30745, + 30746, + 30747, + 30748, + 30749, + 30750, + 30751, + 30752, + 30753, + 30754, + 30755, + 30756, + 30757, + 30758, + 30759, + 30760, + 30761, + 30762, + 30763, + 30764, + 30765, + 30766, + 30767, + 30768, + 30769, + 30770, + 30771, + 30772, + 30773, + 30774, + 30775, + 30776, + 30777, + 30778, + 30779, + 30780, + 30781, + 30782, + 30783, + 30784, + 30785, + 30786, + 30787, + 30788, + 30789, + 30790, + 30791, + 30792, + 30794, + 30795, + 30797, + 30798, + 30799, + 30800, + 30801, + 30802, + 30803, + 30804, + 30805, + 30806, + 30807, + 30808, + 30809, + 30810, + 30811, + 30812, + 30813, + 30814, + 30816, + 30817, + 30818, + 30819, + 30820, + 30821, + 30822, + 30823, + 30824, + 30825, + 30826, + 30827, + 30828, + 30829, + 30830, + 30831, + 30832, + 30833, + 30834, + 30835, + 30836, + 30839, + 30840, + 30841, + 30842, + 30843, + 30844, + 30845, + 30846, + 30847, + 30848, + 30849, + 30850, + 30851, + 30852, + 30853, + 30854, + 30855, + 30856, + 30857, + 30858, + 30859, + 30860, + 30861, + 30862, + 30863, + 30864, + 30865, + 30866, + 30867, + 30868, + 30869, + 30870, + 30871, + 30872, + 30873, + 30874, + 30875, + 30876, + 30877, + 30878, + 30879, + 30880, + 30881, + 30882, + 30883, + 30884, + 30885, + 30886, + 30887, + 30888, + 30889, + 30890, + 30891, + 30892, + 30893, + 30894, + 30895, + 30896, + 30897, + 30898, + 30899, + 30900, + 30901, + 30902, + 30903, + 30904, + 30905, + 30906, + 30907, + 30908, + 30909, + 30910, + 30911, + 30912, + 30913, + 30914, + 30915, + 30916, + 30917, + 30918, + 30919, + 30920, + 30921, + 30923, + 30924, + 30925, + 30926, + 30927, + 30928, + 30929, + 30930, + 30931, + 30932, + 30933, + 30934, + 30935, + 30936, + 30937, + 30938, + 30939, + 30940, + 30941, + 30942, + 30943, + 30944, + 30945, + 30946, + 30947, + 30949, + 30950, + 30951, + 30952, + 30954, + 30955, + 30956, + 30957, + 30958, + 30959, + 30960, + 30961, + 30962, + 30963, + 30964, + 30965, + 30966, + 30967, + 30968, + 30969, + 30970, + 30971, + 30972, + 30973, + 30974, + 30975, + 30976, + 30977, + 30978, + 30979, + 30980, + 30981, + 30982, + 30983, + 30984, + 30985, + 30986, + 30987, + 30989, + 30990, + 30991, + 30992, + 30993, + 30994, + 30995, + 30996, + 30997, + 30998, + 30999, + 31000, + 31002, + 31003, + 31004, + 31005, + 31006, + 31007, + 31008, + 31009, + 31010, + 31011, + 31012, + 31013, + 31014, + 31015, + 31016, + 31017, + 31018, + 31019, + 31020, + 31021, + 31022, + 31023, + 31024, + 31025, + 31026, + 31027, + 31028, + 31029, + 31030, + 31031, + 31032, + 31033, + 31034, + 31035, + 31036, + 31037, + 31038, + 31039, + 31040, + 31041, + 31043, + 31044, + 31045, + 31046, + 31047, + 31048, + 31049, + 31050, + 31051, + 31052, + 31053, + 31054, + 31055, + 31056, + 31057, + 31058, + 31059, + 31060, + 31061, + 31062, + 31063, + 31064, + 31065, + 31066, + 31067, + 31068, + 31069, + 31070, + 31071, + 31072, + 31073, + 31074, + 31075, + 31076, + 31077, + 31078, + 31079, + 31080, + 31081, + 31082, + 31083, + 31084, + 31085, + 31086, + 31087, + 31088, + 31089, + 31090, + 31092, + 31093, + 31094, + 31095, + 31096, + 31097, + 31098, + 31099, + 31100, + 31101, + 31102, + 31103, + 31104, + 31105, + 31106, + 31107, + 31108, + 31109, + 31110, + 31111, + 31112, + 31113, + 31114, + 31115, + 31116, + 31117, + 31118, + 31119, + 31120, + 31121, + 31122, + 31123, + 31124, + 31125, + 31126, + 31127, + 31128, + 31129, + 31130, + 31131, + 31132, + 31133, + 31134, + 31135, + 31136, + 31137, + 31138, + 31139, + 31140, + 31141, + 31142, + 31143, + 31144, + 31145, + 31146, + 31147, + 31148, + 31149, + 31150, + 31151, + 31152, + 31153, + 31154, + 31155, + 31156, + 31157, + 31158, + 31159, + 31160, + 31161, + 31162, + 31163, + 31164, + 31165, + 31166, + 31167, + 31168, + 31169, + 31170, + 31171, + 31172, + 31173, + 31174, + 31175, + 31176, + 31177, + 31178, + 31179, + 31180, + 31181, + 31182, + 31183, + 31184, + 31185, + 31186, + 31187, + 31188, + 31189, + 31191, + 31192, + 31193, + 31194, + 31195, + 31196, + 31197, + 31198, + 31199, + 31200, + 31201, + 31202, + 31203, + 31204, + 31205, + 31206, + 31207, + 31208, + 31209, + 31210, + 31211, + 31212, + 31213, + 31214, + 31215, + 31216, + 31217, + 31218, + 31219, + 31220, + 31221, + 31222, + 31223, + 31224, + 31225, + 31226, + 31227, + 31228, + 31229, + 31230, + 31231, + 31232, + 31233, + 31234, + 31235, + 31236, + 31237, + 31238, + 31239, + 31240, + 31242, + 31243, + 31244, + 31245, + 31246, + 31247, + 31248, + 31249, + 31250, + 31251, + 31252, + 31253, + 31254, + 31255, + 31256, + 31257, + 31258, + 31259, + 31260, + 31262, + 31263, + 31264, + 31265, + 31266, + 31267, + 31268, + 31269, + 31270, + 31271, + 31272, + 31273, + 31274, + 31275, + 31276, + 31277, + 31278, + 31280, + 31281, + 31282, + 31283, + 31284, + 31285, + 31286, + 31287, + 31288, + 31289, + 31290, + 31291, + 31292, + 31293, + 31294, + 31295, + 31296, + 31297, + 31298, + 31299, + 31300, + 31301, + 31302, + 31303, + 31304, + 31305, + 31306, + 31307, + 31308, + 31309, + 31310, + 31311, + 31312, + 31313, + 31314, + 31315, + 31316, + 31317, + 31318, + 31319, + 31320, + 31321, + 31322, + 31323, + 31324, + 31325, + 31326, + 31327, + 31328, + 31329, + 31330, + 31331, + 31332, + 31333, + 31334, + 31335, + 31336, + 31337, + 31338, + 31339, + 31340, + 31341, + 31342, + 31343, + 31344, + 31345, + 31346, + 31347, + 31348, + 31349, + 31350, + 31351, + 31352, + 31353, + 31354, + 31355, + 31356, + 31357, + 31358, + 31359, + 31360, + 31361, + 31362, + 31363, + 31364, + 31365, + 31366, + 31367, + 31368, + 31369, + 31370, + 31371, + 31372, + 31373, + 31374, + 31375, + 31376, + 31377, + 31378, + 31379, + 31380, + 31381, + 31382, + 31383, + 31384, + 31385, + 31386, + 31387, + 31388, + 31389, + 31390, + 31391, + 31392, + 31393, + 31394, + 31395, + 31396, + 31397, + 31398, + 31399, + 31400, + 31401, + 31402, + 31403, + 31404, + 31405, + 31406, + 31407, + 31408, + 31409, + 31410, + 31411, + 31412, + 31413, + 31414, + 31415, + 31416, + 31417, + 31418, + 31419, + 31420, + 31421, + 31422, + 31423, + 31424, + 31425, + 31426, + 31427, + 31428, + 31429, + 31430, + 31432, + 31433, + 31434, + 31435, + 31436, + 31437, + 31438, + 31439, + 31440, + 31441, + 31442, + 31443, + 31444, + 31445, + 31446, + 31447, + 31448, + 31449, + 31450, + 31451, + 31452, + 31453, + 31454, + 31455, + 31456, + 31459, + 31460, + 31461, + 31462, + 31463, + 31464, + 31465, + 31466, + 31467, + 31468, + 31469, + 31470, + 31471, + 31472, + 31473, + 31474, + 31475, + 31476, + 31477, + 31478, + 31479, + 31480, + 31481, + 31482, + 31483, + 31484, + 31486, + 31487, + 31488, + 31489, + 31490, + 31491, + 31492, + 31493, + 31494, + 31495, + 31496, + 31497, + 31498, + 31499, + 31500, + 31501, + 31502, + 31503, + 31504, + 31505, + 31506, + 31507, + 31508, + 31510, + 31511, + 31512, + 31513, + 31514, + 31515, + 31516, + 31517, + 31518, + 31519, + 31520, + 31521, + 31522, + 31523, + 31524, + 31525, + 31526, + 31527, + 31528, + 31529, + 31530, + 31531, + 31532, + 31533, + 31534, + 31535, + 31536, + 31537, + 31538, + 31539, + 31540, + 31541, + 31542, + 31543, + 31544, + 31545, + 31546, + 31547, + 31548, + 31549, + 31550, + 31551, + 31552, + 31553, + 31554, + 31555, + 31556, + 31557, + 31559, + 31560, + 31561, + 31562, + 31563, + 31564, + 31565, + 31566, + 31567, + 31568, + 31569, + 31570, + 31571, + 31572, + 31573, + 31574, + 31575, + 31576, + 31577, + 31578, + 31579, + 31580, + 31581, + 31582, + 31583, + 31584, + 31585, + 31586, + 31587, + 31588, + 31589, + 31591, + 31592, + 31593, + 31594, + 31595, + 31596, + 31597, + 31598, + 31599, + 31600, + 31601, + 31602, + 31603, + 31604, + 31605, + 31606, + 31607, + 31608, + 31609, + 31610, + 31611, + 31612, + 31613, + 31614, + 31615, + 31616, + 31617, + 31618, + 31619, + 31620, + 31621, + 31622, + 31623, + 31624, + 31625, + 31626, + 31627, + 31628, + 31629, + 31630, + 31631, + 31632, + 31633, + 31634, + 31635, + 31636, + 31637, + 31638, + 31639, + 31640, + 31641, + 31642, + 31643, + 31644, + 31645, + 31646, + 31647, + 31648, + 31649, + 31650, + 31651, + 31652, + 31653, + 31654, + 31655, + 31656, + 31657, + 31658, + 31659, + 31660, + 31661, + 31662, + 31663, + 31664, + 31665, + 31666, + 31667, + 31668, + 31669, + 31670, + 31671, + 31672, + 31673, + 31674, + 31675, + 31676, + 31677, + 31678, + 31679, + 31680, + 31681, + 31682, + 31683, + 31684, + 31685, + 31686, + 31687, + 31688, + 31689, + 31690, + 31691, + 31692, + 31693, + 31694, + 31695, + 31696, + 31697, + 31698, + 31699, + 31700, + 31701, + 31702, + 31703, + 31704, + 31705, + 31706, + 31707, + 31708, + 31709, + 31710, + 31711, + 31712, + 31713, + 31714, + 31715, + 31716, + 31717, + 31718, + 31719, + 31720, + 31721, + 31722, + 31724, + 31725, + 31726, + 31727, + 31728, + 31729, + 31730, + 31731, + 31732, + 31733, + 31735, + 31736, + 31737, + 31738, + 31739, + 31740, + 31741, + 31742, + 31743, + 31744, + 31745, + 31746, + 31747, + 31748, + 31749, + 31750, + 31751, + 31752, + 31753, + 31754, + 31755, + 31756, + 31757, + 31758, + 31759, + 31760, + 31761, + 31762, + 31763, + 31764, + 31765, + 31766, + 31767, + 31768, + 31769, + 31771, + 31772, + 31773, + 31774, + 31775, + 31776, + 31777, + 31778, + 31779, + 31780, + 31781, + 31782, + 31783, + 31784, + 31785, + 31786, + 31787, + 31788, + 31789, + 31790, + 31791, + 31792, + 31793, + 31794, + 31795, + 31796, + 31797, + 31798, + 31799, + 31800, + 31801, + 31802, + 31803, + 31804, + 31805, + 31806, + 31807, + 31808, + 31809, + 31810, + 31811, + 31813, + 31814, + 31815, + 31816, + 31817, + 31818, + 31819, + 31820, + 31822, + 31823, + 31824, + 31825, + 31826, + 31827, + 31828, + 31829, + 31830, + 31831, + 31832, + 31833, + 31834, + 31835, + 31836, + 31837, + 31838, + 31839, + 31840, + 31841, + 31842, + 31843, + 31844, + 31845, + 31846, + 31847, + 31848, + 31849, + 31850, + 31851, + 31852, + 31853, + 31854, + 31855, + 31856, + 31857, + 31858, + 31859, + 31860, + 31861, + 31862, + 31863, + 31864, + 31865, + 31866, + 31867, + 31868, + 31869, + 31870, + 31871, + 31872, + 31873, + 31875, + 31876, + 31877, + 31878, + 31879, + 31880, + 31881, + 31882, + 31883, + 31884, + 31885, + 31886, + 31887, + 31888, + 31889, + 31890, + 31891, + 31892, + 31893, + 31894, + 31895, + 31896, + 31897, + 31898, + 31899, + 31900, + 31901, + 31902, + 31903, + 31904, + 31905, + 31906, + 31907, + 31908, + 31909, + 31910, + 31911, + 31912, + 31913, + 31914, + 31915, + 31916, + 31917, + 31918, + 31919, + 31920, + 31921, + 31922, + 31923, + 31924, + 31925, + 31926, + 31927, + 31928, + 31929, + 31930, + 31931, + 31932, + 31933, + 31934, + 31935, + 31936, + 31937, + 31938, + 31939, + 31940, + 31941, + 31942, + 31943, + 31944, + 31945, + 31946, + 31947, + 31948, + 31949, + 31950, + 31951, + 31952, + 31953, + 31954, + 31955, + 31956, + 31957, + 31958, + 31959, + 31960, + 31961, + 31962, + 31963, + 31964, + 31965, + 31966, + 31967, + 31968, + 31969, + 31970, + 31971, + 31972, + 31973, + 31974, + 31975, + 31976, + 31977, + 31978, + 31979, + 31980, + 31981, + 31982, + 31983, + 31984, + 31985, + 31986, + 31987, + 31988, + 31989, + 31990, + 31991, + 31992, + 31993, + 31994, + 31995, + 31996, + 31997, + 31998, + 31999, + 32000, + 32001, + 32002, + 32003, + 32004, + 32005, + 32006, + 32007, + 32008, + 32009, + 32010, + 32011, + 32012, + 32013, + 32014, + 32015, + 32016, + 32017, + 32018, + 32019, + 32020, + 32021, + 32022, + 32023, + 32024, + 32025, + 32026, + 32027, + 32028, + 32029, + 32030, + 32031, + 32032, + 32033, + 32034, + 32035, + 32036, + 32037, + 32038, + 32039, + 32040, + 32041, + 32042, + 32043, + 32044, + 32045, + 32046, + 32047, + 32048, + 32049, + 32050, + 32051, + 32052, + 32053, + 32054, + 32055, + 32056, + 32057, + 32058, + 32059, + 32060, + 32061, + 32062, + 32063, + 32064, + 32065, + 32066, + 32067, + 32068, + 32069, + 32070, + 32071, + 32072, + 32073, + 32074, + 32075, + 32076, + 32077, + 32078, + 32079, + 32080, + 32081, + 32082, + 32083, + 32084, + 32085, + 32086, + 32087, + 32088, + 32089, + 32090, + 32091, + 32092, + 32094, + 32095, + 32096, + 32097, + 32098, + 32099, + 32100, + 32101, + 32103, + 32104, + 32105, + 32106, + 32107, + 32108, + 32109, + 32110, + 32111, + 32112, + 32113, + 32114, + 32115, + 32116, + 32117, + 32118, + 32119, + 32122, + 32123, + 32124, + 32125, + 32126, + 32127, + 32128, + 32129, + 32131, + 32132, + 32133, + 32134, + 32135, + 32136, + 32137, + 32138, + 32139, + 32140, + 32141, + 32142, + 32143, + 32144, + 32145, + 32147, + 32148, + 32149, + 32150, + 32151, + 32152, + 32153, + 32154, + 32155, + 32156, + 32157, + 32158, + 32159, + 32160, + 32161, + 32162, + 32163, + 32164, + 32165, + 32166, + 32167, + 32168, + 32169, + 32170, + 32171, + 32172, + 32173, + 32174, + 32175, + 32176, + 32177, + 32178, + 32179, + 32180, + 32181, + 32182, + 32183, + 32184, + 32185, + 32186, + 32187, + 32188, + 32189, + 32190, + 32191, + 32192, + 32193, + 32194, + 32195, + 32196, + 32197, + 32198, + 32199, + 32200, + 32201, + 32202, + 32203, + 32204, + 32205, + 32206, + 32207, + 32208, + 32209, + 32210, + 32211, + 32212, + 32213, + 32214, + 32215, + 32216, + 32217, + 32218, + 32219, + 32220, + 32221, + 32222, + 32223, + 32224, + 32225, + 32226, + 32227, + 32228, + 32229, + 32230, + 32231, + 32232, + 32233, + 32234, + 32235, + 32236, + 32237, + 32238, + 32239, + 32240, + 32241, + 32242, + 32243, + 32244, + 32245, + 32246, + 32247, + 32248, + 32249, + 32250, + 32251, + 32252, + 32253, + 32254, + 32255, + 32256, + 32257, + 32258, + 32259, + 32260, + 32261, + 32262, + 32263, + 32264, + 32265, + 32266, + 32267, + 32268, + 32269, + 32270, + 32271, + 32272, + 32273, + 32274, + 32275, + 32276, + 32277, + 32278, + 32279, + 32280, + 32281, + 32282, + 32283, + 32284, + 32285, + 32286, + 32287, + 32288, + 32289, + 32290, + 32291, + 32292, + 32293, + 32294, + 32295, + 32296, + 32297, + 32298, + 32299, + 32300, + 32301, + 32302, + 32303, + 32304, + 32305, + 32306, + 32307, + 32308, + 32310, + 32311, + 32312, + 32313, + 32314, + 32315, + 32316, + 32317, + 32318, + 32319, + 32320, + 32321, + 32322, + 32323, + 32324, + 32325, + 32326, + 32327, + 32328, + 32329, + 32330, + 32331, + 32332, + 32333, + 32334, + 32335, + 32336, + 32337, + 32338, + 32339, + 32340, + 32341, + 32342, + 32343, + 32344, + 32346, + 32347, + 32348, + 32349, + 32350, + 32351, + 32352, + 32353, + 32354, + 32355, + 32356, + 32357, + 32358, + 32359, + 32360, + 32361, + 32362, + 32363, + 32364, + 32365, + 32366, + 32367, + 32368, + 32369, + 32370, + 32371, + 32372, + 32373, + 32374, + 32375, + 32376, + 32377, + 32378, + 32379, + 32380, + 32381, + 32382, + 32383, + 32384, + 32385, + 32386, + 32387, + 32388, + 32389, + 32390, + 32391, + 32392, + 32393, + 32394, + 32395, + 32396, + 32397, + 32398, + 32399, + 32400, + 32401, + 32403, + 32404, + 32405, + 32407, + 32408, + 32409, + 32410, + 32411, + 32412, + 32413, + 32414, + 32415, + 32416, + 32417, + 32418, + 32419, + 32420, + 32421, + 32422, + 32423, + 32424, + 32425, + 32426, + 32427, + 32428, + 32429, + 32430, + 32431, + 32432, + 32433, + 32434, + 32435, + 32436, + 32437, + 32438, + 32439, + 32440, + 32441, + 32442, + 32443, + 32444, + 32445, + 32446, + 32447, + 32448, + 32449, + 32450, + 32451, + 32452, + 32453, + 32454, + 32455, + 32456, + 32457, + 32458, + 32459, + 32460, + 32461, + 32462, + 32463, + 32464, + 32465, + 32466, + 32467, + 32468, + 32469, + 32470, + 32471, + 32472, + 32473, + 32474, + 32475, + 32476, + 32477, + 32478, + 32479, + 32480, + 32481, + 32482, + 32483, + 32484, + 32485, + 32486, + 32487, + 32488, + 32489, + 32490, + 32491, + 32492, + 32493, + 32494, + 32495, + 32496, + 32497, + 32498, + 32499, + 32500, + 32501, + 32502, + 32503, + 32505, + 32506, + 32507, + 32508, + 32509, + 32510, + 32511, + 32512, + 32513, + 32514, + 32515, + 32516, + 32517, + 32518, + 32519, + 32520, + 32521, + 32522, + 32523, + 32524, + 32525, + 32526, + 32527, + 32528, + 32529, + 32530, + 32531, + 32532, + 32533, + 32534, + 32535, + 32536, + 32537, + 32538, + 32539, + 32540, + 32541, + 32542, + 32543, + 32544, + 32545, + 32546, + 32547, + 32548, + 32549, + 32550, + 32551, + 32552, + 32553, + 32554, + 32555, + 32556, + 32557, + 32558, + 32559, + 32560, + 32561, + 32562, + 32563, + 32564, + 32565, + 32566, + 32567, + 32568, + 32569, + 32570, + 32571, + 32572, + 32573, + 32574, + 32575, + 32576, + 32577, + 32578, + 32579, + 32580, + 32581, + 32582, + 32583, + 32584, + 32586, + 32587, + 32588, + 32589, + 32590, + 32591, + 32592, + 32593, + 32594, + 32595, + 32596, + 32597, + 32598, + 32599, + 32600, + 32601, + 32602, + 32603, + 32604, + 32605, + 32606, + 32607, + 32608, + 32609, + 32610, + 32612, + 32613, + 32614, + 32615, + 32616, + 32617, + 32618, + 32619, + 32620, + 32621, + 32622, + 32623, + 32624, + 32625, + 32626, + 32627, + 32628, + 32629, + 32630, + 32631, + 32632, + 32633, + 32634, + 32635, + 32636, + 32637, + 32638, + 32639, + 32640, + 32641, + 32642, + 32643, + 32644, + 32645, + 32646, + 32647, + 32648, + 32649, + 32650, + 32651, + 32652, + 32653, + 32654, + 32655, + 32656, + 32657, + 32658, + 32659, + 32660, + 32661, + 32662, + 32663, + 32664, + 32665, + 32666, + 32667, + 32668, + 32669, + 32670, + 32671, + 32672, + 32673, + 32674, + 32675, + 32676, + 32677, + 32678, + 32679, + 32680, + 32681, + 32682, + 32683, + 32684, + 32685, + 32686, + 32687, + 32688, + 32689, + 32690, + 32691, + 32692, + 32693, + 32694, + 32695, + 32696, + 32697, + 32698, + 32699, + 32700, + 32701, + 32702, + 32703, + 32705, + 32706, + 32707, + 32708, + 32709, + 32710, + 32711, + 32712, + 32713, + 32714, + 32715, + 32716, + 32717, + 32718, + 32719, + 32720, + 32721, + 32722, + 32723, + 32724, + 32725, + 32726, + 32727, + 32728, + 32729, + 32730, + 32731, + 32732, + 32733, + 32734, + 32735, + 32736, + 32737, + 32738, + 32739, + 32740, + 32741, + 32742, + 32743, + 32744, + 32745, + 32746, + 32747, + 32748, + 32749, + 32750, + 32751, + 32752, + 32753, + 32754, + 32755, + 32756, + 32757, + 32758, + 32759, + 32760, + 32761, + 32763, + 32764, + 32765, + 32766, + 32767, + 32768, + 32769, + 32770, + 32771, + 32772, + 32773, + 32774, + 32775, + 32776, + 32777, + 32778, + 32779, + 32780, + 32781, + 32782, + 32783, + 32784, + 32785, + 32786, + 32787, + 32788, + 32789, + 32790, + 32791, + 32792, + 32793, + 32794, + 32795, + 32796, + 32797, + 32798, + 32799, + 32800, + 32801, + 32802, + 32803, + 32804, + 32805, + 32806, + 32807, + 32808, + 32809, + 32810, + 32811, + 32812, + 32813, + 32814, + 32815, + 32816, + 32817, + 32818, + 32819, + 32820, + 32821, + 32823, + 32824, + 32825, + 32826, + 32827, + 32828, + 32829, + 32830, + 32831, + 32832, + 32833, + 32834, + 32835, + 32836, + 32837, + 32838, + 32839, + 32840, + 32842, + 32843, + 32844, + 32845, + 32846, + 32847, + 32848, + 32849, + 32850, + 32851, + 32852, + 32853, + 32854, + 32855, + 32856, + 32857, + 32858, + 32859, + 32860, + 32861, + 32862, + 32863, + 32864, + 32865, + 32866, + 32867, + 32868, + 32869, + 32870, + 32871, + 32872, + 32873, + 32874, + 32875, + 32876, + 32877, + 32878, + 32879, + 32880, + 32881, + 32882, + 32883, + 32884, + 32885, + 32886, + 32887, + 32888, + 32889, + 32890, + 32891, + 32892, + 32893, + 32894, + 32895, + 32897, + 32898, + 32899, + 32900, + 32901, + 32903, + 32904, + 32905, + 32906, + 32907, + 32908, + 32909, + 32910, + 32911, + 32912, + 32913, + 32914, + 32915, + 32916, + 32917, + 32918, + 32919, + 32920, + 32921, + 32922, + 32923, + 32924, + 32925, + 32926, + 32927, + 32928, + 32929, + 32930, + 32931, + 32932, + 32933, + 32934, + 32935, + 32936, + 32937, + 32938, + 32939, + 32940, + 32941, + 32942, + 32943, + 32944, + 32945, + 32946, + 32947, + 32948, + 32949, + 32950, + 32951, + 32952, + 32953, + 32954, + 32955, + 32956, + 32957, + 32958, + 32959, + 32960, + 32961, + 32962, + 32963, + 32964, + 32965, + 32966, + 32967, + 32968, + 32969, + 32970, + 32971, + 32972, + 32973, + 32974, + 32975, + 32976, + 32977, + 32978, + 32980, + 32981, + 32982, + 32983, + 32984, + 32985, + 32986, + 32987, + 32988, + 32989, + 32990, + 32991, + 32992, + 32993, + 32994, + 32995, + 32996, + 32997, + 32998, + 32999, + 33000, + 33001, + 33002, + 33003, + 33004, + 33005, + 33006, + 33007, + 33008, + 33009, + 33010, + 33011, + 33012, + 33014, + 33015, + 33016, + 33017, + 33018, + 33019, + 33020, + 33021, + 33022, + 33023, + 33024, + 33025, + 33027, + 33028, + 33029, + 33030, + 33031, + 33032, + 33033, + 33034, + 33035, + 33036, + 33037, + 33038, + 33039, + 33040, + 33041, + 33042, + 33043, + 33044, + 33045, + 33046, + 33047, + 33048, + 33049, + 33050, + 33051, + 33052, + 33053, + 33054, + 33055, + 33056, + 33057, + 33058, + 33059, + 33060, + 33061, + 33062, + 33063, + 33064, + 33065, + 33066, + 33067, + 33068, + 33069, + 33070, + 33071, + 33072, + 33073, + 33074, + 33075, + 33076, + 33077, + 33078, + 33079, + 33080, + 33081, + 33082, + 33083, + 33084, + 33085, + 33086, + 33087, + 33088, + 33089, + 33090, + 33091, + 33092, + 33093, + 33094, + 33095, + 33096, + 33097, + 33098, + 33099, + 33100, + 33101, + 33102, + 33103, + 33104, + 33105, + 33106, + 33107, + 33108, + 33109, + 33110, + 33111, + 33112, + 33113, + 33114, + 33115, + 33116, + 33117, + 33118, + 33119, + 33120, + 33121, + 33122, + 33123, + 33124, + 33125, + 33126, + 33127, + 33128, + 33129, + 33130, + 33131, + 33132, + 33133, + 33134, + 33135, + 33136, + 33137, + 33138, + 33139, + 33140, + 33142, + 33143, + 33144, + 33145, + 33146, + 33147, + 33148, + 33149, + 33150, + 33151, + 33152, + 33153, + 33154, + 33155, + 33156, + 33157, + 33158, + 33159, + 33160, + 33161, + 33162, + 33163, + 33164, + 33165, + 33166, + 33167, + 33168, + 33170, + 33171, + 33172, + 33173, + 33174, + 33175, + 33176, + 33177, + 33178, + 33179, + 33180, + 33181, + 33182, + 33183, + 33184, + 33185, + 33186, + 33187, + 33188, + 33189, + 33190, + 33191, + 33192, + 33193, + 33194, + 33195, + 33196, + 33197, + 33198, + 33199, + 33200, + 33201, + 33202, + 33203, + 33204, + 33205, + 33206, + 33207, + 33209, + 33210, + 33211, + 33212, + 33213, + 33214, + 33215, + 33216, + 33217, + 33218, + 33219, + 33220, + 33221, + 33222, + 33223, + 33224, + 33225, + 33226, + 33227, + 33228, + 33229, + 33230, + 33231, + 33232, + 33233, + 33234, + 33235, + 33236, + 33237, + 33238, + 33239, + 33240, + 33241, + 33242, + 33243, + 33245, + 33246, + 33247, + 33248, + 33249, + 33250, + 33251, + 33252, + 33253, + 33254, + 33255, + 33256, + 33257, + 33258, + 33259, + 33260, + 33261, + 33262, + 33263, + 33264, + 33265, + 33266, + 33267, + 33268, + 33269, + 33270, + 33271, + 33272, + 33273, + 33274, + 33275, + 33276, + 33277, + 33278, + 33279, + 33280, + 33281, + 33282, + 33283, + 33284, + 33285, + 33286, + 33287, + 33288, + 33289, + 33290, + 33291, + 33292, + 33293, + 33294, + 33295, + 33296, + 33297, + 33298, + 33299, + 33300, + 33301, + 33302, + 33303, + 33304, + 33305, + 33306, + 33307, + 33309, + 33310, + 33311, + 33312, + 33313, + 33314, + 33315, + 33316, + 33317, + 33318, + 33319, + 33320, + 33321, + 33322, + 33323, + 33324, + 33325, + 33326, + 33327, + 33328, + 33329, + 33330, + 33331, + 33332, + 33333, + 33334, + 33335, + 33336, + 33337, + 33338, + 33339, + 33340, + 33341, + 33342, + 33343, + 33344, + 33345, + 33346, + 33347, + 33348, + 33349, + 33350, + 33351, + 33352, + 33353, + 33354, + 33355, + 33356, + 33357, + 33358, + 33359, + 33360, + 33361, + 33362, + 33363, + 33364, + 33365, + 33366, + 33367, + 33369, + 33370, + 33371, + 33372, + 33373, + 33374, + 33375, + 33376, + 33377, + 33378, + 33379, + 33380, + 33381, + 33382, + 33383, + 33384, + 33385, + 33386, + 33387, + 33388, + 33389, + 33390, + 33391, + 33392, + 33394, + 33395, + 33396, + 33397, + 33398, + 33399, + 33400, + 33401, + 33402, + 33403, + 33404, + 33405, + 33406, + 33407, + 33408, + 33409, + 33410, + 33411, + 33412, + 33413, + 33414, + 33415, + 33416, + 33417, + 33418, + 33419, + 33420, + 33421, + 33422, + 33423, + 33424, + 33425, + 33426, + 33427, + 33428, + 33429, + 33430, + 33431, + 33432, + 33433, + 33434, + 33435, + 33436, + 33437, + 33438, + 33439, + 33440, + 33441, + 33442, + 33443, + 33444, + 33445, + 33446, + 33447, + 33448, + 33449, + 33450, + 33451, + 33452, + 33453, + 33454, + 33455, + 33456, + 33457, + 33459, + 33460, + 33461, + 33462, + 33463, + 33464, + 33465, + 33466, + 33467, + 33468, + 33470, + 33471, + 33472, + 33473, + 33475, + 33476, + 33477, + 33478, + 33479, + 33480, + 33481, + 33482, + 33483, + 33484, + 33485, + 33486, + 33487, + 33488, + 33489, + 33490, + 33491, + 33492, + 33493, + 33494, + 33495, + 33496, + 33497, + 33498, + 33499, + 33500, + 33501, + 33502, + 33503, + 33504, + 33505, + 33506, + 33507, + 33508, + 33509, + 33510, + 33511, + 33512, + 33513, + 33514, + 33515, + 33516, + 33517, + 33518, + 33519, + 33520, + 33521, + 33522, + 33523, + 33524, + 33525, + 33526, + 33527, + 33528, + 33529, + 33530, + 33531, + 33532, + 33533, + 33534, + 33535, + 33536, + 33537, + 33538, + 33539, + 33540, + 33541, + 33542, + 33543, + 33544, + 33545, + 33546, + 33547, + 33548, + 33549, + 33550, + 33552, + 33553, + 33554, + 33555, + 33556, + 33557, + 33558, + 33559, + 33560, + 33561, + 33562, + 33563, + 33564, + 33565, + 33566, + 33567, + 33568, + 33569, + 33570, + 33571, + 33572, + 33573, + 33574, + 33575, + 33576, + 33577, + 33578, + 33579, + 33580, + 33581, + 33582, + 33583, + 33584, + 33585, + 33586, + 33587, + 33588, + 33589, + 33590, + 33591, + 33592, + 33593, + 33594, + 33595, + 33596, + 33597, + 33598, + 33599, + 33600, + 33601, + 33602, + 33603, + 33604, + 33605, + 33606, + 33607, + 33608, + 33609, + 33610, + 33611, + 33612, + 33613, + 33614, + 33615, + 33616, + 33617, + 33618, + 33619, + 33620, + 33621, + 33622, + 33623, + 33624, + 33625, + 33626, + 33627, + 33628, + 33629, + 33630, + 33631, + 33632, + 33633, + 33634, + 33635, + 33636, + 33637, + 33638, + 33639, + 33640, + 33641, + 33642, + 33643, + 33644, + 33645, + 33646, + 33647, + 33648, + 33649, + 33650, + 33651, + 33652, + 33653, + 33654, + 33655, + 33656, + 33657, + 33658, + 33659, + 33660, + 33661, + 33662, + 33663, + 33664, + 33665, + 33666, + 33667, + 33669, + 33670, + 33672, + 33673, + 33674, + 33675, + 33676, + 33677, + 33678, + 33679, + 33680, + 33681, + 33682, + 33683, + 33684, + 33685, + 33686, + 33687, + 33688, + 33689, + 33690, + 33691, + 33692, + 33693, + 33694, + 33695, + 33696, + 33697, + 33698, + 33699, + 33700, + 33701, + 33702, + 33703, + 33704, + 33705, + 33706, + 33707, + 33708, + 33709, + 33710, + 33712, + 33713, + 33714, + 33715, + 33716, + 33717, + 33718, + 33719, + 33720, + 33721, + 33722, + 33723, + 33724, + 33725, + 33726, + 33727, + 33728, + 33729, + 33730, + 33731, + 33732, + 33733, + 33734, + 33735, + 33736, + 33737, + 33738, + 33739, + 33740, + 33741, + 33742, + 33743, + 33744, + 33745, + 33746, + 33747, + 33748, + 33749, + 33750, + 33751, + 33752, + 33753, + 33754, + 33755, + 33756, + 33757, + 33758, + 33759, + 33760, + 33761, + 33762, + 33763, + 33764, + 33765, + 33766, + 33767, + 33768, + 33769, + 33770, + 33771, + 33772, + 33773, + 33774, + 33775, + 33776, + 33778, + 33779, + 33780, + 33781, + 33782, + 33783, + 33784, + 33785, + 33786, + 33787, + 33789, + 33791, + 33792, + 33793, + 33794, + 33795, + 33796, + 33797, + 33798, + 33799, + 33800, + 33801, + 33802, + 33803, + 33804, + 33805, + 33807, + 33808, + 33809, + 33810, + 33811, + 33812, + 33813, + 33814, + 33815, + 33817, + 33818, + 33819, + 33820, + 33821, + 33822, + 33823, + 33824, + 33825, + 33826, + 33827, + 33828, + 33829, + 33830, + 33831, + 33832, + 33833, + 33834, + 33835, + 33836, + 33837, + 33838, + 33839, + 33840, + 33841, + 33842, + 33843, + 33844, + 33845, + 33846, + 33847, + 33848, + 33849, + 33850, + 33851, + 33852, + 33853, + 33854, + 33855, + 33856, + 33857, + 33858, + 33859, + 33860, + 33861, + 33862, + 33863, + 33864, + 33865, + 33866, + 33867, + 33868, + 33869, + 33870, + 33871, + 33872, + 33873, + 33874, + 33875, + 33876, + 33877, + 33878, + 33880, + 33881, + 33882, + 33883, + 33884, + 33885, + 33886, + 33887, + 33888, + 33889, + 33890, + 33891, + 33892, + 33893, + 33894, + 33895, + 33896, + 33897, + 33898, + 33899, + 33900, + 33901, + 33902, + 33903, + 33905, + 33906, + 33907, + 33908, + 33909, + 33910, + 33911, + 33912, + 33913, + 33914, + 33915, + 33916, + 33917, + 33918, + 33919, + 33920, + 33921, + 33922, + 33923, + 33924, + 33925, + 33926, + 33927, + 33928, + 33929, + 33930, + 33931, + 33932, + 33933, + 33934, + 33935, + 33936, + 33937, + 33938, + 33939, + 33940, + 33941, + 33942, + 33943, + 33944, + 33945, + 33946, + 33947, + 33948, + 33949, + 33950, + 33951, + 33952, + 33953, + 33954, + 33955, + 33956, + 33957, + 33958, + 33959, + 33960, + 33961, + 33962, + 33963, + 33964, + 33965, + 33966, + 33967, + 33968, + 33969, + 33970, + 33971, + 33972, + 33973, + 33974, + 33975, + 33976, + 33977, + 33978, + 33979, + 33980, + 33981, + 33982, + 33983, + 33984, + 33985, + 33986, + 33987, + 33988, + 33989, + 33990, + 33991, + 33992, + 33993, + 33994, + 33995, + 33996, + 33998, + 33999, + 34000, + 34001, + 34002, + 34003, + 34004, + 34005, + 34006, + 34007, + 34008, + 34009, + 34010, + 34011, + 34012, + 34013, + 34014, + 34015, + 34016, + 34017, + 34018, + 34019, + 34020, + 34021, + 34022, + 34023, + 34024, + 34025, + 34026, + 34027, + 34028, + 34029, + 34030, + 34031, + 34032, + 34033, + 34034, + 34035, + 34037, + 34038, + 34039, + 34040, + 34041, + 34042, + 34043, + 34044, + 34045, + 34046, + 34047, + 34048, + 34049, + 34050, + 34051, + 34052, + 34053, + 34054, + 34055, + 34056, + 34057, + 34058, + 34059, + 34060, + 34061, + 34062, + 34063, + 34064, + 34065, + 34066, + 34067, + 34068, + 34069, + 34070, + 34071, + 34072, + 34073, + 34074, + 34075, + 34076, + 34077, + 34079, + 34080, + 34081, + 34082, + 34083, + 34084, + 34085, + 34086, + 34087, + 34088, + 34089, + 34090, + 34091, + 34092, + 34093, + 34094, + 34095, + 34096, + 34097, + 34098, + 34099, + 34100, + 34101, + 34102, + 34103, + 34104, + 34105, + 34106, + 34107, + 34108, + 34109, + 34110, + 34111, + 34112, + 34113, + 34114, + 34115, + 34116, + 34117, + 34118, + 34119, + 34120, + 34121, + 34122, + 34123, + 34124, + 34125, + 34126, + 34127, + 34128, + 34129, + 34130, + 34131, + 34132, + 34133, + 34134, + 34135, + 34136, + 34137, + 34138, + 34139, + 34140, + 34141, + 34142, + 34143, + 34144, + 34145, + 34146, + 34147, + 34148, + 34149, + 34150, + 34151, + 34152, + 34153, + 34154, + 34155, + 34156, + 34157, + 34158, + 34159, + 34160, + 34161, + 34162, + 34163, + 34164, + 34165, + 34166, + 34167, + 34168, + 34169, + 34170, + 34171, + 34172, + 34173, + 34174, + 34175, + 34176, + 34177, + 34178, + 34179, + 34180, + 34182, + 34183, + 34184, + 34185, + 34186, + 34187, + 34188, + 34189, + 34190, + 34191, + 34192, + 34193, + 34194, + 34195, + 34196, + 34197, + 34198, + 34199, + 34200, + 34201, + 34202, + 34203, + 34204, + 34205, + 34206, + 34207, + 34208, + 34209, + 34210, + 34211, + 34212, + 34213, + 34214, + 34215, + 34216, + 34217, + 34218, + 34219, + 34220, + 34221, + 34222, + 34223, + 34224, + 34225, + 34226, + 34227, + 34228, + 34229, + 34230, + 34231, + 34232, + 34233, + 34234, + 34235, + 34236, + 34237, + 34238, + 34239, + 34240, + 34241, + 34242, + 34243, + 34244, + 34245, + 34246, + 34247, + 34248, + 34249, + 34250, + 34251, + 34252, + 34253, + 34254, + 34255, + 34256, + 34257, + 34258, + 34259, + 34260, + 34261, + 34262, + 34263, + 34264, + 34265, + 34266, + 34267, + 34268, + 34269, + 34270, + 34271, + 34272, + 34273, + 34274, + 34275, + 34276, + 34277, + 34278, + 34279, + 34280, + 34281, + 34282, + 34283, + 34284, + 34285, + 34286, + 34287, + 34288, + 34289, + 34290, + 34291, + 34292, + 34293, + 34294, + 34295, + 34296, + 34297, + 34298, + 34299, + 34300, + 34301, + 34302, + 34303, + 34304, + 34305, + 34306, + 34307, + 34308, + 34309, + 34310, + 34311, + 34312, + 34313, + 34314, + 34315, + 34316, + 34317, + 34318, + 34319, + 34320, + 34321, + 34322, + 34323, + 34324, + 34325, + 34326, + 34327, + 34328, + 34329, + 34330, + 34331, + 34332, + 34333, + 34334, + 34335, + 34336, + 34337, + 34338, + 34339, + 34340, + 34341, + 34342, + 34343, + 34344, + 34345, + 34346, + 34347, + 34348, + 34349, + 34350, + 34351, + 34352, + 34354, + 34355, + 34356, + 34357, + 34358, + 34359, + 34360, + 34361, + 34362, + 34363, + 34364, + 34365, + 34366, + 34367, + 34368, + 34369, + 34370, + 34371, + 34372, + 34373, + 34374, + 34375, + 34376, + 34377, + 34378, + 34379, + 34380, + 34381, + 34382, + 34383, + 34384, + 34386, + 34387, + 34388, + 34389, + 34390, + 34391, + 34392, + 34393, + 34394, + 34395, + 34396, + 34397, + 34398, + 34399, + 34400, + 34401, + 34402, + 34403, + 34404, + 34405, + 34406, + 34407, + 34408, + 34409, + 34410, + 34411, + 34412, + 34413, + 34414, + 34415, + 34416, + 34417, + 34418, + 34419, + 34420, + 34421, + 34422, + 34423, + 34424, + 34425, + 34426, + 34427, + 34428, + 34429, + 34430, + 34431, + 34432, + 34433, + 34434, + 34435, + 34436, + 34437, + 34438, + 34439, + 34440, + 34441, + 34442, + 34443, + 34444, + 34445, + 34446, + 34447, + 34448, + 34449, + 34450, + 34451, + 34452, + 34453, + 34454, + 34455, + 34456, + 34457, + 34458, + 34459, + 34460, + 34461, + 34462, + 34463, + 34464, + 34465, + 34466, + 34468, + 34469, + 34470, + 34471, + 34472, + 34473, + 34474, + 34475, + 34476, + 34477, + 34478, + 34479, + 34480, + 34481, + 34482, + 34483, + 34484, + 34485, + 34486, + 34487, + 34488, + 34489, + 34490, + 34491, + 34492, + 34493, + 34494, + 34495, + 34496, + 34497, + 34498, + 34499, + 34500, + 34501, + 34502, + 34503, + 34504, + 34505, + 34506, + 34507, + 34508, + 34509, + 34510, + 34511, + 34512, + 34513, + 34514, + 34515, + 34516, + 34517, + 34518, + 34519, + 34520, + 34521, + 34522, + 34523, + 34524, + 34525, + 34526, + 34527, + 34528, + 34529, + 34530, + 34531, + 34532, + 34533, + 34534, + 34535, + 34536, + 34537, + 34538, + 34539, + 34540, + 34541, + 34542, + 34543, + 34544, + 34545, + 34546, + 34547, + 34548, + 34549, + 34550, + 34552, + 34553, + 34554, + 34555, + 34556, + 34557, + 34558, + 34559, + 34560, + 34561, + 34562, + 34563, + 34564, + 34565, + 34566, + 34567, + 34568, + 34569, + 34570, + 34571, + 34572, + 34573, + 34574, + 34575, + 34576, + 34577, + 34578, + 34579, + 34580, + 34581, + 34582, + 34583, + 34584, + 34585, + 34586, + 34587, + 34588, + 34589, + 34590, + 34591, + 34592, + 34593, + 34594, + 34595, + 34596, + 34597, + 34598, + 34599, + 34600, + 34601, + 34602, + 34603, + 34604, + 34605, + 34606, + 34607, + 34608, + 34609, + 34610, + 34611, + 34612, + 34613, + 34614, + 34615, + 34616, + 34617, + 34618, + 34619, + 34620, + 34621, + 34623, + 34624, + 34625, + 34626, + 34627, + 34628, + 34629, + 34630, + 34631, + 34632, + 34633, + 34634, + 34635, + 34636, + 34637, + 34638, + 34639, + 34640, + 34641, + 34642, + 34643, + 34644, + 34645, + 34646, + 34647, + 34648, + 34649, + 34650, + 34651, + 34652, + 34653, + 34654, + 34655, + 34656, + 34657, + 34658, + 34659, + 34660, + 34661, + 34662, + 34663, + 34664, + 34665, + 34666, + 34667, + 34668, + 34669, + 34670, + 34671, + 34672, + 34673, + 34674, + 34675, + 34676, + 34677, + 34678, + 34679, + 34680, + 34681, + 34682, + 34683, + 34684, + 34685, + 34686, + 34687, + 34688, + 34689, + 34690, + 34691, + 34692, + 34693, + 34694, + 34695, + 34696, + 34697, + 34698, + 34699, + 34700, + 34701, + 34702, + 34703, + 34704, + 34705, + 34706, + 34707, + 34708, + 34709, + 34710, + 34711, + 34712, + 34713, + 34714, + 34715, + 34716, + 34717, + 34718, + 34719, + 34720, + 34721, + 34722, + 34723, + 34724, + 34725, + 34726, + 34727, + 34728, + 34729, + 34730, + 34731, + 34732, + 34733, + 34734, + 34735, + 34736, + 34737, + 34738, + 34739, + 34740, + 34741, + 34742, + 34743, + 34744, + 34745, + 34746, + 34747, + 34748, + 34749, + 34750, + 34751, + 34752, + 34753, + 34754, + 34755, + 34756, + 34757, + 34758, + 34759, + 34760, + 34761, + 34762, + 34763, + 34764, + 34765, + 34766, + 34767, + 34768, + 34769, + 34770, + 34771, + 34772, + 34773, + 34774, + 34775, + 34776, + 34777, + 34778, + 34779, + 34780, + 34781, + 34782, + 34784, + 34785, + 34786, + 34787, + 34788, + 34789, + 34790, + 34791, + 34792, + 34793, + 34794, + 34795, + 34796, + 34797, + 34798, + 34799, + 34800, + 34801, + 34802, + 34803, + 34804, + 34805, + 34806, + 34807, + 34808, + 34809, + 34810, + 34811, + 34812, + 34813, + 34816, + 34817, + 34818, + 34819, + 34820, + 34821, + 34822, + 34823, + 34824, + 34825, + 34826, + 34827, + 34828, + 34829, + 34830, + 34831, + 34832, + 34833, + 34834, + 34835, + 34836, + 34837, + 34838, + 34839, + 34840, + 34841, + 34842, + 34843, + 34845, + 34846, + 34847, + 34848, + 34849, + 34850, + 34851, + 34852, + 34853, + 34854, + 34855, + 34856, + 34857, + 34858, + 34859, + 34860, + 34861, + 34862, + 34863, + 34864, + 34865, + 34866, + 34867, + 34868, + 34869, + 34870, + 34871, + 34872, + 34873, + 34874, + 34875, + 34876, + 34877, + 34878, + 34879, + 34880, + 34881, + 34882, + 34883, + 34884, + 34885, + 34886, + 34887, + 34890, + 34891, + 34892, + 34893, + 34894, + 34895, + 34896, + 34897, + 34898, + 34899, + 34900, + 34901, + 34902, + 34903, + 34904, + 34905, + 34906, + 34907, + 34908, + 34909, + 34910, + 34911, + 34912, + 34913, + 34914, + 34915, + 34916, + 34917, + 34918, + 34919, + 34920, + 34921, + 34922, + 34923, + 34924, + 34925, + 34926, + 34927, + 34928, + 34929, + 34930, + 34931, + 34932, + 34933, + 34934, + 34935, + 34936, + 34937, + 34938, + 34939, + 34940, + 34941, + 34942, + 34943, + 34944, + 34945, + 34946, + 34947, + 34948, + 34949, + 34950, + 34951, + 34952, + 34953, + 34954, + 34955, + 34956, + 34957, + 34958, + 34959, + 34960, + 34961, + 34962, + 34963, + 34964, + 34965, + 34966, + 34967, + 34968, + 34969, + 34970, + 34971, + 34972, + 34973, + 34974, + 34975, + 34976, + 34977, + 34978, + 34979, + 34981, + 34982, + 34983, + 34984, + 34985, + 34986, + 34987, + 34988, + 34989, + 34990, + 34991, + 34992, + 34993, + 34994, + 34995, + 34996, + 34997, + 34998, + 34999, + 35000, + 35001, + 35002, + 35003, + 35004, + 35005, + 35006, + 35007, + 35008, + 35009, + 35010, + 35011, + 35012, + 35013, + 35014, + 35015, + 35016, + 35017, + 35018, + 35019, + 35020, + 35021, + 35022, + 35023, + 35024, + 35025, + 35026, + 35027, + 35028, + 35029, + 35030, + 35031, + 35032, + 35033, + 35034, + 35035, + 35036, + 35037, + 35038, + 35039, + 35040, + 35041, + 35042, + 35043, + 35044, + 35045, + 35046, + 35047, + 35048, + 35049, + 35050, + 35051, + 35052, + 35053, + 35054, + 35055, + 35056, + 35057, + 35058, + 35059, + 35060, + 35061, + 35062, + 35063, + 35064, + 35065, + 35066, + 35067, + 35068, + 35069, + 35070, + 35071, + 35072, + 35073, + 35074, + 35075, + 35076, + 35077, + 35078, + 35079, + 35080, + 35081, + 35082, + 35083, + 35084, + 35085, + 35086, + 35087, + 35088, + 35089, + 35090, + 35091, + 35092, + 35093, + 35094, + 35095, + 35096, + 35097, + 35098, + 35099, + 35100, + 35101, + 35102, + 35103, + 35104, + 35105, + 35106, + 35107, + 35108, + 35109, + 35110, + 35111, + 35112, + 35113, + 35114, + 35115, + 35116, + 35117, + 35118, + 35119, + 35120, + 35121, + 35122, + 35123, + 35124, + 35125, + 35126, + 35127, + 35128, + 35129, + 35130, + 35131, + 35132, + 35133, + 35134, + 35135, + 35136, + 35137, + 35138, + 35139, + 35140, + 35141, + 35142, + 35143, + 35144, + 35145, + 35146, + 35147, + 35148, + 35149, + 35150, + 35151, + 35152, + 35153, + 35154, + 35155, + 35156, + 35157, + 35158, + 35159, + 35160, + 35161, + 35162, + 35163, + 35164, + 35165, + 35166, + 35167, + 35168, + 35169, + 35170, + 35171, + 35172, + 35173, + 35174, + 35175, + 35176, + 35177, + 35178, + 35179, + 35180, + 35181, + 35182, + 35183, + 35184, + 35185, + 35186, + 35187, + 35188, + 35189, + 35190, + 35191, + 35192, + 35193, + 35194, + 35195, + 35196, + 35198, + 35199, + 35200, + 35201, + 35202, + 35203, + 35204, + 35205, + 35206, + 35207, + 35208, + 35209, + 35210, + 35211, + 35212, + 35213, + 35214, + 35215, + 35216, + 35217, + 35218, + 35219, + 35220, + 35221, + 35222, + 35223, + 35224, + 35225, + 35226, + 35227, + 35228, + 35229, + 35230, + 35231, + 35232, + 35233, + 35234, + 35235, + 35236, + 35237, + 35238, + 35239, + 35240, + 35241, + 35242, + 35243, + 35244, + 35245, + 35246, + 35247, + 35248, + 35249, + 35250, + 35251, + 35252, + 35253, + 35254, + 35255, + 35256, + 35257, + 35258, + 35259, + 35261, + 35262, + 35263, + 35264, + 35265, + 35266, + 35267, + 35268, + 35269, + 35270, + 35271, + 35272, + 35273, + 35274, + 35275, + 35276, + 35277, + 35278, + 35279, + 35280, + 35281, + 35282, + 35283, + 35284, + 35285, + 35286, + 35287, + 35288, + 35289, + 35290, + 35291, + 35292, + 35293, + 35294, + 35295, + 35296, + 35297, + 35298, + 35299, + 35300, + 35301, + 35302, + 35303, + 35304, + 35305, + 35306, + 35307, + 35308, + 35309, + 35310, + 35311, + 35313, + 35314, + 35315, + 35316, + 35317, + 35318, + 35319, + 35320, + 35321, + 35322, + 35323, + 35324, + 35325, + 35326, + 35327, + 35328, + 35329, + 35330, + 35331, + 35332, + 35333, + 35334, + 35335, + 35336, + 35337, + 35338, + 35339, + 35340, + 35341, + 35342, + 35343, + 35344, + 35345, + 35346, + 35347, + 35348, + 35349, + 35350, + 35351, + 35352, + 35353, + 35354, + 35355, + 35356, + 35357, + 35358, + 35359, + 35360, + 35361, + 35362, + 35363, + 35364, + 35365, + 35366, + 35367, + 35369, + 35370, + 35371, + 35372, + 35374, + 35375, + 35376, + 35377, + 35378, + 35379, + 35380, + 35381, + 35382, + 35383, + 35384, + 35385, + 35386, + 35387, + 35388, + 35389, + 35390, + 35391, + 35392, + 35393, + 35394, + 35395, + 35396, + 35397, + 35398, + 35399, + 35400, + 35401, + 35402, + 35403, + 35404, + 35405, + 35406, + 35407, + 35408, + 35409, + 35410, + 35411, + 35412, + 35413, + 35414, + 35415, + 35416, + 35417, + 35418, + 35420, + 35421, + 35422, + 35423, + 35424, + 35425, + 35426, + 35427, + 35428, + 35429, + 35430, + 35432, + 35433, + 35434, + 35435, + 35436, + 35438, + 35439, + 35440, + 35441, + 35442, + 35443, + 35444, + 35445, + 35446, + 35447, + 35448, + 35449, + 35450, + 35451, + 35453, + 35454, + 35455, + 35456, + 35457, + 35458, + 35459, + 35460, + 35461, + 35462, + 35463, + 35464, + 35465, + 35466, + 35467, + 35468, + 35469, + 35470, + 35471, + 35472, + 35473, + 35474, + 35475, + 35476, + 35477, + 35478, + 35479, + 35480, + 35481, + 35482, + 35483, + 35484, + 35486, + 35487, + 35488, + 35489, + 35490, + 35491, + 35492, + 35493, + 35494, + 35495, + 35496, + 35497, + 35498, + 35499, + 35500, + 35501, + 35502, + 35503, + 35504, + 35505, + 35506, + 35507, + 35509, + 35510, + 35511, + 35512, + 35513, + 35514, + 35515, + 35516, + 35517, + 35518, + 35519, + 35520, + 35521, + 35522, + 35523, + 35524, + 35525, + 35526, + 35527, + 35528, + 35529, + 35530, + 35531, + 35532, + 35533, + 35534, + 35535, + 35536, + 35537, + 35538, + 35539, + 35540, + 35541, + 35542, + 35543, + 35544, + 35545, + 35546, + 35547, + 35549, + 35550, + 35551, + 35552, + 35553, + 35554, + 35555, + 35556, + 35557, + 35558, + 35559, + 35560, + 35561, + 35562, + 35564, + 35565, + 35566, + 35567, + 35568, + 35569, + 35570, + 35571, + 35572, + 35573, + 35574, + 35576, + 35577, + 35578, + 35579, + 35580, + 35581, + 35582, + 35583, + 35584, + 35585, + 35586, + 35587, + 35588, + 35589, + 35590, + 35591, + 35592, + 35593, + 35594, + 35595, + 35596, + 35597, + 35598, + 35599, + 35600, + 35601, + 35602, + 35603, + 35604, + 35605, + 35606, + 35607, + 35608, + 35609, + 35610, + 35611, + 35612, + 35613, + 35614, + 35615, + 35616, + 35617, + 35618, + 35619, + 35620, + 35621, + 35622, + 35624, + 35625, + 35626, + 35627, + 35628, + 35629, + 35630, + 35631, + 35632, + 35633, + 35634, + 35635, + 35636, + 35637, + 35638, + 35640, + 35641, + 35642, + 35643, + 35644, + 35645, + 35646, + 35647, + 35649, + 35650, + 35651, + 35652, + 35653, + 35654, + 35655, + 35656, + 35657, + 35658, + 35659, + 35660, + 35661, + 35662, + 35663, + 35664, + 35665, + 35666, + 35667, + 35668, + 35669, + 35670, + 35671, + 35672, + 35673, + 35674, + 35675, + 35676, + 35677, + 35678, + 35679, + 35680, + 35681, + 35682, + 35683, + 35684, + 35685, + 35686, + 35687, + 35688, + 35689, + 35690, + 35691, + 35692, + 35693, + 35694, + 35695, + 35696, + 35697, + 35698, + 35699, + 35700, + 35701, + 35702, + 35703, + 35704, + 35705, + 35707, + 35708, + 35709, + 35710, + 35711, + 35712, + 35713, + 35714, + 35715, + 35716, + 35717, + 35718, + 35720, + 35721, + 35722, + 35723, + 35724, + 35725, + 35726, + 35727, + 35728, + 35729, + 35730, + 35731, + 35732, + 35733, + 35734, + 35735, + 35736, + 35737, + 35738, + 35739, + 35740, + 35741, + 35742, + 35743, + 35744, + 35745, + 35746, + 35747, + 35748, + 35749, + 35750, + 35751, + 35752, + 35753, + 35754, + 35755, + 35756, + 35757, + 35758, + 35759, + 35760, + 35761, + 35762, + 35763, + 35764, + 35765, + 35766, + 35768, + 35769, + 35770, + 35771, + 35772, + 35773, + 35774, + 35775, + 35776, + 35777, + 35778, + 35779, + 35780, + 35781, + 35782, + 35783, + 35784, + 35785, + 35786, + 35787, + 35788, + 35789, + 35790, + 35791, + 35792, + 35793, + 35794, + 35795, + 35796, + 35797, + 35798, + 35799, + 35800, + 35801, + 35802, + 35803, + 35804, + 35805, + 35806, + 35807, + 35808, + 35809, + 35810, + 35811, + 35812, + 35813, + 35814, + 35815, + 35816, + 35817, + 35818, + 35819, + 35820, + 35821, + 35822, + 35823, + 35824, + 35825, + 35826, + 35827, + 35828, + 35829, + 35830, + 35831, + 35832, + 35833, + 35834, + 35835, + 35836, + 35837, + 35838, + 35839, + 35840, + 35841, + 35842, + 35843, + 35844, + 35845, + 35846, + 35847, + 35848, + 35849, + 35850, + 35851, + 35852, + 35853, + 35854, + 35855, + 35856, + 35857, + 35858, + 35859, + 35860, + 35861, + 35862, + 35863, + 35864, + 35865, + 35866, + 35867, + 35868, + 35869, + 35870, + 35871, + 35872, + 35873, + 35874, + 35875, + 35876, + 35877, + 35878, + 35879, + 35880, + 35881, + 35882, + 35883, + 35884, + 35885, + 35886, + 35887, + 35888, + 35889, + 35890, + 35891, + 35892, + 35893, + 35894, + 35895, + 35896, + 35897, + 35898, + 35900, + 35901, + 35902, + 35903, + 35904, + 35905, + 35906, + 35907, + 35908, + 35909, + 35910, + 35911, + 35912, + 35913, + 35914, + 35915, + 35916, + 35917, + 35919, + 35920, + 35921, + 35922, + 35923, + 35924, + 35925, + 35926, + 35927, + 35928, + 35929, + 35930, + 35931, + 35932, + 35933, + 35934, + 35935, + 35936, + 35937, + 35938, + 35939, + 35940, + 35941, + 35942, + 35943, + 35945, + 35946, + 35947, + 35948, + 35949, + 35950, + 35951, + 35952, + 35954, + 35955, + 35956, + 35957, + 35958, + 35959, + 35960, + 35961, + 35962, + 35963, + 35964, + 35965, + 35966, + 35967, + 35968, + 35969, + 35970, + 35971, + 35972, + 35973, + 35974, + 35975, + 35976, + 35977, + 35978, + 35979, + 35980, + 35981, + 35982, + 35983, + 35984, + 35985, + 35986, + 35987, + 35988, + 35989, + 35990, + 35991, + 35992, + 35993, + 35994, + 35995, + 35996, + 35997, + 35998, + 35999, + 36000, + 36001, + 36002, + 36003, + 36004, + 36005, + 36006, + 36008, + 36009, + 36010, + 36011, + 36012, + 36013, + 36014, + 36015, + 36016, + 36017, + 36018, + 36019, + 36020, + 36021, + 36022, + 36023, + 36024, + 36025, + 36026, + 36027, + 36028, + 36029, + 36030, + 36031, + 36032, + 36033, + 36034, + 36035, + 36036, + 36037, + 36038, + 36039, + 36040, + 36041, + 36042, + 36043, + 36044, + 36045, + 36046, + 36047, + 36048, + 36049, + 36050, + 36051, + 36052, + 36053, + 36054, + 36055, + 36056, + 36057, + 36058, + 36059, + 36060, + 36061, + 36062, + 36063, + 36064, + 36065, + 36066, + 36067, + 36068, + 36069, + 36070, + 36071, + 36072, + 36073, + 36074, + 36075, + 36076, + 36077, + 36078, + 36079, + 36080, + 36081, + 36082, + 36083, + 36084, + 36085, + 36086, + 36087, + 36088, + 36089, + 36090, + 36091, + 36092, + 36093, + 36094, + 36095, + 36096, + 36097, + 36098, + 36099, + 36100, + 36101, + 36102, + 36103, + 36104, + 36105, + 36106, + 36107, + 36108, + 36109, + 36110, + 36111, + 36112, + 36113, + 36114, + 36115, + 36116, + 36117, + 36118, + 36119, + 36120, + 36121, + 36122, + 36123, + 36124, + 36125, + 36126, + 36127, + 36128, + 36130, + 36131, + 36132, + 36133, + 36134, + 36135, + 36136, + 36137, + 36138, + 36139, + 36140, + 36141, + 36142, + 36143, + 36144, + 36145, + 36146, + 36147, + 36148, + 36149, + 36150, + 36151, + 36152, + 36153, + 36154, + 36155, + 36156, + 36157, + 36158, + 36159, + 36160, + 36161, + 36162, + 36163, + 36164, + 36165, + 36166, + 36167, + 36168, + 36170, + 36171, + 36172, + 36173, + 36174, + 36175, + 36176, + 36177, + 36178, + 36179, + 36180, + 36181, + 36182, + 36183, + 36184, + 36185, + 36186, + 36187, + 36188, + 36189, + 36190, + 36191, + 36192, + 36193, + 36194, + 36195, + 36196, + 36198, + 36199, + 36200, + 36201, + 36202, + 36203, + 36204, + 36205, + 36206, + 36207, + 36208, + 36209, + 36210, + 36211, + 36212, + 36213, + 36214, + 36215, + 36216, + 36217, + 36218, + 36219, + 36220, + 36221, + 36222, + 36223, + 36224, + 36225, + 36226, + 36227, + 36228, + 36229, + 36230, + 36231, + 36232, + 36233, + 36234, + 36235, + 36237, + 36238, + 36239, + 36240, + 36241, + 36242, + 36243, + 36244, + 36245, + 36246, + 36247, + 36248, + 36249, + 36250, + 36251, + 36252, + 36253, + 36254, + 36256, + 36257, + 36258, + 36259, + 36260, + 36261, + 36262, + 36263, + 36264, + 36265, + 36266, + 36267, + 36268, + 36269, + 36270, + 36271, + 36272, + 36273, + 36274, + 36275, + 36276, + 36278, + 36279, + 36280, + 36281, + 36282, + 36283, + 36284, + 36285, + 36286, + 36287, + 36288, + 36289, + 36290, + 36291, + 36292, + 36293, + 36294, + 36295, + 36296, + 36297, + 36298, + 36299, + 36300, + 36301, + 36302, + 36303, + 36304, + 36305, + 36306, + 36307, + 36308, + 36309, + 36310, + 36311, + 36312, + 36313, + 36314, + 36315, + 36316, + 36317, + 36318, + 36319, + 36320, + 36321, + 36322, + 36323, + 36325, + 36326, + 36327, + 36328, + 36329, + 36330, + 36331, + 36333, + 36334, + 36335, + 36336, + 36337, + 36338, + 36339, + 36340, + 36341, + 36342, + 36343, + 36344, + 36345, + 36346, + 36347, + 36348, + 36349, + 36350, + 36351, + 36352, + 36353, + 36354, + 36355, + 36356, + 36357, + 36358, + 36359, + 36360, + 36361, + 36362, + 36363, + 36364, + 36365, + 36366, + 36368, + 36369, + 36370, + 36371, + 36372, + 36373, + 36374, + 36375, + 36376, + 36378, + 36379, + 36380, + 36381, + 36382, + 36383, + 36384, + 36385, + 36386, + 36387, + 36388, + 36389, + 36390, + 36391, + 36392, + 36393, + 36394, + 36395, + 36396, + 36397, + 36398, + 36399, + 36400, + 36401, + 36402, + 36403, + 36404, + 36405, + 36406, + 36407, + 36408, + 36409, + 36410, + 36411, + 36412, + 36413, + 36414, + 36415, + 36416, + 36417, + 36418, + 36419, + 36420, + 36421, + 36422, + 36423, + 36424, + 36425, + 36426, + 36427, + 36428, + 36429, + 36430, + 36431, + 36432, + 36433, + 36434, + 36435, + 36436, + 36437, + 36438, + 36439, + 36440, + 36441, + 36442, + 36443, + 36444, + 36445, + 36446, + 36447, + 36448, + 36449, + 36450, + 36451, + 36452, + 36453, + 36454, + 36455, + 36456, + 36457, + 36458, + 36459, + 36460, + 36461, + 36462, + 36464, + 36465, + 36466, + 36467, + 36468, + 36469, + 36470, + 36472, + 36473, + 36474, + 36475, + 36476, + 36477, + 36478, + 36479, + 36480, + 36481, + 36482, + 36483, + 36484, + 36485, + 36486, + 36487, + 36488, + 36489, + 36490, + 36491, + 36492, + 36493, + 36494, + 36495, + 36496, + 36497, + 36498, + 36499, + 36500, + 36501, + 36502, + 36503, + 36504, + 36505, + 36506, + 36507, + 36508, + 36509, + 36510, + 36511, + 36512, + 36513, + 36514, + 36515, + 36516, + 36517, + 36518, + 36519, + 36520, + 36521, + 36522, + 36523, + 36524, + 36525, + 36526, + 36527, + 36528, + 36529, + 36530, + 36531, + 36532, + 36533, + 36534, + 36535, + 36536, + 36537, + 36538, + 36539, + 36540, + 36541, + 36542, + 36543, + 36544, + 36545, + 36546, + 36547, + 36548, + 36549, + 36550, + 36551, + 36552, + 36553, + 36554, + 36555, + 36556, + 36557, + 36558, + 36559, + 36560, + 36561, + 36562, + 36563, + 36564, + 36565, + 36566, + 36567, + 36568, + 36569, + 36570, + 36571, + 36572, + 36573, + 36574, + 36575, + 36576, + 36577, + 36578, + 36579, + 36580, + 36581, + 36582, + 36583, + 36584, + 36585, + 36586, + 36587, + 36588, + 36589, + 36590, + 36591, + 36592, + 36593, + 36594, + 36595, + 36596, + 36597, + 36598, + 36599, + 36600, + 36601, + 36602, + 36603, + 36604, + 36605, + 36606, + 36607, + 36608, + 36609, + 36610, + 36611, + 36612, + 36613, + 36614, + 36615, + 36616, + 36617, + 36618, + 36619, + 36620, + 36621, + 36622, + 36623, + 36624, + 36625, + 36626, + 36627, + 36628, + 36629, + 36630, + 36631, + 36632, + 36633, + 36634, + 36635, + 36636, + 36637, + 36638, + 36639, + 36640, + 36641, + 36642, + 36643, + 36644, + 36645, + 36646, + 36647, + 36648, + 36649, + 36650, + 36651, + 36652, + 36653, + 36654, + 36655, + 36656, + 36657, + 36658, + 36659, + 36660, + 36661, + 36662, + 36663, + 36664, + 36665, + 36666, + 36667, + 36668, + 36669, + 36670, + 36671, + 36672, + 36673, + 36674, + 36675, + 36676, + 36677, + 36678, + 36679, + 36680, + 36681, + 36682, + 36683, + 36684, + 36685, + 36686, + 36687, + 36688, + 36689, + 36690, + 36691, + 36692, + 36693, + 36694, + 36695, + 36696, + 36697, + 36698, + 36699, + 36700, + 36701, + 36702, + 36703, + 36704, + 36705, + 36706, + 36707, + 36708, + 36709, + 36710, + 36711, + 36712, + 36713, + 36714, + 36715, + 36716, + 36717, + 36718, + 36719, + 36720, + 36721, + 36722, + 36723, + 36724, + 36725, + 36726, + 36727, + 36728, + 36729, + 36730, + 36731, + 36732, + 36733, + 36734, + 36735, + 36736, + 36737, + 36738, + 36739, + 36741, + 36742, + 36743, + 36744, + 36745, + 36746, + 36747, + 36748, + 36749, + 36750, + 36751, + 36752, + 36753, + 36754, + 36755, + 36756, + 36757, + 36758, + 36759, + 36760, + 36761, + 36762, + 36763, + 36764, + 36765, + 36766, + 36767, + 36768, + 36769, + 36770, + 36771, + 36772, + 36773, + 36774, + 36775, + 36776, + 36777, + 36778, + 36779, + 36780, + 36781, + 36782, + 36783, + 36784, + 36785, + 36786, + 36787, + 36788, + 36789, + 36790, + 36791, + 36792, + 36793, + 36794, + 36795, + 36796, + 36797, + 36798, + 36799, + 36800, + 36801, + 36803, + 36804, + 36805, + 36806, + 36807, + 36808, + 36809, + 36810, + 36811, + 36812, + 36813, + 36814, + 36815, + 36816, + 36817, + 36818, + 36819, + 36820, + 36821, + 36822, + 36823, + 36824, + 36825, + 36826, + 36827, + 36828, + 36829, + 36830, + 36831, + 36832, + 36833, + 36834, + 36835, + 36836, + 36837, + 36838, + 36839, + 36840, + 36841, + 36842, + 36843, + 36844, + 36845, + 36846, + 36847, + 36848, + 36849, + 36850, + 36851, + 36852, + 36853, + 36854, + 36855, + 36856, + 36857, + 36858, + 36859, + 36860, + 36861, + 36862, + 36863, + 36864, + 36865, + 36866, + 36867, + 36868, + 36869, + 36870, + 36871, + 36872, + 36873, + 36874, + 36875, + 36876, + 36877, + 36878, + 36879, + 36880, + 36881, + 36882, + 36883, + 36885, + 36886, + 36887, + 36888, + 36889, + 36890, + 36891, + 36892, + 36893, + 36894, + 36895, + 36896, + 36897, + 36898, + 36899, + 36900, + 36901, + 36902, + 36903, + 36904, + 36905, + 36906, + 36907, + 36908, + 36909, + 36910, + 36911, + 36912, + 36913, + 36914, + 36915, + 36916, + 36917, + 36918, + 36919, + 36920, + 36921, + 36922, + 36923, + 36924, + 36925, + 36926, + 36927, + 36928, + 36929, + 36930, + 36931, + 36932, + 36933, + 36934, + 36935, + 36936, + 36937, + 36938, + 36939, + 36940, + 36941, + 36942, + 36943, + 36944, + 36945, + 36946, + 36947, + 36948, + 36949, + 36950, + 36951, + 36952, + 36953, + 36954, + 36955, + 36956, + 36957, + 36958, + 36959, + 36961, + 36962, + 36963, + 36964, + 36965, + 36966, + 36967, + 36968, + 36969, + 36970, + 36971, + 36972, + 36973, + 36974, + 36975, + 36976, + 36977, + 36978, + 36979, + 36980, + 36981, + 36982, + 36983, + 36984, + 36985, + 36986, + 36987, + 36988, + 36989, + 36990, + 36991, + 36992, + 36993, + 36994, + 36995, + 36996, + 36997, + 36998, + 36999, + 37000, + 37001, + 37002, + 37003, + 37004, + 37005, + 37006, + 37007, + 37008, + 37009, + 37010, + 37011, + 37012, + 37013, + 37014, + 37015, + 37016, + 37017, + 37018, + 37019, + 37020, + 37021, + 37022, + 37023, + 37024, + 37025, + 37026, + 37027, + 37028, + 37029, + 37030, + 37031, + 37032, + 37033, + 37034, + 37035, + 37036, + 37037, + 37038, + 37039, + 37040, + 37041, + 37042, + 37043, + 37044, + 37045, + 37046, + 37047, + 37048, + 37049, + 37050, + 37051, + 37052, + 37053, + 37054, + 37055, + 37056, + 37057, + 37058, + 37059, + 37060, + 37061, + 37062, + 37063, + 37064, + 37065, + 37066, + 37067, + 37068, + 37069, + 37070, + 37071, + 37072, + 37073, + 37074, + 37075, + 37076, + 37077, + 37078, + 37079, + 37080, + 37081, + 37082, + 37083, + 37084, + 37085, + 37086, + 37087, + 37088, + 37089, + 37090, + 37091, + 37092, + 37093, + 37094, + 37095, + 37096, + 37097, + 37098, + 37100, + 37101, + 37102, + 37103, + 37104, + 37105, + 37106, + 37107, + 37108, + 37109, + 37110, + 37111, + 37113, + 37114, + 37115, + 37116, + 37117, + 37118, + 37119, + 37120, + 37121, + 37123, + 37124, + 37125, + 37126, + 37127, + 37128, + 37129, + 37130, + 37131, + 37133, + 37134, + 37135, + 37136, + 37137, + 37138, + 37139, + 37140, + 37141, + 37142, + 37143, + 37144, + 37145, + 37146, + 37147, + 37148, + 37149, + 37150, + 37151, + 37152, + 37153, + 37154, + 37155, + 37156, + 37157, + 37158, + 37159, + 37160, + 37161, + 37162, + 37163, + 37164, + 37165, + 37166, + 37167, + 37168, + 37169, + 37170, + 37171, + 37172, + 37173, + 37174, + 37175, + 37176, + 37177, + 37178, + 37179, + 37180, + 37181, + 37182, + 37183, + 37184, + 37185, + 37186, + 37187, + 37188, + 37189, + 37190, + 37191, + 37192, + 37193, + 37194, + 37195, + 37196, + 37197, + 37198, + 37199, + 37200, + 37201, + 37202, + 37203, + 37204, + 37205, + 37206, + 37207, + 37208, + 37209, + 37210, + 37211, + 37212, + 37213, + 37214, + 37215, + 37216, + 37217, + 37218, + 37219, + 37220, + 37221, + 37222, + 37223, + 37224, + 37225, + 37226, + 37227, + 37228, + 37229, + 37230, + 37231, + 37232, + 37233, + 37234, + 37235, + 37236, + 37237, + 37238, + 37239, + 37240, + 37241, + 37242, + 37243, + 37244, + 37245, + 37246, + 37247, + 37248, + 37249, + 37250, + 37251, + 37252, + 37253, + 37254, + 37255, + 37256, + 37257, + 37258, + 37259, + 37260, + 37261, + 37262, + 37263, + 37264, + 37265, + 37266, + 37267, + 37268, + 37269, + 37271, + 37272, + 37273, + 37274, + 37275, + 37276, + 37277, + 37278, + 37279, + 37280, + 37281, + 37282, + 37283, + 37284, + 37285, + 37286, + 37287, + 37288, + 37289, + 37290, + 37291, + 37292, + 37293, + 37294, + 37295, + 37296, + 37297, + 37298, + 37299, + 37300, + 37301, + 37302, + 37303, + 37304, + 37305, + 37306, + 37307, + 37308, + 37309, + 37310, + 37311, + 37312, + 37313, + 37314, + 37315, + 37316, + 37317, + 37318, + 37319, + 37320, + 37321, + 37322, + 37323, + 37324, + 37325, + 37326, + 37327, + 37328, + 37329, + 37330, + 37331, + 37332, + 37333, + 37335, + 37336, + 37337, + 37338, + 37339, + 37340, + 37341, + 37342, + 37343, + 37344, + 37345, + 37346, + 37348, + 37349, + 37350, + 37351, + 37352, + 37353, + 37354, + 37355, + 37356, + 37357, + 37358, + 37359, + 37360, + 37361, + 37362, + 37363, + 37364, + 37365, + 37366, + 37367, + 37368, + 37369, + 37370, + 37371, + 37372, + 37373, + 37374, + 37375, + 37376, + 37377, + 37378, + 37379, + 37380, + 37381, + 37382, + 37383, + 37384, + 37385, + 37386, + 37387, + 37388, + 37389, + 37390, + 37391, + 37392, + 37393, + 37395, + 37396, + 37397, + 37398, + 37399, + 37400, + 37401, + 37402, + 37403, + 37404, + 37405, + 37406, + 37407, + 37408, + 37409, + 37410, + 37411, + 37412, + 37413, + 37414, + 37415, + 37416, + 37417, + 37418, + 37419, + 37420, + 37421, + 37422, + 37423, + 37424, + 37425, + 37426, + 37427, + 37428, + 37429, + 37430, + 37431, + 37432, + 37433, + 37435, + 37436, + 37437, + 37438, + 37439, + 37440, + 37441, + 37442, + 37443, + 37444, + 37445, + 37446, + 37447, + 37448, + 37449, + 37450, + 37451, + 37452, + 37453, + 37454, + 37455, + 37456, + 37457, + 37458, + 37459, + 37460, + 37461, + 37462, + 37463, + 37464, + 37465, + 37466, + 37467, + 37468, + 37469, + 37470, + 37471, + 37472, + 37473, + 37474, + 37475, + 37476, + 37477, + 37478, + 37479, + 37480, + 37481, + 37482, + 37483, + 37484, + 37486, + 37487, + 37488, + 37489, + 37490, + 37491, + 37492, + 37493, + 37494, + 37495, + 37496, + 37497, + 37498, + 37499, + 37500, + 37501, + 37502, + 37503, + 37504, + 37505, + 37506, + 37507, + 37508, + 37509, + 37510, + 37511, + 37512, + 37513, + 37514, + 37515, + 37516, + 37517, + 37518, + 37519, + 37520, + 37521, + 37522, + 37523, + 37524, + 37525, + 37526, + 37527, + 37528, + 37529, + 37530, + 37531, + 37532, + 37533, + 37534, + 37535, + 37536, + 37537, + 37538, + 37539, + 37540, + 37541, + 37542, + 37543, + 37544, + 37545, + 37546, + 37547, + 37549, + 37550, + 37551, + 37552, + 37553, + 37554, + 37555, + 37556, + 37557, + 37558, + 37559, + 37560, + 37562, + 37563, + 37564, + 37565, + 37566, + 37567, + 37568, + 37569, + 37570, + 37571, + 37572, + 37573, + 37574, + 37576, + 37577, + 37578, + 37579, + 37580, + 37581, + 37582, + 37583, + 37584, + 37585, + 37586, + 37587, + 37588, + 37589, + 37590, + 37591, + 37592, + 37593, + 37594, + 37595, + 37596, + 37597, + 37598, + 37599, + 37600, + 37601, + 37602, + 37603, + 37604, + 37605, + 37606, + 37607, + 37608, + 37609, + 37610, + 37611, + 37612, + 37613, + 37614, + 37615, + 37616, + 37617, + 37618, + 37619, + 37620, + 37621, + 37622, + 37623, + 37624, + 37625, + 37626, + 37627, + 37628, + 37629, + 37630, + 37631, + 37632, + 37633, + 37634, + 37635, + 37636, + 37637, + 37638, + 37639, + 37640, + 37641, + 37642, + 37643, + 37644, + 37645, + 37646, + 37647, + 37648, + 37650, + 37651, + 37652, + 37653, + 37654, + 37655, + 37656, + 37657, + 37658, + 37659, + 37660, + 37661, + 37662, + 37663, + 37664, + 37665, + 37666, + 37667, + 37668, + 37669, + 37670, + 37671, + 37672, + 37673, + 37674, + 37675, + 37676, + 37677, + 37678, + 37679, + 37680, + 37681, + 37682, + 37683, + 37684, + 37685, + 37686, + 37687, + 37688, + 37689, + 37690, + 37691, + 37692, + 37693, + 37694, + 37695, + 37696, + 37697, + 37698, + 37699, + 37700, + 37701, + 37702, + 37703, + 37704, + 37705, + 37706, + 37707, + 37708, + 37709, + 37710, + 37711, + 37713, + 37714, + 37715, + 37716, + 37717, + 37718, + 37719, + 37720, + 37721, + 37722, + 37723, + 37724, + 37725, + 37726, + 37727, + 37728, + 37729, + 37730, + 37731, + 37732, + 37733, + 37734, + 37735, + 37736, + 37737, + 37738, + 37739, + 37740, + 37741, + 37742, + 37743, + 37744, + 37745, + 37746, + 37747, + 37748, + 37749, + 37750, + 37751, + 37752, + 37753, + 37754, + 37755, + 37756, + 37757, + 37758, + 37759, + 37760, + 37761, + 37762, + 37763, + 37764, + 37765, + 37766, + 37767, + 37768, + 37769, + 37770, + 37771, + 37772, + 37773, + 37774, + 37775, + 37776, + 37777, + 37778, + 37779, + 37780, + 37781, + 37782, + 37783, + 37784, + 37785, + 37786, + 37787, + 37788, + 37789, + 37790, + 37791, + 37792, + 37793, + 37794, + 37795, + 37796, + 37797, + 37798, + 37799, + 37800, + 37801, + 37802, + 37803, + 37804, + 37805, + 37806, + 37807, + 37808, + 37809, + 37810, + 37811, + 37812, + 37813, + 37814, + 37815, + 37816, + 37817, + 37818, + 37819, + 37820, + 37821, + 37822, + 37824, + 37825, + 37826, + 37827, + 37828, + 37829, + 37830, + 37831, + 37832, + 37833, + 37834, + 37835, + 37836, + 37837, + 37838, + 37839, + 37840, + 37841, + 37842, + 37843, + 37844, + 37845, + 37846, + 37847, + 37848, + 37849, + 37850, + 37851, + 37852, + 37853, + 37854, + 37855, + 37857, + 37858, + 37859, + 37860, + 37861, + 37862, + 37863, + 37864, + 37865, + 37866, + 37867, + 37868, + 37869, + 37870, + 37871, + 37872, + 37873, + 37874, + 37875, + 37876, + 37877, + 37878, + 37879, + 37880, + 37881, + 37882, + 37883, + 37884, + 37885, + 37886, + 37887, + 37888, + 37889, + 37890, + 37891, + 37892, + 37895, + 37896, + 37897, + 37898, + 37899, + 37900, + 37901, + 37902, + 37903, + 37904, + 37905, + 37906, + 37907, + 37908, + 37909, + 37910, + 37911, + 37912, + 37913, + 37914, + 37915, + 37916, + 37917, + 37918, + 37919, + 37920, + 37921, + 37923, + 37924, + 37925, + 37926, + 37927, + 37928, + 37929, + 37930, + 37931, + 37933, + 37934, + 37935, + 37936, + 37937, + 37938, + 37939, + 37940, + 37941, + 37942, + 37943, + 37944, + 37945, + 37946, + 37947, + 37948, + 37949, + 37950, + 37951, + 37952, + 37953, + 37954, + 37955, + 37956, + 37957, + 37958, + 37959, + 37960, + 37961, + 37963, + 37964, + 37965, + 37966, + 37967, + 37968, + 37969, + 37970, + 37971, + 37972, + 37973, + 37974, + 37975, + 37976, + 37977, + 37978, + 37979, + 37980, + 37981, + 37983, + 37984, + 37985, + 37986, + 37987, + 37988, + 37989, + 37990, + 37991, + 37992, + 37993, + 37994, + 37995, + 37996, + 37997, + 37998, + 37999, + 38000, + 38001, + 38002, + 38003, + 38004, + 38005, + 38006, + 38007, + 38008, + 38009, + 38010, + 38011, + 38012, + 38013, + 38014, + 38015, + 38016, + 38017, + 38018, + 38019, + 38020, + 38021, + 38022, + 38024, + 38025, + 38026, + 38027, + 38028, + 38029, + 38030, + 38031, + 38032, + 38033, + 38034, + 38035, + 38036, + 38037, + 38038, + 38039, + 38040, + 38041, + 38042, + 38043, + 38044, + 38045, + 38046, + 38047, + 38048, + 38049, + 38050, + 38051, + 38052, + 38053, + 38055, + 38056, + 38057, + 38058, + 38059, + 38060, + 38061, + 38062, + 38063, + 38064, + 38065, + 38066, + 38067, + 38068, + 38069, + 38070, + 38071, + 38072, + 38073, + 38074, + 38075, + 38076, + 38077, + 38078, + 38079, + 38080, + 38081, + 38082, + 38083, + 38084, + 38085, + 38086, + 38087, + 38088, + 38089, + 38090, + 38091, + 38092, + 38093, + 38094, + 38095, + 38096, + 38097, + 38098, + 38099, + 38100, + 38101, + 38102, + 38103, + 38104, + 38105, + 38106, + 38107, + 38108, + 38109, + 38110, + 38111, + 38112, + 38113, + 38114, + 38115, + 38116, + 38117, + 38118, + 38119, + 38120, + 38121, + 38122, + 38123, + 38125, + 38126, + 38127, + 38128, + 38129, + 38130, + 38131, + 38132, + 38133, + 38134, + 38135, + 38136, + 38137, + 38138, + 38139, + 38140, + 38141, + 38142, + 38143, + 38144, + 38145, + 38146, + 38147, + 38148, + 38149, + 38150, + 38151, + 38152, + 38153, + 38154, + 38155, + 38156, + 38157, + 38158, + 38159, + 38160, + 38161, + 38162, + 38163, + 38164, + 38165, + 38166, + 38167, + 38168, + 38169, + 38170, + 38171, + 38172, + 38173, + 38174, + 38175, + 38176, + 38177, + 38178, + 38179, + 38180, + 38181, + 38182, + 38183, + 38184, + 38185, + 38186, + 38187, + 38188, + 38189, + 38190, + 38191, + 38192, + 38193, + 38195, + 38196, + 38197, + 38198, + 38199, + 38200, + 38201, + 38202, + 38203, + 38204, + 38205, + 38206, + 38207, + 38208, + 38209, + 38210, + 38211, + 38212, + 38213, + 38214, + 38215, + 38216, + 38217, + 38218, + 38219, + 38220, + 38221, + 38222, + 38223, + 38224, + 38225, + 38226, + 38227, + 38228, + 38229, + 38230, + 38231, + 38232, + 38233, + 38234, + 38235, + 38236, + 38237, + 38238, + 38239, + 38240, + 38241, + 38242, + 38243, + 38244, + 38245, + 38246, + 38247, + 38248, + 38249, + 38250, + 38251, + 38252, + 38253, + 38254, + 38255, + 38256, + 38257, + 38258, + 38259, + 38260, + 38261, + 38262, + 38263, + 38264, + 38265, + 38267, + 38268, + 38269, + 38270, + 38271, + 38272, + 38273, + 38274, + 38275, + 38276, + 38277, + 38278, + 38279, + 38280, + 38281, + 38282, + 38283, + 38284, + 38285, + 38286, + 38287, + 38288, + 38289, + 38290, + 38291, + 38292, + 38293, + 38294, + 38296, + 38298, + 38299, + 38300, + 38301, + 38302, + 38303, + 38304, + 38305, + 38306, + 38307, + 38308, + 38309, + 38310, + 38311, + 38312, + 38313, + 38314, + 38315, + 38316, + 38317, + 38318, + 38319, + 38320, + 38321, + 38322, + 38323, + 38324, + 38325, + 38326, + 38327, + 38328, + 38329, + 38330, + 38331, + 38332, + 38333, + 38334, + 38335, + 38336, + 38337, + 38338, + 38339, + 38340, + 38341, + 38342, + 38343, + 38344, + 38345, + 38346, + 38347, + 38348, + 38349, + 38350, + 38351, + 38352, + 38353, + 38354, + 38355, + 38356, + 38357, + 38358, + 38359, + 38360, + 38361, + 38362, + 38363, + 38364, + 38365, + 38366, + 38367, + 38368, + 38369, + 38370, + 38371, + 38372, + 38373, + 38374, + 38375, + 38376, + 38377, + 38378, + 38379, + 38380, + 38381, + 38382, + 38383, + 38384, + 38385, + 38386, + 38387, + 38388, + 38389, + 38390, + 38391, + 38392, + 38393, + 38394, + 38395, + 38396, + 38397, + 38398, + 38399, + 38400, + 38401, + 38402, + 38403, + 38404, + 38405, + 38406, + 38407, + 38408, + 38410, + 38411, + 38412, + 38413, + 38414, + 38415, + 38416, + 38417, + 38418, + 38419, + 38420, + 38421, + 38422, + 38423, + 38424, + 38425, + 38426, + 38427, + 38429, + 38430, + 38431, + 38432, + 38433, + 38434, + 38435, + 38436, + 38437, + 38438, + 38439, + 38440, + 38441, + 38442, + 38443, + 38444, + 38445, + 38446, + 38447, + 38448, + 38449, + 38450, + 38451, + 38452, + 38453, + 38454, + 38455, + 38456, + 38457, + 38458, + 38459, + 38460, + 38461, + 38462, + 38463, + 38464, + 38465, + 38466, + 38467, + 38468, + 38469, + 38470, + 38471, + 38472, + 38473, + 38474, + 38475, + 38476, + 38477, + 38478, + 38479, + 38480, + 38481, + 38482, + 38483, + 38484, + 38485, + 38486, + 38487, + 38488, + 38489, + 38490, + 38491, + 38492, + 38493, + 38494, + 38495, + 38496, + 38497, + 38498, + 38499, + 38500, + 38501, + 38502, + 38503, + 38504, + 38505, + 38506, + 38507, + 38508, + 38509, + 38510, + 38511, + 38512, + 38513, + 38514, + 38515, + 38516, + 38517, + 38518, + 38519, + 38520, + 38521, + 38522, + 38523, + 38524, + 38525, + 38526, + 38527, + 38528, + 38529, + 38530, + 38531, + 38532, + 38533, + 38534, + 38535, + 38536, + 38537, + 38538, + 38539, + 38540, + 38541, + 38542, + 38543, + 38544, + 38545, + 38546, + 38547, + 38548, + 38549, + 38550, + 38551, + 38553, + 38554, + 38555, + 38556, + 38557, + 38558, + 38559, + 38560, + 38561, + 38562, + 38563, + 38564, + 38565, + 38566, + 38567, + 38568, + 38569, + 38570, + 38571, + 38572, + 38573, + 38574, + 38575, + 38576, + 38577, + 38578, + 38579, + 38580, + 38581, + 38582, + 38583, + 38584, + 38585, + 38586, + 38587, + 38588, + 38589, + 38590, + 38591, + 38592, + 38593, + 38594, + 38595, + 38596, + 38597, + 38598, + 38599, + 38601, + 38602, + 38603, + 38604, + 38605, + 38606, + 38607, + 38608, + 38609, + 38610, + 38611, + 38612, + 38613, + 38614, + 38615, + 38616, + 38617, + 38618, + 38619, + 38620, + 38621, + 38622, + 38623, + 38624, + 38625, + 38626, + 38627, + 38628, + 38629, + 38630, + 38631, + 38632, + 38633, + 38634, + 38635, + 38636, + 38637, + 38638, + 38639, + 38640, + 38641, + 38642, + 38643, + 38644, + 38645, + 38646, + 38647, + 38648, + 38649, + 38650, + 38651, + 38652, + 38653, + 38654, + 38655, + 38656, + 38657, + 38658, + 38659, + 38660, + 38661, + 38662, + 38663, + 38664, + 38665, + 38666, + 38667, + 38668, + 38669, + 38670, + 38671, + 38672, + 38673, + 38674, + 38675, + 38676, + 38677, + 38678, + 38679, + 38680, + 38681, + 38682, + 38683, + 38684, + 38685, + 38686, + 38687, + 38688, + 38689, + 38690, + 38691, + 38692, + 38693, + 38694, + 38695, + 38696, + 38697, + 38698, + 38699, + 38700, + 38701, + 38702, + 38703, + 38704, + 38705, + 38706, + 38707, + 38708, + 38710, + 38711, + 38712, + 38713, + 38714, + 38715, + 38716, + 38717, + 38718, + 38719, + 38720, + 38721, + 38722, + 38723, + 38724, + 38725, + 38726, + 38727, + 38728, + 38729, + 38730, + 38731, + 38732, + 38733, + 38734, + 38735, + 38736, + 38737, + 38738, + 38739, + 38740, + 38741, + 38742, + 38743, + 38744, + 38745, + 38746, + 38747, + 38748, + 38749, + 38750, + 38751, + 38752, + 38753, + 38754, + 38755, + 38756, + 38757, + 38758, + 38759, + 38760, + 38761, + 38762, + 38763, + 38764, + 38765, + 38767, + 38768, + 38769, + 38770, + 38771, + 38772, + 38773, + 38774, + 38775, + 38776, + 38777, + 38778, + 38779, + 38780, + 38781, + 38782, + 38783, + 38784, + 38785, + 38787, + 38788, + 38789, + 38790, + 38791, + 38792, + 38793, + 38795, + 38796, + 38797, + 38798, + 38799, + 38800, + 38801, + 38802, + 38803, + 38804, + 38805, + 38806, + 38807, + 38808, + 38809, + 38810, + 38811, + 38812, + 38813, + 38814, + 38815, + 38816, + 38817, + 38818, + 38819, + 38820, + 38821, + 38822, + 38823, + 38824, + 38825, + 38826, + 38827, + 38828, + 38829, + 38830, + 38831, + 38832, + 38833, + 38834, + 38835, + 38836, + 38837, + 38838, + 38839, + 38840, + 38841, + 38842, + 38843, + 38844, + 38845, + 38846, + 38847, + 38848, + 38849, + 38850, + 38851, + 38852, + 38853, + 38854, + 38855, + 38856, + 38857, + 38858, + 38859, + 38860, + 38861, + 38862, + 38863, + 38864, + 38865, + 38866, + 38867, + 38868, + 38869, + 38870, + 38871, + 38872, + 38873, + 38874, + 38875, + 38876, + 38877, + 38879, + 38880, + 38881, + 38882, + 38883, + 38884, + 38885, + 38886, + 38887, + 38888, + 38889, + 38890, + 38891, + 38892, + 38893, + 38894, + 38895, + 38896, + 38897, + 38898, + 38899, + 38900, + 38901, + 38902, + 38903, + 38904, + 38905, + 38906, + 38907, + 38908, + 38909, + 38910, + 38911, + 38912, + 38914, + 38915, + 38916, + 38917, + 38918, + 38919, + 38920, + 38921, + 38922, + 38923, + 38924, + 38925, + 38926, + 38927, + 38928, + 38929, + 38930, + 38931, + 38932, + 38933, + 38934, + 38935, + 38936, + 38937, + 38938, + 38939, + 38940, + 38941, + 38942, + 38943, + 38944, + 38945, + 38946, + 38947, + 38948, + 38949, + 38950, + 38951, + 38952, + 38953, + 38954, + 38955, + 38956, + 38957, + 38958, + 38959, + 38960, + 38961, + 38962, + 38963, + 38964, + 38965, + 38966, + 38967, + 38968, + 38969, + 38970, + 38971, + 38972, + 38973, + 38974, + 38975, + 38976, + 38977, + 38978, + 38979, + 38980, + 38981, + 38982, + 38983, + 38984, + 38985, + 38986, + 38987, + 38988, + 38989, + 38990, + 38991, + 38992, + 38993, + 38994, + 38995, + 38996, + 38997, + 38998, + 38999, + 39000, + 39001, + 39002, + 39003, + 39004, + 39005, + 39006, + 39007, + 39008, + 39009, + 39010, + 39011, + 39012, + 39013, + 39014, + 39016, + 39018, + 39019, + 39020, + 39021, + 39022, + 39023, + 39024, + 39025, + 39026, + 39027, + 39028, + 39029, + 39030, + 39031, + 39032, + 39033, + 39034, + 39035, + 39036, + 39037, + 39038, + 39039, + 39040, + 39041, + 39042, + 39043, + 39044, + 39045, + 39046, + 39047, + 39048, + 39049, + 39050, + 39051, + 39052, + 39053, + 39054, + 39055, + 39056, + 39057, + 39058, + 39059, + 39060, + 39061, + 39062, + 39063, + 39064, + 39065, + 39066, + 39067, + 39068, + 39069, + 39070, + 39071, + 39072, + 39073, + 39074, + 39075, + 39076, + 39077, + 39078, + 39079, + 39080, + 39081, + 39082, + 39083, + 39084, + 39085, + 39086, + 39087, + 39088, + 39089, + 39090, + 39091, + 39092, + 39093, + 39094, + 39095, + 39096, + 39097, + 39098, + 39099, + 39100, + 39101, + 39102, + 39103, + 39104, + 39105, + 39106, + 39107, + 39108, + 39109, + 39110, + 39111, + 39113, + 39114, + 39115, + 39116, + 39117, + 39118, + 39119, + 39120, + 39121, + 39122, + 39123, + 39124, + 39125, + 39126, + 39127, + 39128, + 39129, + 39130, + 39131, + 39132, + 39133, + 39134, + 39135, + 39136, + 39137, + 39138, + 39139, + 39140, + 39141, + 39142, + 39143, + 39144, + 39145, + 39146, + 39148, + 39149, + 39150, + 39151, + 39152, + 39153, + 39154, + 39155, + 39156, + 39157, + 39158, + 39159, + 39160, + 39161, + 39162, + 39163, + 39164, + 39165, + 39166, + 39167, + 39168, + 39169, + 39170, + 39171, + 39172, + 39173, + 39174, + 39175, + 39176, + 39177, + 39178, + 39179, + 39180, + 39181, + 39182, + 39183, + 39184, + 39185, + 39186, + 39187, + 39188, + 39189, + 39190, + 39191, + 39192, + 39193, + 39194, + 39195, + 39196, + 39197, + 39198, + 39199, + 39200, + 39201, + 39202, + 39203, + 39204, + 39205, + 39206, + 39207, + 39208, + 39209, + 39210, + 39211, + 39212, + 39213, + 39214, + 39216, + 39217, + 39218, + 39219, + 39220, + 39221, + 39222, + 39223, + 39224, + 39225, + 39226, + 39228, + 39229, + 39230, + 39231, + 39232, + 39233, + 39234, + 39235, + 39236, + 39237, + 39238, + 39239, + 39240, + 39241, + 39242, + 39243, + 39244, + 39245, + 39246, + 39247, + 39248, + 39249, + 39250, + 39251, + 39252, + 39253, + 39254, + 39255, + 39256, + 39257, + 39258, + 39260, + 39261, + 39262, + 39263, + 39264, + 39265, + 39266, + 39267, + 39268, + 39269, + 39270, + 39271, + 39272, + 39273, + 39274, + 39275, + 39276, + 39277, + 39278, + 39279, + 39280, + 39281, + 39282, + 39283, + 39284, + 39285, + 39286, + 39287, + 39288, + 39289, + 39290, + 39291, + 39292, + 39293, + 39294, + 39295, + 39296, + 39297, + 39298, + 39299, + 39300, + 39302, + 39303, + 39304, + 39305, + 39306, + 39307, + 39308, + 39309, + 39310, + 39311, + 39312, + 39313, + 39314, + 39315, + 39316, + 39317, + 39318, + 39319, + 39320, + 39321, + 39322, + 39323, + 39324, + 39325, + 39326, + 39327, + 39328, + 39329, + 39330, + 39331, + 39332, + 39333, + 39334, + 39335, + 39336, + 39337, + 39338, + 39339, + 39340, + 39341, + 39342, + 39343, + 39344, + 39345, + 39346, + 39348, + 39349, + 39350, + 39351, + 39352, + 39353, + 39354, + 39355, + 39356, + 39357, + 39358, + 39359, + 39360, + 39361, + 39362, + 39363, + 39364, + 39365, + 39366, + 39367, + 39368, + 39369, + 39370, + 39371, + 39372, + 39373, + 39374, + 39375, + 39376, + 39377, + 39378, + 39379, + 39380, + 39381, + 39382, + 39383, + 39384, + 39385, + 39386, + 39387, + 39388, + 39389, + 39390, + 39392, + 39393, + 39394, + 39395, + 39396, + 39397, + 39398, + 39399, + 39400, + 39401, + 39402, + 39403, + 39405, + 39406, + 39407, + 39408, + 39409, + 39410, + 39412, + 39413, + 39414, + 39415, + 39416, + 39417, + 39418, + 39419, + 39420, + 39421, + 39422, + 39423, + 39424, + 39425, + 39426, + 39427, + 39428, + 39429, + 39430, + 39431, + 39432, + 39433, + 39434, + 39435, + 39436, + 39437, + 39438, + 39439, + 39440, + 39441, + 39442, + 39444, + 39445, + 39446, + 39447, + 39448, + 39449, + 39450, + 39451, + 39452, + 39453, + 39454, + 39455, + 39456, + 39457, + 39458, + 39459, + 39460, + 39461, + 39462, + 39463, + 39464, + 39465, + 39466, + 39467, + 39468, + 39469, + 39470, + 39471, + 39472, + 39473, + 39474, + 39475, + 39476, + 39477, + 39478, + 39479, + 39480, + 39481, + 39482, + 39483, + 39484, + 39485, + 39486, + 39487, + 39488, + 39489, + 39490, + 39491, + 39492, + 39493, + 39494, + 39495, + 39496, + 39497, + 39498, + 39499, + 39500, + 39501, + 39502, + 39504, + 39505, + 39506, + 39507, + 39508, + 39509, + 39510, + 39511, + 39512, + 39513, + 39514, + 39515, + 39516, + 39517, + 39518, + 39519, + 39520, + 39521, + 39522, + 39523, + 39524, + 39525, + 39526, + 39527, + 39528, + 39529, + 39530, + 39531, + 39532, + 39533, + 39534, + 39535, + 39536, + 39537, + 39538, + 39539, + 39540, + 39541, + 39542, + 39543, + 39544, + 39545, + 39546, + 39548, + 39549, + 39550, + 39551, + 39552, + 39553, + 39554, + 39555, + 39556, + 39557, + 39558, + 39559, + 39560, + 39561, + 39562, + 39563, + 39564, + 39565, + 39566, + 39567, + 39568, + 39570, + 39571, + 39573, + 39574, + 39575, + 39576, + 39577, + 39578, + 39579, + 39580, + 39581, + 39582, + 39583, + 39584, + 39585, + 39586, + 39587, + 39588, + 39589, + 39590, + 39591, + 39592, + 39593, + 39594, + 39595, + 39596, + 39597, + 39598, + 39599, + 39600, + 39601, + 39602, + 39603, + 39604, + 39605, + 39606, + 39607, + 39608, + 39609, + 39610, + 39611, + 39612, + 39613, + 39614, + 39615, + 39616, + 39617, + 39618, + 39619, + 39621, + 39622, + 39623, + 39624, + 39625, + 39626, + 39627, + 39628, + 39629, + 39630, + 39631, + 39632, + 39633, + 39634, + 39635, + 39636, + 39637, + 39638, + 39639, + 39640, + 39641, + 39642, + 39643, + 39644, + 39645, + 39646, + 39647, + 39648, + 39649, + 39650, + 39651, + 39652, + 39653, + 39654, + 39655, + 39656, + 39657, + 39658, + 39659, + 39660, + 39661, + 39662, + 39663, + 39664, + 39665, + 39666, + 39667, + 39668, + 39669, + 39670, + 39671, + 39672, + 39673, + 39674, + 39675, + 39676, + 39677, + 39678, + 39679, + 39680, + 39681, + 39682, + 39683, + 39684, + 39685, + 39686, + 39687, + 39688, + 39689, + 39690, + 39691, + 39692, + 39693, + 39694, + 39695, + 39696, + 39697, + 39698, + 39699, + 39700, + 39701, + 39702, + 39703, + 39704, + 39705, + 39706, + 39707, + 39708, + 39709, + 39710, + 39711, + 39712, + 39713, + 39714, + 39715, + 39716, + 39717, + 39718, + 39719, + 39720, + 39721, + 39722, + 39723, + 39724, + 39725, + 39726, + 39727, + 39728, + 39729, + 39730, + 39731, + 39732, + 39733, + 39734, + 39735, + 39736, + 39737, + 39738, + 39739, + 39740, + 39741, + 39742, + 39743, + 39744, + 39745, + 39746, + 39747, + 39748, + 39749, + 39750, + 39751, + 39752, + 39753, + 39754, + 39755, + 39756, + 39757, + 39758, + 39759, + 39760, + 39761, + 39762, + 39763, + 39764, + 39765, + 39766, + 39767, + 39768, + 39769, + 39770, + 39771, + 39772, + 39773, + 39774, + 39775, + 39776, + 39777, + 39778, + 39779, + 39780, + 39781, + 39782, + 39783, + 39784, + 39785, + 39786, + 39787, + 39788, + 39789, + 39790, + 39791, + 39792, + 39793, + 39794, + 39795, + 39796, + 39797, + 39798, + 39799, + 39800, + 39802, + 39803, + 39805, + 39806, + 39807, + 39808, + 39809, + 39810, + 39811, + 39812, + 39813, + 39814, + 39815, + 39816, + 39817, + 39818, + 39819, + 39820, + 39821, + 39822, + 39823, + 39824, + 39825, + 39826, + 39827, + 39828, + 39829, + 39830, + 39831, + 39832, + 39833, + 39834, + 39835, + 39836, + 39837, + 39838, + 39839, + 39840, + 39841, + 39843, + 39844, + 39845, + 39846, + 39847, + 39848, + 39849, + 39850, + 39851, + 39852, + 39853, + 39854, + 39855, + 39856, + 39857, + 39858, + 39859, + 39860, + 39861, + 39862, + 39863, + 39864, + 39865, + 39866, + 39867, + 39868, + 39869, + 39870, + 39871, + 39872, + 39873, + 39874, + 39875, + 39876, + 39877, + 39878, + 39880, + 39881, + 39882, + 39883, + 39884, + 39885, + 39886, + 39887, + 39888, + 39889, + 39890, + 39891, + 39892, + 39893, + 39894, + 39895, + 39896, + 39897, + 39898, + 39899, + 39900, + 39901, + 39902, + 39903, + 39904, + 39905, + 39906, + 39907, + 39908, + 39909, + 39910, + 39911, + 39912, + 39913, + 39914, + 39915, + 39916, + 39917, + 39918, + 39919, + 39920, + 39921, + 39922, + 39923, + 39924, + 39925, + 39926, + 39927, + 39928, + 39929, + 39930, + 39931, + 39932, + 39933, + 39934, + 39935, + 39936, + 39937, + 39938, + 39939, + 39941, + 39942, + 39943, + 39944, + 39945, + 39946, + 39947, + 39948, + 39949, + 39950, + 39951, + 39952, + 39953, + 39954, + 39955, + 39956, + 39957, + 39958, + 39959, + 39960, + 39961, + 39962, + 39963, + 39964, + 39965, + 39966, + 39967, + 39968, + 39970, + 39971, + 39972, + 39973, + 39974, + 39975, + 39976, + 39977, + 39978, + 39979, + 39980, + 39982, + 39983, + 39984, + 39985, + 39986, + 39987, + 39988, + 39989, + 39990, + 39991, + 39992, + 39993, + 39994, + 39995, + 39996, + 39997, + 39998, + 39999, + 40000, + 40001, + 40002, + 40003, + 40004, + 40005, + 40006, + 40007, + 40008, + 40009, + 40010, + 40011, + 40012, + 40013, + 40014, + 40015, + 40016, + 40017, + 40018, + 40019, + 40020, + 40021, + 40023, + 40024, + 40025, + 40026, + 40027, + 40028, + 40029, + 40030, + 40031, + 40032, + 40033, + 40034, + 40035, + 40036, + 40037, + 40038, + 40039, + 40040, + 40041, + 40042, + 40043, + 40044, + 40045, + 40046, + 40047, + 40048, + 40049, + 40050, + 40051, + 40052, + 40053, + 40054, + 40055, + 40056, + 40057, + 40058, + 40059, + 40060, + 40061, + 40062, + 40063, + 40064, + 40065, + 40066, + 40067, + 40068, + 40069, + 40070, + 40071, + 40072, + 40073, + 40074, + 40075, + 40076, + 40077, + 40078, + 40079, + 40080, + 40081, + 40082, + 40083, + 40084, + 40085, + 40086, + 40087, + 40088, + 40089, + 40090, + 40091, + 40092, + 40093, + 40094, + 40095, + 40096, + 40097, + 40098, + 40099, + 40100, + 40101, + 40102, + 40103, + 40104, + 40105, + 40106, + 40107, + 40108, + 40109, + 40110, + 40111, + 40112, + 40113, + 40114, + 40115, + 40116, + 40117, + 40118, + 40119, + 40120, + 40121, + 40122, + 40123, + 40124, + 40125, + 40127, + 40128, + 40129, + 40130, + 40131, + 40132, + 40133, + 40134, + 40135, + 40136, + 40137, + 40138, + 40139, + 40140, + 40141, + 40142, + 40143, + 40144, + 40145, + 40146, + 40147, + 40148, + 40149, + 40150, + 40151, + 40152, + 40153, + 40154, + 40155, + 40156, + 40157, + 40158, + 40159, + 40160, + 40161, + 40162, + 40163, + 40164, + 40165, + 40166, + 40167, + 40168, + 40169, + 40170, + 40171, + 40172, + 40173, + 40174, + 40175, + 40176, + 40177, + 40178, + 40179, + 40180, + 40181, + 40182, + 40183, + 40184, + 40185, + 40186, + 40187, + 40188, + 40189, + 40191, + 40192, + 40193, + 40194, + 40195, + 40196, + 40197, + 40198, + 40199, + 40200, + 40201, + 40202, + 40203, + 40204, + 40205, + 40206, + 40207, + 40208, + 40209, + 40210, + 40211, + 40212, + 40213, + 40214, + 40215, + 40216, + 40217, + 40219, + 40220, + 40221, + 40222, + 40223, + 40224, + 40225, + 40226, + 40228, + 40229, + 40230, + 40231, + 40232, + 40233, + 40235, + 40236, + 40237, + 40238, + 40239, + 40240, + 40241, + 40242, + 40243, + 40244, + 40245, + 40246, + 40247, + 40248, + 40249, + 40250, + 40251, + 40252, + 40253, + 40254, + 40256, + 40257, + 40258, + 40259, + 40260, + 40261, + 40262, + 40263, + 40264, + 40265, + 40266, + 40267, + 40268, + 40269, + 40270, + 40271, + 40272, + 40273, + 40274, + 40275, + 40276, + 40277, + 40278, + 40279, + 40280, + 40281, + 40282, + 40283, + 40284, + 40285, + 40286, + 40287, + 40288, + 40289, + 40290, + 40291, + 40292, + 40293, + 40294, + 40295, + 40296, + 40297, + 40298, + 40299, + 40300, + 40301, + 40302, + 40303, + 40304, + 40305, + 40306, + 40307, + 40308, + 40309, + 40310, + 40311, + 40312, + 40313, + 40314, + 40315, + 40316, + 40317, + 40318, + 40319, + 40320, + 40321, + 40322, + 40323, + 40324, + 40325, + 40326, + 40327, + 40328, + 40329, + 40330, + 40331, + 40332, + 40333, + 40334, + 40335, + 40336, + 40337, + 40338, + 40339, + 40341, + 40342, + 40343, + 40344, + 40345, + 40346, + 40348, + 40349, + 40350, + 40351, + 40352, + 40353, + 40354, + 40355, + 40356, + 40357, + 40358, + 40359, + 40360, + 40361, + 40362, + 40363, + 40364, + 40365, + 40366, + 40367, + 40368, + 40369, + 40370, + 40371, + 40372, + 40373, + 40374, + 40375, + 40376, + 40377, + 40378, + 40379, + 40380, + 40381, + 40382, + 40383, + 40384, + 40385, + 40386, + 40387, + 40388, + 40389, + 40390, + 40391, + 40392, + 40393, + 40394, + 40395, + 40396, + 40397, + 40398, + 40399, + 40400, + 40402, + 40403, + 40404, + 40405, + 40406, + 40407, + 40408, + 40409, + 40411, + 40412, + 40413, + 40414, + 40416, + 40417, + 40418, + 40419, + 40420, + 40421, + 40422, + 40423, + 40424, + 40425, + 40426, + 40427, + 40428, + 40429, + 40430, + 40431, + 40432, + 40433, + 40434, + 40435, + 40436, + 40437, + 40438, + 40439, + 40440, + 40441, + 40442, + 40443, + 40444, + 40445, + 40446, + 40447, + 40448, + 40449, + 40450, + 40451, + 40452, + 40453, + 40454, + 40455, + 40456, + 40457, + 40458, + 40459, + 40460, + 40461, + 40462, + 40463, + 40464, + 40465, + 40466, + 40467, + 40468, + 40469, + 40470, + 40471, + 40472, + 40473, + 40474, + 40475, + 40476, + 40477, + 40478, + 40479, + 40480, + 40481, + 40482, + 40483, + 40484, + 40485, + 40486, + 40487, + 40488, + 40489, + 40490, + 40491, + 40492, + 40493, + 40494, + 40495, + 40496, + 40497, + 40498, + 40499, + 40500, + 40501, + 40502, + 40503, + 40504, + 40505, + 40506, + 40507, + 40508, + 40509, + 40510, + 40511, + 40512, + 40513, + 40514, + 40515, + 40516, + 40517, + 40518, + 40519, + 40520, + 40521, + 40522, + 40523, + 40524, + 40525, + 40526, + 40527, + 40528, + 40530, + 40531, + 40532, + 40533, + 40534, + 40535, + 40536, + 40537, + 40538, + 40539, + 40540, + 40541, + 40542, + 40543, + 40544, + 40545, + 40546, + 40547, + 40548, + 40549, + 40550, + 40551, + 40552, + 40554, + 40555, + 40556, + 40557, + 40558, + 40559, + 40560, + 40561, + 40562, + 40563, + 40564, + 40565, + 40566, + 40567, + 40568, + 40569, + 40570, + 40571, + 40572, + 40573, + 40574, + 40575, + 40576, + 40577, + 40578, + 40579, + 40580, + 40581, + 40582, + 40583, + 40584, + 40585, + 40586, + 40587, + 40588, + 40589, + 40590, + 40591, + 40592, + 40593, + 40594, + 40595, + 40596, + 40597, + 40598, + 40599, + 40600, + 40601, + 40602, + 40603, + 40605, + 40606, + 40607, + 40608, + 40609, + 40610, + 40611, + 40612, + 40613, + 40614, + 40615, + 40616, + 40617, + 40618, + 40619, + 40620, + 40621, + 40622, + 40623, + 40624, + 40625, + 40626, + 40627, + 40628, + 40629, + 40630, + 40631, + 40632, + 40633, + 40634, + 40635, + 40636, + 40637, + 40638, + 40639, + 40640, + 40641, + 40642, + 40643, + 40644, + 40645, + 40646, + 40647, + 40648, + 40649, + 40650, + 40651, + 40652, + 40653, + 40654, + 40655, + 40656, + 40657, + 40658, + 40659, + 40660, + 40661, + 40662, + 40663, + 40664, + 40665, + 40666, + 40667, + 40668, + 40669, + 40670, + 40671, + 40672, + 40673, + 40674, + 40675, + 40676, + 40677, + 40678, + 40679, + 40680, + 40681, + 40682, + 40683, + 40684, + 40685, + 40686, + 40687, + 40688, + 40689, + 40690, + 40691, + 40692, + 40693, + 40694, + 40695, + 40696, + 40697, + 40698, + 40699, + 40700, + 40701, + 40702, + 40703, + 40704, + 40705, + 40706, + 40707, + 40708, + 40709, + 40710, + 40711, + 40712, + 40713, + 40714, + 40715, + 40717, + 40718, + 40719, + 40720, + 40721, + 40722, + 40723, + 40724, + 40725, + 40726, + 40727, + 40728, + 40729, + 40730, + 40731, + 40732, + 40733, + 40734, + 40735, + 40736, + 40737, + 40738, + 40739, + 40740, + 40741, + 40742, + 40743, + 40744, + 40745, + 40746, + 40747, + 40748, + 40749, + 40750, + 40751, + 40752, + 40753, + 40754, + 40755, + 40756, + 40757, + 40758, + 40759, + 40760, + 40761, + 40762, + 40763, + 40764, + 40765, + 40766, + 40767, + 40768, + 40769, + 40771, + 40772, + 40773, + 40774, + 40775, + 40776, + 40777, + 40778, + 40779, + 40780, + 40781, + 40782, + 40783, + 40784, + 40785, + 40786, + 40787, + 40788, + 40789, + 40790, + 40791, + 40792, + 40793, + 40794, + 40795, + 40796, + 40797, + 40798, + 40799, + 40800, + 40801, + 40802, + 40803, + 40804, + 40805, + 40806, + 40807, + 40808, + 40809, + 40810, + 40811, + 40812, + 40813, + 40814, + 40815, + 40816, + 40817, + 40818, + 40819, + 40820, + 40821, + 40822, + 40823, + 40824, + 40825, + 40826, + 40827, + 40828, + 40829, + 40830, + 40831, + 40832, + 40833, + 40834, + 40835, + 40836, + 40837, + 40838, + 40839, + 40840, + 40841, + 40842, + 40843, + 40844, + 40845, + 40846, + 40847, + 40848, + 40849, + 40850, + 40851, + 40852, + 40853, + 40854, + 40855, + 40856, + 40857, + 40858, + 40859, + 40860, + 40861, + 40862, + 40863, + 40864, + 40865, + 40866, + 40867, + 40868, + 40869, + 40870, + 40871, + 40872, + 40873, + 40874, + 40875, + 40876, + 40877, + 40878, + 40879, + 40880, + 40881, + 40882, + 40883, + 40884, + 40885, + 40886, + 40887, + 40888, + 40889, + 40890, + 40891, + 40892, + 40893, + 40894, + 40895, + 40896, + 40897, + 40898, + 40899, + 40900, + 40901, + 40902, + 40903, + 40904, + 40905, + 40906, + 40907, + 40908, + 40909, + 40910, + 40911, + 40912, + 40913, + 40914, + 40915, + 40917, + 40918, + 40919, + 40920, + 40921, + 40922, + 40923, + 40924, + 40925, + 40926, + 40927, + 40928, + 40929, + 40930, + 40931, + 40932, + 40933, + 40934, + 40935, + 40936, + 40937, + 40938, + 40939, + 40940, + 40941, + 40942, + 40943, + 40944, + 40945, + 40946, + 40947, + 40948, + 40949, + 40950, + 40951, + 40952, + 40953, + 40954, + 40955, + 40956, + 40957, + 40958, + 40959, + 40960, + 40961, + 40962, + 40963, + 40964, + 40965, + 40966, + 40967, + 40968, + 40969, + 40970, + 40971, + 40972, + 40973, + 40974, + 40975, + 40976, + 40977, + 40978, + 40979, + 40980, + 40981, + 40982, + 40983, + 40984, + 40985, + 40986, + 40987, + 40988, + 40989, + 40990, + 40991, + 40992, + 40993, + 40994, + 40995, + 40996, + 40997, + 40998, + 40999, + 41000, + 41001, + 41002, + 41003, + 41004, + 41005, + 41006, + 41007, + 41008, + 41009, + 41010, + 41011, + 41012, + 41013, + 41014, + 41015, + 41016, + 41017, + 41018, + 41019, + 41020, + 41021, + 41022, + 41023, + 41024, + 41025, + 41026, + 41027, + 41028, + 41029, + 41030, + 41031, + 41032, + 41033, + 41034, + 41035, + 41036, + 41037, + 41038, + 41039, + 41040, + 41041, + 41042, + 41043, + 41044, + 41045, + 41046, + 41047, + 41048, + 41049, + 41050, + 41051, + 41052, + 41053, + 41054, + 41055, + 41056, + 41057, + 41058, + 41059, + 41061, + 41062, + 41063, + 41064, + 41065, + 41066, + 41067, + 41068, + 41069, + 41070, + 41071, + 41072, + 41073, + 41074, + 41075, + 41076, + 41077, + 41078, + 41079, + 41080, + 41081, + 41082, + 41083, + 41084, + 41085, + 41086, + 41087, + 41088, + 41089, + 41090, + 41091, + 41092, + 41093, + 41094, + 41095, + 41096, + 41097, + 41098, + 41099, + 41100, + 41101, + 41102, + 41103, + 41104, + 41105, + 41106, + 41107, + 41108, + 41109, + 41110, + 41111, + 41112, + 41113, + 41114, + 41115, + 41117, + 41118, + 41119, + 41120, + 41121, + 41122, + 41123, + 41124, + 41125, + 41126, + 41127, + 41128, + 41129, + 41130, + 41131, + 41132, + 41133, + 41134, + 41135, + 41136, + 41137, + 41138, + 41139, + 41140, + 41141, + 41142, + 41143, + 41144, + 41145, + 41146, + 41147, + 41148, + 41149, + 41150, + 41151, + 41152, + 41153, + 41154, + 41155, + 41156, + 41157, + 41158, + 41159, + 41160, + 41161, + 41162, + 41163, + 41164, + 41165, + 41166, + 41167, + 41168, + 41169, + 41170, + 41171, + 41172, + 41173, + 41174, + 41175, + 41176, + 41177, + 41178, + 41179, + 41180, + 41181, + 41182, + 41183, + 41184, + 41185, + 41186, + 41187, + 41188, + 41189, + 41190, + 41191, + 41192, + 41193, + 41194, + 41195, + 41196, + 41197, + 41198, + 41199, + 41200, + 41201, + 41202, + 41203, + 41204, + 41205, + 41206, + 41207, + 41208, + 41209, + 41210, + 41211, + 41212, + 41213, + 41214, + 41215, + 41216, + 41217, + 41218, + 41219, + 41220, + 41221, + 41222, + 41223, + 41224, + 41225, + 41226, + 41227, + 41228, + 41229, + 41230, + 41231, + 41232, + 41233, + 41234, + 41235, + 41236, + 41237, + 41238, + 41239, + 41240, + 41241, + 41242, + 41243, + 41244, + 41245, + 41246, + 41247, + 41248, + 41249, + 41250, + 41251, + 41252, + 41253, + 41254, + 41255, + 41256, + 41257, + 41258, + 41259, + 41260, + 41261, + 41262, + 41263, + 41264, + 41265, + 41266, + 41267, + 41268, + 41269, + 41270, + 41271, + 41272, + 41273, + 41274, + 41275, + 41276, + 41277, + 41279, + 41280, + 41281, + 41282, + 41283, + 41284, + 41285, + 41286, + 41287, + 41288, + 41289, + 41290, + 41291, + 41292, + 41293, + 41294, + 41295, + 41296, + 41297, + 41298, + 41299, + 41300, + 41301, + 41302, + 41303, + 41304, + 41305, + 41306, + 41307, + 41308, + 41309, + 41310, + 41311, + 41312, + 41313, + 41314, + 41315, + 41316, + 41317, + 41318, + 41319, + 41320, + 41321, + 41322, + 41323, + 41324, + 41325, + 41326, + 41327, + 41328, + 41329, + 41330, + 41331, + 41332, + 41333, + 41334, + 41335, + 41336, + 41337, + 41338, + 41339, + 41340, + 41341, + 41342, + 41343, + 41344, + 41345, + 41346, + 41347, + 41348, + 41349, + 41350, + 41351, + 41352, + 41353, + 41354, + 41355, + 41356, + 41357, + 41358, + 41359, + 41360, + 41361, + 41362, + 41363, + 41364, + 41365, + 41366, + 41367, + 41368, + 41369, + 41370, + 41371, + 41372, + 41373, + 41374, + 41375, + 41376, + 41377, + 41378, + 41379, + 41380, + 41381, + 41382, + 41383, + 41384, + 41385, + 41386, + 41387, + 41388, + 41389, + 41390, + 41391, + 41392, + 41393, + 41394, + 41395, + 41396, + 41397, + 41398, + 41399, + 41400, + 41401, + 41402, + 41403, + 41404, + 41405, + 41406, + 41407, + 41408, + 41409, + 41410, + 41411, + 41412, + 41413, + 41414, + 41415, + 41416, + 41417, + 41418, + 41419, + 41420, + 41421, + 41422, + 41423, + 41424, + 41425, + 41426, + 41427, + 41428, + 41429, + 41430, + 41431, + 41432, + 41433, + 41434, + 41435, + 41436, + 41437, + 41438, + 41439, + 41440, + 41441, + 41442, + 41443, + 41444, + 41446, + 41447, + 41448, + 41449, + 41450, + 41451, + 41452, + 41453, + 41454, + 41455, + 41456, + 41457, + 41458, + 41459, + 41460, + 41461, + 41462, + 41463, + 41464, + 41465, + 41466, + 41467, + 41468, + 41469, + 41470, + 41471, + 41472, + 41473, + 41474, + 41475, + 41476, + 41477, + 41478, + 41479, + 41480, + 41481, + 41482, + 41483, + 41484, + 41485, + 41486, + 41487, + 41488, + 41489, + 41490, + 41491, + 41492, + 41493, + 41494, + 41495, + 41496, + 41497, + 41498, + 41499, + 41500, + 41501, + 41502, + 41503, + 41504, + 41505, + 41506, + 41507, + 41508, + 41509, + 41510, + 41511, + 41512, + 41513, + 41514, + 41515, + 41516, + 41517, + 41518, + 41519, + 41520, + 41521, + 41522, + 41523, + 41524, + 41525, + 41526, + 41527, + 41528, + 41529, + 41530, + 41531, + 41532, + 41533, + 41534, + 41535, + 41536, + 41537, + 41538, + 41539, + 41540, + 41541, + 41542, + 41543, + 41544, + 41545, + 41546, + 41547, + 41548, + 41549, + 41550, + 41551, + 41552, + 41553, + 41554, + 41555, + 41556, + 41557, + 41558, + 41559, + 41560, + 41561, + 41562, + 41563, + 41564, + 41565, + 41566, + 41567, + 41568, + 41569, + 41570, + 41571, + 41572, + 41573, + 41574, + 41575, + 41576, + 41577, + 41578, + 41579, + 41580, + 41581, + 41582, + 41583, + 41584, + 41585, + 41586, + 41587, + 41588, + 41589, + 41590, + 41591, + 41592, + 41593, + 41594, + 41595, + 41596, + 41597, + 41598, + 41599, + 41600, + 41601, + 41602, + 41603, + 41605, + 41606, + 41607, + 41608, + 41609, + 41610, + 41611, + 41612, + 41613, + 41614, + 41615, + 41616, + 41617, + 41618, + 41619, + 41620, + 41621, + 41622, + 41623, + 41624, + 41625, + 41626, + 41627, + 41628, + 41629, + 41630, + 41631, + 41632, + 41633, + 41634, + 41635, + 41636, + 41637, + 41638, + 41639, + 41640, + 41641, + 41642, + 41643, + 41644, + 41645, + 41646, + 41647, + 41648, + 41649, + 41650, + 41651, + 41652, + 41653, + 41654, + 41655, + 41656, + 41657, + 41658, + 41659, + 41660, + 41661, + 41662, + 41663, + 41664, + 41665, + 41666, + 41667, + 41668, + 41669, + 41670, + 41671, + 41672, + 41673, + 41674, + 41675, + 41676, + 41677, + 41678, + 41679, + 41680, + 41681, + 41682, + 41683, + 41684, + 41685, + 41686, + 41687, + 41688, + 41689, + 41690, + 41691, + 41692, + 41693, + 41694, + 41695, + 41696, + 41697, + 41698, + 41699, + 41700, + 41701, + 41702, + 41703, + 41704, + 41705, + 41706, + 41707, + 41708, + 41709, + 41710, + 41711, + 41712, + 41713, + 41714, + 41715, + 41716, + 41717, + 41718, + 41719, + 41720, + 41721, + 41722, + 41723, + 41724, + 41725, + 41726, + 41727, + 41728, + 41729, + 41730, + 41731, + 41732, + 41733, + 41734, + 41735, + 41736, + 41737, + 41738, + 41739, + 41740, + 41741, + 41742, + 41743, + 41744, + 41745, + 41746, + 41747, + 41748, + 41749, + 41750, + 41751, + 41752, + 41753, + 41754, + 41755, + 41756, + 41757, + 41758, + 41759, + 41760, + 41761, + 41762, + 41763, + 41764, + 41765, + 41766, + 41767, + 41768, + 41769, + 41770, + 41771, + 41772, + 41773, + 41774, + 41775, + 41776, + 41777, + 41778, + 41780, + 41781, + 41782, + 41783, + 41784, + 41785, + 41786, + 41787, + 41788, + 41789, + 41790, + 41791, + 41792, + 41793, + 41794, + 41795, + 41796, + 41797, + 41798, + 41799, + 41800, + 41801, + 41802, + 41803, + 41804, + 41805, + 41806, + 41808, + 41809, + 41810, + 41811, + 41812, + 41813, + 41814, + 41815, + 41816, + 41817, + 41818, + 41819, + 41820, + 41821, + 41822, + 41823, + 41824, + 41825, + 41826, + 41827, + 41828, + 41829, + 41830, + 41831, + 41832, + 41833, + 41834, + 41835, + 41836, + 41837, + 41838, + 41839, + 41840, + 41841, + 41842, + 41843, + 41844, + 41845, + 41846, + 41847, + 41848, + 41850, + 41851, + 41852, + 41853, + 41855, + 41856, + 41857, + 41858, + 41859, + 41860, + 41861, + 41862, + 41863, + 41864, + 41865, + 41866, + 41867, + 41868, + 41869, + 41870, + 41871, + 41872, + 41873, + 41874, + 41875, + 41876, + 41877, + 41878, + 41879, + 41880, + 41881, + 41882, + 41883, + 41884, + 41885, + 41886, + 41887, + 41888, + 41889, + 41890, + 41891, + 41892, + 41893, + 41894, + 41895, + 41896, + 41897, + 41898, + 41899, + 41900, + 41901, + 41902, + 41903, + 41904, + 41905, + 41906, + 41907, + 41908, + 41909, + 41910, + 41911, + 41912, + 41913, + 41914, + 41915, + 41916, + 41917, + 41918, + 41919, + 41920, + 41921, + 41922, + 41923, + 41924, + 41925, + 41926, + 41927, + 41928, + 41930, + 41931, + 41932, + 41933, + 41934, + 41935, + 41936, + 41937, + 41938, + 41939, + 41940, + 41941, + 41944, + 41945, + 41946, + 41947, + 41948, + 41949, + 41950, + 41951, + 41952, + 41953, + 41954, + 41955, + 41956, + 41957, + 41958, + 41959, + 41960, + 41961, + 41962, + 41963, + 41964, + 41965, + 41966, + 41967, + 41968, + 41969, + 41970, + 41971, + 41972, + 41973, + 41974, + 41975, + 41976, + 41977, + 41978, + 41979, + 41980, + 41981, + 41982, + 41983, + 41984, + 41985, + 41986, + 41987, + 41988, + 41989, + 41990, + 41991, + 41992, + 41993, + 41994, + 41995, + 41996, + 41997, + 41998, + 41999, + 42000, + 42001, + 42003, + 42004, + 42005, + 42006, + 42007, + 42008, + 42010, + 42011, + 42012, + 42013, + 42014, + 42015, + 42016, + 42017, + 42018, + 42019, + 42020, + 42021, + 42022, + 42023, + 42024, + 42025, + 42026, + 42027, + 42028, + 42029, + 42030, + 42031, + 42032, + 42033, + 42034, + 42035, + 42036, + 42037, + 42038, + 42039, + 42040, + 42041, + 42042, + 42043, + 42044, + 42045, + 42046, + 42047, + 42048, + 42049, + 42050, + 42051, + 42052, + 42053, + 42054, + 42055, + 42056, + 42057, + 42058, + 42059, + 42060, + 42061, + 42062, + 42063, + 42064, + 42065, + 42066, + 42067, + 42068, + 42069, + 42070, + 42071, + 42072, + 42074, + 42075, + 42076, + 42077, + 42078, + 42079, + 42080, + 42081, + 42083, + 42084, + 42085, + 42086, + 42087, + 42088, + 42089, + 42090, + 42091, + 42092, + 42093, + 42094, + 42095, + 42096, + 42097, + 42098, + 42099, + 42100, + 42101, + 42102, + 42103, + 42104, + 42105, + 42106, + 42107, + 42108, + 42109, + 42110, + 42111, + 42112, + 42113, + 42114, + 42115, + 42116, + 42117, + 42118, + 42119, + 42120, + 42121, + 42122, + 42123, + 42124, + 42125, + 42126, + 42127, + 42128, + 42129, + 42130, + 42131, + 42132, + 42133, + 42134, + 42135, + 42136, + 42137, + 42138, + 42139, + 42140, + 42141, + 42142, + 42143, + 42144, + 42145, + 42146, + 42147, + 42148, + 42149, + 42150, + 42151, + 42152, + 42153, + 42154, + 42155, + 42156, + 42157, + 42158, + 42159, + 42160, + 42161, + 42162, + 42163, + 42164, + 42165, + 42166, + 42168, + 42169, + 42170, + 42171, + 42172, + 42173, + 42174, + 42175, + 42176, + 42177, + 42178, + 42179, + 42180, + 42181, + 42182, + 42183, + 42184, + 42185, + 42186, + 42188, + 42189, + 42190, + 42191, + 42192, + 42193, + 42194, + 42195, + 42196, + 42197, + 42198, + 42199, + 42200, + 42201, + 42202, + 42203, + 42204, + 42205, + 42206, + 42207, + 42208, + 42209, + 42210, + 42211, + 42212, + 42213, + 42214, + 42215, + 42216, + 42217, + 42218, + 42219, + 42220, + 42221, + 42222, + 42223, + 42224, + 42225, + 42226, + 42227, + 42228, + 42229, + 42230, + 42231, + 42232, + 42233, + 42234, + 42235, + 42236, + 42237, + 42238, + 42239, + 42240, + 42241, + 42242, + 42243, + 42244, + 42245, + 42246, + 42247, + 42248, + 42249, + 42250, + 42251, + 42252, + 42253, + 42254, + 42255, + 42256, + 42258, + 42259, + 42260, + 42261, + 42262, + 42263, + 42264, + 42265, + 42266, + 42267, + 42268, + 42269, + 42270, + 42271, + 42272, + 42273, + 42274, + 42275, + 42276, + 42277, + 42278, + 42279, + 42280, + 42281, + 42282, + 42283, + 42284, + 42285, + 42286, + 42287, + 42288, + 42289, + 42290, + 42291, + 42292, + 42293, + 42294, + 42295, + 42296, + 42297, + 42298, + 42299, + 42300, + 42301, + 42302, + 42303, + 42304, + 42305, + 42306, + 42307, + 42308, + 42309, + 42310, + 42311, + 42312, + 42313, + 42314, + 42315, + 42316, + 42317, + 42318, + 42319, + 42320, + 42321, + 42322, + 42323, + 42324, + 42325, + 42326, + 42327, + 42328, + 42329, + 42330, + 42331, + 42332, + 42333, + 42334, + 42335, + 42336, + 42337, + 42338, + 42339, + 42340, + 42341, + 42343, + 42344, + 42345, + 42346, + 42347, + 42348, + 42349, + 42350, + 42351, + 42352, + 42353, + 42354, + 42355, + 42356, + 42357, + 42358, + 42359, + 42360, + 42361, + 42362, + 42363, + 42364, + 42365, + 42366, + 42367, + 42368, + 42369, + 42370, + 42371, + 42372, + 42373, + 42374, + 42375, + 42376, + 42377, + 42378, + 42379, + 42380, + 42381, + 42382, + 42383, + 42384, + 42385, + 42386, + 42387, + 42388, + 42389, + 42390, + 42391, + 42392, + 42393, + 42394, + 42395, + 42396, + 42397, + 42398, + 42399, + 42400, + 42401, + 42402, + 42403, + 42404, + 42405, + 42406, + 42407, + 42408, + 42409, + 42410, + 42411, + 42412, + 42413, + 42414, + 42415, + 42416, + 42417, + 42418, + 42419, + 42420, + 42421, + 42422, + 42423, + 42424, + 42425, + 42426, + 42427, + 42428, + 42429, + 42430, + 42431, + 42432, + 42433, + 42434, + 42435, + 42436, + 42437, + 42438, + 42439, + 42440, + 42441, + 42442, + 42443, + 42444, + 42445, + 42446, + 42447, + 42448, + 42449, + 42450, + 42451, + 42452, + 42453, + 42454, + 42455, + 42456, + 42457, + 42458, + 42459, + 42460, + 42461, + 42462, + 42463, + 42464, + 42465, + 42466, + 42467, + 42468, + 42469, + 42470, + 42471, + 42472, + 42473, + 42474, + 42475, + 42476, + 42477, + 42478, + 42479, + 42480, + 42481, + 42482, + 42483, + 42484, + 42485, + 42486, + 42487, + 42488, + 42490, + 42491, + 42492, + 42493, + 42494, + 42495, + 42496, + 42497, + 42498, + 42499, + 42500, + 42501, + 42502, + 42503, + 42504, + 42505, + 42506, + 42507, + 42508, + 42509, + 42510, + 42511, + 42512, + 42513, + 42514, + 42515, + 42516, + 42517, + 42518, + 42519, + 42520, + 42521, + 42522, + 42523, + 42524, + 42525, + 42526, + 42527, + 42528, + 42529, + 42530, + 42531, + 42532, + 42533, + 42534, + 42535, + 42536, + 42537, + 42538, + 42539, + 42540, + 42541, + 42542, + 42543, + 42544, + 42545, + 42546, + 42547, + 42548, + 42549, + 42550, + 42551, + 42552, + 42553, + 42554, + 42555, + 42556, + 42557, + 42558, + 42559, + 42560, + 42561, + 42562, + 42563, + 42564, + 42565, + 42566, + 42567, + 42568, + 42569, + 42570, + 42571, + 42572, + 42573, + 42574, + 42575, + 42576, + 42577, + 42578, + 42579, + 42580, + 42581, + 42582, + 42583, + 42584, + 42585, + 42586, + 42587, + 42588, + 42589, + 42591, + 42592, + 42594, + 42595, + 42596, + 42597, + 42598, + 42599, + 42600, + 42601, + 42602, + 42603, + 42604, + 42605, + 42606, + 42607, + 42608, + 42609, + 42610, + 42611, + 42612, + 42613, + 42614, + 42615, + 42616, + 42617, + 42618, + 42619, + 42620, + 42621, + 42622, + 42623, + 42624, + 42625, + 42626, + 42627, + 42628, + 42629, + 42630, + 42631, + 42632, + 42633, + 42634, + 42635, + 42636, + 42637, + 42638, + 42639, + 42640, + 42641, + 42643, + 42644, + 42645, + 42646, + 42647, + 42648, + 42649, + 42650, + 42651, + 42652, + 42653, + 42654, + 42655, + 42656, + 42657, + 42660, + 42661, + 42662, + 42663, + 42664, + 42665, + 42666, + 42667, + 42668, + 42669, + 42670, + 42671, + 42672, + 42673, + 42674, + 42675, + 42676, + 42677, + 42678, + 42679, + 42680, + 42681, + 42682, + 42683, + 42684, + 42685, + 42686, + 42687, + 42688, + 42689, + 42690, + 42691, + 42692, + 42693, + 42694, + 42695, + 42696, + 42697, + 42698, + 42699, + 42700, + 42701, + 42702, + 42703, + 42704, + 42705, + 42706, + 42707, + 42708, + 42709, + 42710, + 42711, + 42712, + 42713, + 42714, + 42715, + 42716, + 42718, + 42719, + 42720, + 42721, + 42722, + 42723, + 42724, + 42725, + 42726, + 42727, + 42728, + 42729, + 42730, + 42731, + 42732, + 42733, + 42734, + 42735, + 42736, + 42737, + 42738, + 42739, + 42740, + 42741, + 42742, + 42743, + 42744, + 42745, + 42746, + 42747, + 42748, + 42749, + 42750, + 42751, + 42752, + 42753, + 42754, + 42755, + 42756, + 42757, + 42758, + 42759, + 42760, + 42761, + 42762, + 42763, + 42764, + 42765, + 42766, + 42767, + 42768, + 42769, + 42770, + 42771, + 42772, + 42773, + 42774, + 42775, + 42776, + 42777, + 42778, + 42779, + 42780, + 42781, + 42782, + 42783, + 42784, + 42785, + 42786, + 42787, + 42788, + 42789, + 42790, + 42791, + 42792, + 42793, + 42794, + 42795, + 42796, + 42797, + 42798, + 42799, + 42800, + 42801, + 42802, + 42803, + 42804, + 42805, + 42806, + 42807, + 42808, + 42809, + 42810, + 42811, + 42812, + 42813, + 42814, + 42815, + 42816, + 42817, + 42819, + 42820, + 42821, + 42822, + 42823, + 42824, + 42825, + 42826, + 42827, + 42828, + 42829, + 42830, + 42831, + 42832, + 42833, + 42834, + 42835, + 42836, + 42837, + 42838, + 42839, + 42840, + 42841, + 42842, + 42843, + 42844, + 42845, + 42846, + 42847, + 42848, + 42849, + 42850, + 42851, + 42852, + 42853, + 42854, + 42855, + 42856, + 42857, + 42858, + 42859, + 42860, + 42861, + 42862, + 42863, + 42864, + 42865, + 42866, + 42867, + 42868, + 42869, + 42870, + 42871, + 42872, + 42873, + 42874, + 42875, + 42876, + 42877, + 42878, + 42879, + 42880, + 42881, + 42882, + 42883, + 42884, + 42885, + 42886, + 42887, + 42888, + 42889, + 42890, + 42891, + 42892, + 42893, + 42894, + 42895, + 42896, + 42897, + 42898, + 42899, + 42900, + 42901, + 42902, + 42903, + 42904, + 42905, + 42906, + 42907, + 42908, + 42909, + 42910, + 42911, + 42912, + 42913, + 42914, + 42915, + 42916, + 42917, + 42918, + 42919, + 42920, + 42921, + 42922, + 42923, + 42924, + 42925, + 42926, + 42927, + 42928, + 42929, + 42930, + 42931, + 42932, + 42933, + 42934, + 42935, + 42936, + 42937, + 42938, + 42939, + 42940, + 42941, + 42942, + 42943, + 42944, + 42945, + 42946, + 42947, + 42948, + 42949, + 42950, + 42951, + 42952, + 42953, + 42954, + 42955, + 42957, + 42958, + 42959, + 42960, + 42961, + 42962, + 42963, + 42964, + 42965, + 42966, + 42967, + 42968, + 42969, + 42970, + 42971, + 42972, + 42973, + 42974, + 42975, + 42976, + 42977, + 42978, + 42979, + 42980, + 42981, + 42982, + 42983, + 42984, + 42985, + 42986, + 42987, + 42988, + 42989, + 42990, + 42991, + 42992, + 42993, + 42994, + 42995, + 42996, + 42997, + 42998, + 42999, + 43000, + 43001, + 43002, + 43003, + 43004, + 43005, + 43006, + 43008, + 43009, + 43010, + 43011, + 43012, + 43014, + 43015, + 43016, + 43017, + 43018, + 43019, + 43020, + 43021, + 43022, + 43024, + 43025, + 43026, + 43027, + 43028, + 43029, + 43030, + 43031, + 43032, + 43033, + 43034, + 43035, + 43036, + 43037, + 43038, + 43039, + 43040, + 43041, + 43042, + 43043, + 43044, + 43045, + 43046, + 43047, + 43048, + 43049, + 43050, + 43051, + 43052, + 43053, + 43054, + 43055, + 43056, + 43057, + 43058, + 43059, + 43060, + 43061, + 43062, + 43063, + 43064, + 43065, + 43066, + 43067, + 43068, + 43069, + 43070, + 43071, + 43072, + 43073, + 43074, + 43075, + 43076, + 43077, + 43078, + 43079, + 43080, + 43081, + 43082, + 43083, + 43084, + 43085, + 43086, + 43087, + 43088, + 43089, + 43090, + 43091, + 43092, + 43093, + 43094, + 43095, + 43096, + 43097, + 43098, + 43099, + 43100, + 43101, + 43102, + 43103, + 43104, + 43105, + 43106, + 43107, + 43108, + 43110, + 43111, + 43112, + 43113, + 43114, + 43115, + 43116, + 43117, + 43118, + 43119, + 43120, + 43121, + 43122, + 43123, + 43124, + 43126, + 43127, + 43128, + 43129, + 43130, + 43131, + 43132, + 43133, + 43134, + 43135, + 43136, + 43137, + 43138, + 43139, + 43140, + 43141, + 43142, + 43143, + 43144, + 43145, + 43146, + 43147, + 43148, + 43149, + 43150, + 43151, + 43152, + 43153, + 43154, + 43155, + 43156, + 43157, + 43158, + 43159, + 43160, + 43161, + 43162, + 43163, + 43164, + 43165, + 43166, + 43167, + 43168, + 43169, + 43170, + 43171, + 43172, + 43173, + 43174, + 43175, + 43176, + 43177, + 43178, + 43179, + 43180, + 43181, + 43182, + 43183, + 43184, + 43185, + 43186, + 43187, + 43188, + 43189, + 43190, + 43191, + 43192, + 43193, + 43194, + 43195, + 43196, + 43197, + 43198, + 43199, + 43200, + 43201, + 43202, + 43203, + 43204, + 43205, + 43206, + 43207, + 43208, + 43209, + 43210, + 43211, + 43212, + 43213, + 43214, + 43215, + 43216, + 43217, + 43218, + 43219, + 43220, + 43221, + 43223, + 43224, + 43225, + 43226, + 43227, + 43228, + 43229, + 43230, + 43231, + 43232, + 43233, + 43234, + 43235, + 43236, + 43237, + 43238, + 43239, + 43240, + 43241, + 43242, + 43243, + 43244, + 43245, + 43246, + 43247, + 43248, + 43249, + 43250, + 43251, + 43252, + 43253, + 43254, + 43255, + 43256, + 43257, + 43258, + 43259, + 43260, + 43261, + 43262, + 43263, + 43264, + 43265, + 43266, + 43267, + 43268, + 43269, + 43270, + 43271, + 43272, + 43273, + 43274, + 43275, + 43276, + 43277, + 43278, + 43279, + 43280, + 43281, + 43282, + 43283, + 43284, + 43285, + 43286, + 43287, + 43288, + 43289, + 43290, + 43291, + 43292, + 43293, + 43294, + 43295, + 43296, + 43297, + 43298, + 43299, + 43300, + 43301, + 43302, + 43303, + 43304, + 43305, + 43306, + 43307, + 43308, + 43309, + 43310, + 43311, + 43312, + 43313, + 43314, + 43315, + 43316, + 43317, + 43318, + 43319, + 43321, + 43322, + 43323, + 43324, + 43325, + 43326, + 43327, + 43328, + 43329, + 43330, + 43331, + 43332, + 43333, + 43334, + 43335, + 43336, + 43337, + 43338, + 43339, + 43340, + 43341, + 43342, + 43343, + 43344, + 43345, + 43346, + 43347, + 43348, + 43349, + 43350, + 43351, + 43352, + 43353, + 43354, + 43355, + 43356, + 43357, + 43358, + 43360, + 43361, + 43362, + 43363, + 43364, + 43365, + 43366, + 43367, + 43368, + 43369, + 43370, + 43371, + 43372, + 43373, + 43374, + 43375, + 43376, + 43377, + 43378, + 43379, + 43380, + 43381, + 43382, + 43383, + 43384, + 43385, + 43386, + 43387, + 43388, + 43389, + 43390, + 43392, + 43393, + 43394, + 43395, + 43396, + 43397, + 43398, + 43399, + 43400, + 43402, + 43403, + 43404, + 43405, + 43406, + 43407, + 43408, + 43409, + 43410, + 43411, + 43412, + 43413, + 43414, + 43415, + 43416, + 43417, + 43418, + 43419, + 43420, + 43421, + 43422, + 43423, + 43424, + 43425, + 43426, + 43427, + 43428, + 43429, + 43430, + 43431, + 43432, + 43433, + 43434, + 43435, + 43436, + 43437, + 43438, + 43439, + 43440, + 43441, + 43442, + 43443, + 43444, + 43445, + 43446, + 43447, + 43448, + 43449, + 43450, + 43451, + 43452, + 43453, + 43455, + 43456, + 43457, + 43458, + 43459, + 43460, + 43461, + 43462, + 43463, + 43464, + 43465, + 43466, + 43467, + 43468, + 43469, + 43470, + 43471, + 43472, + 43473, + 43474, + 43475, + 43476, + 43477, + 43478, + 43479, + 43480, + 43481, + 43482, + 43483, + 43484, + 43485, + 43486, + 43487, + 43488, + 43489, + 43490, + 43491, + 43492, + 43493, + 43494, + 43495, + 43496, + 43497, + 43498, + 43499, + 43500, + 43501, + 43502, + 43503, + 43504, + 43505, + 43506, + 43507, + 43508, + 43509, + 43510, + 43511, + 43512, + 43513, + 43514, + 43515, + 43516, + 43517, + 43518, + 43519, + 43520, + 43521, + 43522, + 43523, + 43524, + 43525, + 43526, + 43527, + 43528, + 43529, + 43530, + 43531, + 43532, + 43533, + 43534, + 43535, + 43536, + 43537, + 43538, + 43539, + 43540, + 43541, + 43542, + 43543, + 43544, + 43545, + 43546, + 43547, + 43548, + 43549, + 43550, + 43551, + 43552, + 43553, + 43554, + 43555, + 43556, + 43557, + 43558, + 43559, + 43560, + 43561, + 43562, + 43563, + 43564, + 43565, + 43566, + 43567, + 43568, + 43569, + 43570, + 43571, + 43572, + 43573, + 43574, + 43575, + 43576, + 43577, + 43578, + 43579, + 43580, + 43581, + 43582, + 43583, + 43584, + 43585, + 43586, + 43587, + 43588, + 43589, + 43590, + 43591, + 43592, + 43593, + 43594, + 43595, + 43596, + 43597, + 43598, + 43599, + 43600, + 43601, + 43602, + 43603, + 43604, + 43605, + 43607, + 43608, + 43609, + 43610, + 43611, + 43612, + 43613, + 43614, + 43615, + 43616, + 43617, + 43618, + 43619, + 43620, + 43621, + 43623, + 43624, + 43625, + 43626, + 43627, + 43628, + 43629, + 43630, + 43631, + 43632, + 43633, + 43634, + 43635, + 43636, + 43637, + 43638, + 43639, + 43640, + 43641, + 43642, + 43643, + 43644, + 43645, + 43646, + 43647, + 43648, + 43649, + 43650, + 43651, + 43652, + 43653, + 43654, + 43655, + 43656, + 43657, + 43658, + 43659, + 43660, + 43661, + 43662, + 43663, + 43664, + 43665, + 43666, + 43667, + 43668, + 43669, + 43670, + 43671, + 43672, + 43673, + 43674, + 43675, + 43676, + 43677, + 43678, + 43679, + 43680, + 43681, + 43682, + 43684, + 43685, + 43686, + 43687, + 43688, + 43689, + 43690, + 43691, + 43692, + 43693, + 43694, + 43695, + 43696, + 43697, + 43698, + 43699, + 43700, + 43701, + 43702, + 43703, + 43704, + 43705, + 43706, + 43707, + 43708, + 43709, + 43710, + 43711, + 43712, + 43713, + 43714, + 43715, + 43716, + 43717, + 43718, + 43719, + 43720, + 43721, + 43722, + 43723, + 43724, + 43725, + 43726, + 43727, + 43728, + 43729, + 43730, + 43731, + 43732, + 43733, + 43734, + 43735, + 43736, + 43737, + 43738, + 43739, + 43740, + 43741, + 43742, + 43743, + 43744, + 43745, + 43746, + 43747, + 43748, + 43749, + 43750, + 43751, + 43752, + 43753, + 43754, + 43755, + 43756, + 43757, + 43758, + 43759, + 43760, + 43761, + 43762, + 43764, + 43765, + 43766, + 43767, + 43768, + 43769, + 43770, + 43771, + 43772, + 43773, + 43774, + 43775, + 43776, + 43777, + 43778, + 43779, + 43780, + 43781, + 43782, + 43783, + 43784, + 43785, + 43786, + 43787, + 43788, + 43789, + 43790, + 43791, + 43792, + 43793, + 43794, + 43795, + 43796, + 43797, + 43798, + 43799, + 43800, + 43801, + 43802, + 43803, + 43804, + 43805, + 43806, + 43807, + 43808, + 43809, + 43810, + 43811, + 43812, + 43813, + 43814, + 43815, + 43816, + 43817, + 43818, + 43819, + 43820, + 43821, + 43822, + 43823, + 43824, + 43825, + 43826, + 43827, + 43828, + 43829, + 43830, + 43831, + 43832, + 43833, + 43834, + 43835, + 43836, + 43837, + 43838, + 43839, + 43840, + 43841, + 43842, + 43843, + 43844, + 43845, + 43846, + 43847, + 43848, + 43849, + 43850, + 43851, + 43852, + 43853, + 43854, + 43855, + 43857, + 43858, + 43859, + 43860, + 43861, + 43862, + 43863, + 43864, + 43865, + 43866, + 43867, + 43868, + 43869, + 43870, + 43871, + 43872, + 43873, + 43874, + 43875, + 43876, + 43877, + 43878, + 43879, + 43880, + 43881, + 43882, + 43883, + 43884, + 43885, + 43886, + 43887, + 43888, + 43889, + 43890, + 43891, + 43892, + 43893, + 43894, + 43895, + 43896, + 43897, + 43898, + 43899, + 43900, + 43901, + 43902, + 43903, + 43904, + 43905, + 43906, + 43907, + 43908, + 43909, + 43910, + 43911, + 43912, + 43913, + 43914, + 43915, + 43916, + 43917, + 43918, + 43919, + 43920, + 43921, + 43922, + 43923, + 43924, + 43925, + 43926, + 43927, + 43928, + 43929, + 43930, + 43931, + 43932, + 43933, + 43934, + 43935, + 43936, + 43938, + 43940, + 43941, + 43942, + 43943, + 43944, + 43945, + 43946, + 43947, + 43948, + 43949, + 43951, + 43952, + 43953, + 43954, + 43955, + 43956, + 43957, + 43958, + 43959, + 43960, + 43961, + 43962, + 43963, + 43964, + 43966, + 43967, + 43968, + 43969, + 43970, + 43971, + 43972, + 43973, + 43974, + 43975, + 43976, + 43977, + 43978, + 43979, + 43980, + 43981, + 43982, + 43983, + 43985, + 43986, + 43987, + 43988, + 43989, + 43990, + 43991, + 43992, + 43993, + 43994, + 43995, + 43996, + 43997, + 43998, + 43999, + 44000, + 44001, + 44002, + 44003, + 44004, + 44005, + 44006, + 44007, + 44008, + 44009, + 44010, + 44011, + 44012, + 44013, + 44014, + 44015, + 44016, + 44017, + 44018, + 44019, + 44020, + 44021, + 44022, + 44023, + 44024, + 44025, + 44026, + 44027, + 44028, + 44029, + 44030, + 44031, + 44032, + 44033, + 44034, + 44035, + 44036, + 44037, + 44038, + 44039, + 44040, + 44041, + 44042, + 44043, + 44044, + 44045, + 44046, + 44047, + 44048, + 44049, + 44050, + 44051, + 44052, + 44053, + 44054, + 44055, + 44056, + 44057, + 44058, + 44059, + 44060, + 44061, + 44062, + 44063, + 44064, + 44065, + 44066, + 44067, + 44068, + 44069, + 44070, + 44071, + 44072, + 44073, + 44074, + 44075, + 44076, + 44077, + 44078, + 44079, + 44080, + 44081, + 44082, + 44083, + 44084, + 44085, + 44086, + 44087, + 44088, + 44089, + 44090, + 44091, + 44092, + 44093, + 44094, + 44095, + 44096, + 44097, + 44098, + 44099, + 44100, + 44101, + 44102, + 44104, + 44105, + 44106, + 44107, + 44108, + 44109, + 44110, + 44111, + 44112, + 44113, + 44114, + 44115, + 44116, + 44117, + 44118, + 44119, + 44120, + 44121, + 44122, + 44123, + 44124, + 44125, + 44126, + 44127, + 44128, + 44129, + 44130, + 44131, + 44132, + 44133, + 44134, + 44135, + 44136, + 44137, + 44138, + 44139, + 44140, + 44141, + 44144, + 44145, + 44146, + 44147, + 44148, + 44149, + 44150, + 44151, + 44152, + 44153, + 44154, + 44155, + 44156, + 44157, + 44158, + 44159, + 44160, + 44161, + 44162, + 44163, + 44164, + 44165, + 44166, + 44167, + 44168, + 44169, + 44170, + 44171, + 44172, + 44173, + 44174, + 44175, + 44176, + 44177, + 44178, + 44179, + 44180, + 44181, + 44182, + 44183, + 44184, + 44185, + 44186, + 44187, + 44188, + 44189, + 44190, + 44191, + 44192, + 44193, + 44194, + 44195, + 44196, + 44197, + 44198, + 44199, + 44200, + 44201, + 44202, + 44203, + 44204, + 44206, + 44207, + 44208, + 44209, + 44210, + 44211, + 44212, + 44213, + 44214, + 44215, + 44216, + 44217, + 44218, + 44219, + 44220, + 44221, + 44222, + 44223, + 44224, + 44225, + 44226, + 44227, + 44228, + 44229, + 44230, + 44231, + 44232, + 44233, + 44234, + 44235, + 44236, + 44237, + 44238, + 44239, + 44240, + 44241, + 44242, + 44243, + 44244, + 44245, + 44246, + 44247, + 44248, + 44249, + 44250, + 44251, + 44252, + 44253, + 44254, + 44255, + 44256, + 44258, + 44260, + 44261, + 44262, + 44263, + 44264, + 44265, + 44266, + 44267, + 44268, + 44269, + 44270, + 44271, + 44272, + 44273, + 44274, + 44275, + 44276, + 44277, + 44278, + 44279, + 44280, + 44281, + 44282, + 44283, + 44284, + 44285, + 44286, + 44287, + 44288, + 44289, + 44290, + 44291, + 44292, + 44293, + 44294, + 44295, + 44296, + 44297, + 44298, + 44299, + 44300, + 44301, + 44302, + 44303, + 44304, + 44305, + 44306, + 44307, + 44308, + 44309, + 44310, + 44311, + 44312, + 44313, + 44314, + 44315, + 44316, + 44317, + 44318, + 44319, + 44320, + 44321, + 44322, + 44323, + 44324, + 44325, + 44326, + 44327, + 44328, + 44329, + 44330, + 44331, + 44332, + 44333, + 44334, + 44335, + 44336, + 44337, + 44338, + 44339, + 44340, + 44341, + 44342, + 44343, + 44344, + 44345, + 44346, + 44347, + 44348, + 44349, + 44350, + 44351, + 44352, + 44353, + 44354, + 44355, + 44356, + 44357, + 44358, + 44359, + 44360, + 44361, + 44362, + 44363, + 44364, + 44365, + 44366, + 44367, + 44368, + 44369, + 44370, + 44371, + 44372, + 44373, + 44374, + 44375, + 44376, + 44377, + 44378, + 44379, + 44380, + 44381, + 44382, + 44383, + 44384, + 44385, + 44386, + 44387, + 44388, + 44389, + 44390, + 44391, + 44392, + 44393, + 44394, + 44395, + 44396, + 44397, + 44398, + 44399, + 44400, + 44401, + 44402, + 44403, + 44404, + 44405, + 44406, + 44407, + 44408, + 44409, + 44410, + 44411, + 44412, + 44413, + 44414, + 44415, + 44416, + 44417, + 44418, + 44419, + 44420, + 44421, + 44422, + 44423, + 44424, + 44425, + 44426, + 44427, + 44429, + 44430, + 44431, + 44432, + 44433, + 44434, + 44435, + 44436, + 44437, + 44438, + 44439, + 44440, + 44441, + 44442, + 44443, + 44444, + 44445, + 44446, + 44447, + 44448, + 44449, + 44450, + 44451, + 44452, + 44453, + 44454, + 44455, + 44456, + 44457, + 44458, + 44459, + 44460, + 44461, + 44462, + 44463, + 44464, + 44465, + 44466, + 44467, + 44468, + 44469, + 44470, + 44471, + 44472, + 44473, + 44474, + 44475, + 44476, + 44477, + 44478, + 44479, + 44480, + 44481, + 44482, + 44483, + 44484, + 44485, + 44486, + 44487, + 44488, + 44489, + 44490, + 44491, + 44492, + 44493, + 44494, + 44495, + 44496, + 44497, + 44498, + 44499, + 44500, + 44501, + 44503, + 44504, + 44505, + 44506, + 44507, + 44508, + 44510, + 44511, + 44512, + 44513, + 44514, + 44515, + 44516, + 44517, + 44518, + 44519, + 44520, + 44521, + 44522, + 44523, + 44524, + 44525, + 44526, + 44527, + 44528, + 44529, + 44530, + 44531, + 44532, + 44533, + 44534, + 44535, + 44536, + 44537, + 44538, + 44539, + 44540, + 44541, + 44542, + 44543, + 44544, + 44545, + 44546, + 44547, + 44548, + 44549, + 44550, + 44551, + 44552, + 44553, + 44554, + 44555, + 44556, + 44557, + 44558, + 44559, + 44560, + 44561, + 44562, + 44563, + 44564, + 44565, + 44566, + 44567, + 44568, + 44569, + 44570, + 44571, + 44572, + 44573, + 44574, + 44575, + 44576, + 44578, + 44579, + 44580, + 44581, + 44582, + 44583, + 44584, + 44585, + 44586, + 44587, + 44588, + 44589, + 44590, + 44591, + 44592, + 44593, + 44594, + 44595, + 44596, + 44597, + 44598, + 44599, + 44600, + 44601, + 44602, + 44603, + 44604, + 44605, + 44607, + 44608, + 44609, + 44610, + 44611, + 44612, + 44613, + 44614, + 44615, + 44616, + 44617, + 44618, + 44619, + 44620, + 44621, + 44622, + 44623, + 44624, + 44625, + 44626, + 44627, + 44628, + 44629, + 44630, + 44631, + 44632, + 44633, + 44634, + 44635, + 44636, + 44637, + 44638, + 44639, + 44640, + 44641, + 44642, + 44643, + 44644, + 44645, + 44646, + 44647, + 44648, + 44649, + 44650, + 44651, + 44652, + 44653, + 44654, + 44655, + 44656, + 44657, + 44658, + 44659, + 44660, + 44661, + 44662, + 44663, + 44664, + 44665, + 44666, + 44667, + 44668, + 44669, + 44670, + 44671, + 44672, + 44673, + 44674, + 44675, + 44676, + 44677, + 44678, + 44679, + 44680, + 44681, + 44682, + 44683, + 44684, + 44685, + 44686, + 44687, + 44688, + 44689, + 44690, + 44691, + 44692, + 44693, + 44694, + 44695, + 44696, + 44697, + 44698, + 44699, + 44700, + 44701, + 44702, + 44703, + 44704, + 44705, + 44706, + 44707, + 44708, + 44709, + 44710, + 44711, + 44712, + 44713, + 44714, + 44715, + 44716, + 44717, + 44718, + 44719, + 44720, + 44721, + 44722, + 44723, + 44724, + 44725, + 44726, + 44727, + 44728, + 44729, + 44730, + 44731, + 44732, + 44733, + 44734, + 44735, + 44736, + 44737, + 44738, + 44739, + 44740, + 44741, + 44742, + 44743, + 44744, + 44745, + 44746, + 44747, + 44748, + 44749, + 44750, + 44751, + 44752, + 44753, + 44754, + 44755, + 44756, + 44757, + 44758, + 44759, + 44760, + 44761, + 44762, + 44763, + 44764, + 44765, + 44766, + 44767, + 44768, + 44769, + 44770, + 44771, + 44772, + 44773, + 44774, + 44775, + 44776, + 44777, + 44778, + 44779, + 44780, + 44781, + 44782, + 44783, + 44784, + 44785, + 44786, + 44787, + 44788, + 44789, + 44790, + 44791, + 44792, + 44793, + 44794, + 44795, + 44797, + 44798, + 44799, + 44800, + 44801, + 44802, + 44803, + 44804, + 44805, + 44806, + 44807, + 44808, + 44809, + 44810, + 44811, + 44812, + 44813, + 44814, + 44815, + 44816, + 44817, + 44818, + 44819, + 44821, + 44822, + 44823, + 44824, + 44825, + 44826, + 44827, + 44828, + 44829, + 44830, + 44831, + 44832, + 44833, + 44834, + 44835, + 44836, + 44838, + 44839, + 44840, + 44841, + 44842, + 44843, + 44844, + 44845, + 44846, + 44847, + 44848, + 44849, + 44850, + 44851, + 44852, + 44853, + 44854, + 44855, + 44856, + 44857, + 44858, + 44859, + 44860, + 44861, + 44862, + 44863, + 44864, + 44865, + 44866, + 44867, + 44869, + 44870, + 44871, + 44872, + 44873, + 44874, + 44875, + 44876, + 44877, + 44878, + 44879, + 44880, + 44881, + 44882, + 44883, + 44884, + 44885, + 44886, + 44887, + 44888, + 44889, + 44890, + 44891, + 44892, + 44893, + 44894, + 44895, + 44896, + 44897, + 44898, + 44899, + 44900, + 44901, + 44902, + 44903, + 44904, + 44905, + 44906, + 44907, + 44908, + 44910, + 44912, + 44913, + 44914, + 44916, + 44917, + 44918, + 44919, + 44920, + 44921, + 44922, + 44923, + 44924, + 44925, + 44926, + 44927, + 44928, + 44929, + 44930, + 44931, + 44932, + 44933, + 44934, + 44935, + 44936, + 44937, + 44938, + 44939, + 44940, + 44941, + 44942, + 44943, + 44944, + 44945, + 44946, + 44947, + 44948, + 44949, + 44950, + 44951, + 44952, + 44953, + 44955, + 44956, + 44957, + 44958, + 44959, + 44960, + 44961, + 44962, + 44963, + 44964, + 44965, + 44966, + 44967, + 44968, + 44969, + 44970, + 44971, + 44972, + 44973, + 44974, + 44975, + 44976, + 44977, + 44978, + 44979, + 44980, + 44981, + 44982, + 44983, + 44984, + 44985, + 44986, + 44987, + 44988, + 44989, + 44990, + 44991, + 44992, + 44993, + 44994, + 44995, + 44996, + 44997, + 44998, + 44999, + 45000, + 45001, + 45002, + 45003, + 45004, + 45005, + 45006, + 45007, + 45008, + 45009, + 45010, + 45011, + 45012, + 45013, + 45014, + 45015, + 45016, + 45017, + 45018, + 45019, + 45020, + 45021, + 45022, + 45023, + 45024, + 45025, + 45026, + 45027, + 45028, + 45029, + 45030, + 45031, + 45032, + 45033, + 45034, + 45035, + 45036, + 45037, + 45038, + 45039, + 45040, + 45041, + 45042, + 45043, + 45044, + 45045, + 45046, + 45047, + 45048, + 45049, + 45050, + 45051, + 45052, + 45053, + 45054, + 45055, + 45056, + 45057, + 45058, + 45059, + 45060, + 45061, + 45062, + 45064, + 45065, + 45066, + 45067, + 45068, + 45069, + 45070, + 45071, + 45072, + 45073, + 45074, + 45075, + 45076, + 45077, + 45078, + 45079, + 45080, + 45081, + 45082, + 45083, + 45084, + 45085, + 45086, + 45087, + 45088, + 45089, + 45090, + 45091, + 45092, + 45093, + 45094, + 45095, + 45096, + 45097, + 45098, + 45099, + 45100, + 45101, + 45102, + 45103, + 45104, + 45105, + 45106, + 45107, + 45108, + 45109, + 45110, + 45111, + 45112, + 45113, + 45114, + 45115, + 45116, + 45117, + 45118, + 45119, + 45120, + 45121, + 45122, + 45123, + 45124, + 45125, + 45126, + 45127, + 45128, + 45129, + 45130, + 45131, + 45132, + 45133, + 45134, + 45135, + 45136, + 45137, + 45138, + 45139, + 45140, + 45141, + 45142, + 45143, + 45144, + 45145, + 45146, + 45147, + 45148, + 45149, + 45150, + 45151, + 45152, + 45153, + 45154, + 45155, + 45156, + 45157, + 45158, + 45159, + 45160, + 45161, + 45162, + 45163, + 45164, + 45165, + 45166, + 45167, + 45168, + 45169, + 45170, + 45171, + 45172, + 45173, + 45174, + 45175, + 45176, + 45177, + 45178, + 45179, + 45180, + 45181, + 45182, + 45183, + 45184, + 45185, + 45186, + 45187, + 45188, + 45189, + 45190, + 45192, + 45193, + 45194, + 45195, + 45196, + 45197, + 45198, + 45199, + 45200, + 45201, + 45202, + 45203, + 45204, + 45205, + 45206, + 45207, + 45208, + 45209, + 45210, + 45211, + 45212, + 45213, + 45214, + 45215, + 45216, + 45217, + 45218, + 45219, + 45220, + 45221, + 45222, + 45223, + 45224, + 45225, + 45226, + 45227, + 45228, + 45229, + 45230, + 45231, + 45232, + 45233, + 45234, + 45235, + 45236, + 45237, + 45238, + 45239, + 45240, + 45241, + 45242, + 45243, + 45244, + 45245, + 45246, + 45247, + 45248, + 45249, + 45250, + 45251, + 45252, + 45253, + 45254, + 45255, + 45256, + 45257, + 45258, + 45259, + 45260, + 45261, + 45262, + 45263, + 45264, + 45265, + 45267, + 45268, + 45269, + 45270, + 45271, + 45272, + 45273, + 45274, + 45275, + 45276, + 45277, + 45278, + 45279, + 45280, + 45281, + 45282, + 45283, + 45284, + 45285, + 45286, + 45287, + 45288, + 45289, + 45290, + 45291, + 45292, + 45293, + 45294, + 45295, + 45296, + 45297, + 45298, + 45299, + 45301, + 45302, + 45303, + 45305, + 45306, + 45307, + 45308, + 45309, + 45311, + 45312, + 45313, + 45314, + 45315, + 45316, + 45317, + 45318, + 45319, + 45320, + 45321, + 45322, + 45323, + 45324, + 45325, + 45326, + 45327, + 45328, + 45329, + 45330, + 45331, + 45332, + 45333, + 45334, + 45335, + 45336, + 45337, + 45338, + 45339, + 45340, + 45341, + 45342, + 45343, + 45344, + 45345, + 45346, + 45347, + 45348, + 45349, + 45350, + 45351, + 45352, + 45353, + 45354, + 45355, + 45356, + 45357, + 45358, + 45359, + 45360, + 45361, + 45362, + 45363, + 45364, + 45365, + 45366, + 45367, + 45368, + 45369, + 45370, + 45371, + 45372, + 45373, + 45374, + 45375, + 45376, + 45377, + 45378, + 45379, + 45380, + 45381, + 45382, + 45383, + 45384, + 45385, + 45386, + 45387, + 45388, + 45389, + 45390, + 45391, + 45392, + 45393, + 45394, + 45395, + 45396, + 45397, + 45398, + 45399, + 45400, + 45401, + 45402, + 45403, + 45404, + 45405, + 45406, + 45407, + 45408, + 45409, + 45410, + 45411, + 45412, + 45413, + 45414, + 45415, + 45416, + 45417, + 45418, + 45419, + 45420, + 45421, + 45422, + 45423, + 45424, + 45425, + 45426, + 45427, + 45428, + 45429, + 45430, + 45431, + 45432, + 45433, + 45434, + 45435, + 45436, + 45437, + 45438, + 45439, + 45440, + 45441, + 45442, + 45443, + 45445, + 45446, + 45447, + 45448, + 45449, + 45450, + 45451, + 45452, + 45453, + 45454, + 45455, + 45456, + 45457, + 45458, + 45459, + 45460, + 45461, + 45462, + 45463, + 45464, + 45465, + 45466, + 45467, + 45468, + 45469, + 45470, + 45471, + 45472, + 45473, + 45475, + 45476, + 45477, + 45478, + 45479, + 45480, + 45481, + 45482, + 45483, + 45484, + 45485, + 45486, + 45487, + 45488, + 45489, + 45490, + 45491, + 45492, + 45493, + 45494, + 45495, + 45496, + 45497, + 45498, + 45499, + 45500, + 45501, + 45502, + 45503, + 45504, + 45505, + 45506, + 45507, + 45508, + 45509, + 45510, + 45511, + 45512, + 45513, + 45514, + 45516, + 45517, + 45518, + 45519, + 45520, + 45521, + 45522, + 45523, + 45524, + 45525, + 45526, + 45527, + 45528, + 45529, + 45530, + 45531, + 45532, + 45533, + 45534, + 45535, + 45536, + 45537, + 45538, + 45539, + 45540, + 45541, + 45542, + 45543, + 45544, + 45545, + 45546, + 45547, + 45548, + 45549, + 45550, + 45551, + 45552, + 45553, + 45554, + 45555, + 45556, + 45557, + 45558, + 45559, + 45560, + 45561, + 45562, + 45563, + 45564, + 45565, + 45566, + 45567, + 45568, + 45569, + 45570, + 45571, + 45572, + 45573, + 45574, + 45575, + 45576, + 45577, + 45578, + 45579, + 45580, + 45581, + 45582, + 45583, + 45584, + 45585, + 45586, + 45587, + 45588, + 45589, + 45590, + 45591, + 45592, + 45593, + 45594, + 45595, + 45596, + 45597, + 45598, + 45599, + 45600, + 45601, + 45602, + 45603, + 45604, + 45605, + 45606, + 45608, + 45609, + 45610, + 45611, + 45612, + 45613, + 45614, + 45615, + 45616, + 45617, + 45618, + 45619, + 45620, + 45621, + 45622, + 45623, + 45624, + 45625, + 45626, + 45627, + 45628, + 45629, + 45630, + 45631, + 45632, + 45633, + 45634, + 45635, + 45636, + 45637, + 45638, + 45639, + 45640, + 45641, + 45642, + 45643, + 45644, + 45645, + 45646, + 45647, + 45648, + 45649, + 45650, + 45651, + 45652, + 45653, + 45654, + 45655, + 45656, + 45657, + 45658, + 45659, + 45660, + 45661, + 45662, + 45663, + 45664, + 45665, + 45666, + 45667, + 45668, + 45669, + 45670, + 45671, + 45672, + 45673, + 45674, + 45675, + 45676, + 45677, + 45678, + 45679, + 45680, + 45681, + 45682, + 45684, + 45685, + 45686, + 45687, + 45688, + 45689, + 45690, + 45691, + 45692, + 45693, + 45694, + 45695, + 45696, + 45697, + 45698, + 45699, + 45701, + 45702, + 45703, + 45704, + 45705, + 45706, + 45707, + 45708, + 45709, + 45710, + 45711, + 45712, + 45713, + 45714, + 45715, + 45716, + 45717, + 45718, + 45719, + 45720, + 45721, + 45722, + 45723, + 45724, + 45725, + 45726, + 45727, + 45728, + 45729, + 45730, + 45731, + 45732, + 45733, + 45734, + 45735, + 45736, + 45737, + 45738, + 45739, + 45740, + 45741, + 45742, + 45743, + 45744, + 45745, + 45746, + 45747, + 45748, + 45749, + 45750, + 45751, + 45752, + 45753, + 45754, + 45755, + 45756, + 45757, + 45758, + 45759, + 45760, + 45761, + 45762, + 45763, + 45764, + 45765, + 45766, + 45767, + 45768, + 45769, + 45770, + 45771, + 45772, + 45773, + 45774, + 45775, + 45776, + 45777, + 45778, + 45779, + 45780, + 45781, + 45782, + 45783, + 45784, + 45785, + 45786, + 45787, + 45788, + 45789, + 45790, + 45791, + 45792, + 45793, + 45794, + 45795, + 45796, + 45797, + 45798, + 45799, + 45800, + 45801, + 45802, + 45803, + 45804, + 45805, + 45806, + 45807, + 45808, + 45809, + 45810, + 45811, + 45812, + 45813, + 45814, + 45815, + 45816, + 45817, + 45818, + 45819, + 45820, + 45821, + 45822, + 45823, + 45824, + 45825, + 45826, + 45827, + 45828, + 45829, + 45830, + 45831, + 45832, + 45833, + 45834, + 45835, + 45836, + 45837, + 45838, + 45839, + 45840, + 45841, + 45842, + 45843, + 45844, + 45845, + 45846, + 45847, + 45848, + 45849, + 45850, + 45851, + 45852, + 45853, + 45855, + 45856, + 45857, + 45858, + 45859, + 45860, + 45861, + 45862, + 45863, + 45864, + 45865, + 45866, + 45867, + 45868, + 45869, + 45870, + 45871, + 45872, + 45873, + 45874, + 45876, + 45877, + 45878, + 45879, + 45880, + 45881, + 45882, + 45883, + 45884, + 45885, + 45886, + 45887, + 45888, + 45889, + 45890, + 45891, + 45892, + 45893, + 45894, + 45895, + 45896, + 45897, + 45898, + 45899, + 45900, + 45901, + 45902, + 45903, + 45904, + 45905, + 45906, + 45907, + 45908, + 45909, + 45910, + 45911, + 45912, + 45913, + 45914, + 45915, + 45916, + 45917, + 45918, + 45919, + 45920, + 45921, + 45922, + 45923, + 45924, + 45926, + 45927, + 45928, + 45929, + 45930, + 45931, + 45932, + 45933, + 45934, + 45935, + 45936, + 45937, + 45938, + 45939, + 45940, + 45941, + 45942, + 45943, + 45944, + 45945, + 45946, + 45947, + 45948, + 45949, + 45950, + 45951, + 45952, + 45953, + 45954, + 45955, + 45956, + 45957, + 45958, + 45959, + 45960, + 45961, + 45962, + 45963, + 45964, + 45965, + 45966, + 45967, + 45968, + 45969, + 45970, + 45971, + 45972, + 45973, + 45974, + 45975, + 45976, + 45977, + 45978, + 45979, + 45980, + 45981, + 45982, + 45983, + 45984, + 45985, + 45986, + 45987, + 45988, + 45989, + 45990, + 45991, + 45992, + 45994, + 45995, + 45996, + 45997, + 45998, + 45999, + 46000, + 46001, + 46002, + 46003, + 46004, + 46005, + 46006, + 46007, + 46008, + 46009, + 46010, + 46011, + 46012, + 46013, + 46014, + 46015, + 46016, + 46017, + 46018, + 46020, + 46021, + 46022, + 46023, + 46024, + 46025, + 46026, + 46027, + 46028, + 46029, + 46030, + 46031, + 46032, + 46033, + 46034, + 46035, + 46036, + 46037, + 46038, + 46039, + 46040, + 46041, + 46042, + 46043, + 46044, + 46045, + 46046, + 46047, + 46048, + 46049, + 46050, + 46051, + 46052, + 46053, + 46054, + 46055, + 46056, + 46058, + 46059, + 46060, + 46061, + 46062, + 46063, + 46064, + 46065, + 46066, + 46067, + 46068, + 46069, + 46070, + 46071, + 46072, + 46073, + 46074, + 46075, + 46076, + 46077, + 46078, + 46079, + 46080, + 46081, + 46082, + 46083, + 46084, + 46085, + 46086, + 46087, + 46088, + 46089, + 46090, + 46091, + 46092, + 46093, + 46094, + 46095, + 46096, + 46097, + 46098, + 46099, + 46100, + 46101, + 46102, + 46103, + 46104, + 46105, + 46106, + 46107, + 46108, + 46109, + 46110, + 46111, + 46112, + 46113, + 46114, + 46115, + 46116, + 46117, + 46118, + 46119, + 46120, + 46121, + 46122, + 46123, + 46124, + 46125, + 46126, + 46127, + 46128, + 46129, + 46130, + 46132, + 46133, + 46134, + 46135, + 46136, + 46137, + 46138, + 46139, + 46140, + 46141, + 46142, + 46143, + 46144, + 46145, + 46146, + 46147, + 46148, + 46149, + 46150, + 46151, + 46152, + 46153, + 46154, + 46156, + 46157, + 46158, + 46159, + 46160, + 46161, + 46162, + 46163, + 46164, + 46165, + 46166, + 46167, + 46168, + 46169, + 46170, + 46171, + 46172, + 46173, + 46174, + 46175, + 46177, + 46178, + 46179, + 46180, + 46181, + 46182, + 46183, + 46184, + 46185, + 46186, + 46187, + 46188, + 46189, + 46190, + 46191, + 46192, + 46193, + 46194, + 46195, + 46196, + 46197, + 46198, + 46199, + 46200, + 46201, + 46202, + 46203, + 46204, + 46205, + 46206, + 46207, + 46208, + 46209, + 46210, + 46211, + 46212, + 46213, + 46214, + 46215, + 46216, + 46217, + 46218, + 46219, + 46220, + 46221, + 46222, + 46223, + 46224, + 46225, + 46226, + 46227, + 46228, + 46229, + 46230, + 46231, + 46233, + 46234, + 46235, + 46236, + 46237, + 46238, + 46239, + 46240, + 46241, + 46242, + 46243, + 46244, + 46245, + 46246, + 46247, + 46248, + 46249, + 46250, + 46251, + 46252, + 46253, + 46254, + 46255, + 46256, + 46258, + 46259, + 46260, + 46261, + 46262, + 46263, + 46264, + 46265, + 46266, + 46267, + 46268, + 46269, + 46270, + 46271, + 46272, + 46273, + 46274, + 46275, + 46276, + 46277, + 46278, + 46279, + 46280, + 46281, + 46282, + 46283, + 46284, + 46285, + 46286, + 46287, + 46288, + 46289, + 46290, + 46291, + 46292, + 46293, + 46294, + 46295, + 46296, + 46297, + 46298, + 46299, + 46300, + 46301, + 46302, + 46303, + 46304, + 46305, + 46306, + 46307, + 46308, + 46309, + 46310, + 46311, + 46312, + 46313, + 46314, + 46315, + 46316, + 46317, + 46318, + 46319, + 46320, + 46321, + 46322, + 46323, + 46324, + 46325, + 46326, + 46327, + 46328, + 46329, + 46331, + 46332, + 46333, + 46334, + 46335, + 46336, + 46337, + 46338, + 46339, + 46340, + 46341, + 46342, + 46343, + 46344, + 46345, + 46346, + 46347, + 46348, + 46349, + 46350, + 46351, + 46352, + 46353, + 46354, + 46355, + 46356, + 46357, + 46358, + 46359, + 46360, + 46361, + 46362, + 46363, + 46364, + 46365, + 46366, + 46367, + 46368, + 46369, + 46370, + 46371, + 46372, + 46373, + 46374, + 46375, + 46377, + 46378, + 46379, + 46380, + 46381, + 46382, + 46383, + 46384, + 46385, + 46386, + 46387, + 46388, + 46389, + 46390, + 46391, + 46392, + 46393, + 46394, + 46395, + 46396, + 46397, + 46398, + 46399, + 46400, + 46401, + 46402, + 46403, + 46404, + 46405, + 46406, + 46407, + 46408, + 46409, + 46410, + 46411, + 46412, + 46413, + 46415, + 46416, + 46417, + 46418, + 46419, + 46420, + 46421, + 46422, + 46423, + 46425, + 46426, + 46427, + 46428, + 46429, + 46430, + 46431, + 46432, + 46433, + 46434, + 46435, + 46436, + 46437, + 46438, + 46439, + 46440, + 46441, + 46442, + 46443, + 46444, + 46445, + 46446, + 46447, + 46448, + 46449, + 46450, + 46451, + 46452, + 46453, + 46454, + 46455, + 46457, + 46458, + 46459, + 46460, + 46461, + 46462, + 46463, + 46464, + 46465, + 46466, + 46467, + 46468, + 46469, + 46470, + 46471, + 46472, + 46473, + 46474, + 46475, + 46476, + 46477, + 46478, + 46479, + 46480, + 46481, + 46482, + 46483, + 46484, + 46485, + 46486, + 46487, + 46488, + 46489, + 46490, + 46491, + 46492, + 46493, + 46494, + 46495, + 46496, + 46497, + 46498, + 46499, + 46500, + 46501, + 46502, + 46503, + 46504, + 46505, + 46506, + 46507, + 46508, + 46509, + 46510, + 46511, + 46512, + 46513, + 46514, + 46515, + 46516, + 46517, + 46518, + 46519, + 46520, + 46521, + 46522, + 46523, + 46527, + 46528, + 46530, + 46531, + 46533, + 46534, + 46535, + 46536, + 46537, + 46538, + 46539, + 46540, + 46541, + 46542, + 46543, + 46544, + 46545, + 46546, + 46547, + 46548, + 46549, + 46550, + 46551, + 46552, + 46553, + 46554, + 46555, + 46556, + 46557, + 46558, + 46559, + 46560, + 46561, + 46562, + 46563, + 46564, + 46565, + 46566, + 46567, + 46568, + 46569, + 46570, + 46571, + 46572, + 46574, + 46575, + 46576, + 46577, + 46578, + 46579, + 46580, + 46581, + 46582, + 46583, + 46584, + 46585, + 46586, + 46587, + 46588, + 46589, + 46590, + 46591, + 46592, + 46593, + 46595, + 46596, + 46597, + 46598, + 46599, + 46600, + 46601, + 46602, + 46603, + 46604, + 46605, + 46606, + 46607, + 46608, + 46609, + 46610, + 46611, + 46612, + 46614, + 46615, + 46616, + 46617, + 46618, + 46619, + 46620, + 46621, + 46622, + 46623, + 46624, + 46625, + 46626, + 46627, + 46628, + 46629, + 46630, + 46631, + 46632, + 46633, + 46634, + 46635, + 46636, + 46637, + 46638, + 46639, + 46640, + 46641, + 46642, + 46643, + 46644, + 46645, + 46646, + 46647, + 46648, + 46649, + 46650, + 46651, + 46652, + 46653, + 46654, + 46655, + 46656, + 46657, + 46658, + 46659, + 46660, + 46661, + 46662, + 46663, + 46664, + 46665, + 46666, + 46667, + 46668, + 46669, + 46670, + 46671, + 46672, + 46673, + 46674, + 46675, + 46677, + 46678, + 46679, + 46680, + 46681, + 46682, + 46683, + 46684, + 46685, + 46686, + 46687, + 46688, + 46689, + 46690, + 46691, + 46692, + 46693, + 46694, + 46696, + 46697, + 46698, + 46699, + 46700, + 46701, + 46702, + 46703, + 46704, + 46705, + 46706, + 46707, + 46708, + 46709, + 46710, + 46711, + 46712, + 46713, + 46714, + 46715, + 46716, + 46717, + 46718, + 46719, + 46720, + 46721, + 46722, + 46723, + 46724, + 46725, + 46726, + 46727, + 46728, + 46729, + 46730, + 46731, + 46732, + 46733, + 46734, + 46735, + 46736, + 46737, + 46738, + 46739, + 46740, + 46741, + 46742, + 46743, + 46744, + 46745, + 46746, + 46747, + 46748, + 46749, + 46750, + 46751, + 46752, + 46753, + 46755, + 46756, + 46757, + 46758, + 46759, + 46760, + 46761, + 46762, + 46763, + 46764, + 46765, + 46766, + 46767, + 46768, + 46769, + 46770, + 46771, + 46772, + 46773, + 46774, + 46775, + 46776, + 46778, + 46779, + 46780, + 46781, + 46782, + 46783, + 46784, + 46785, + 46786, + 46787, + 46788, + 46789, + 46790, + 46791, + 46792, + 46793, + 46794, + 46795, + 46796, + 46797, + 46798, + 46799, + 46800, + 46801, + 46802, + 46803, + 46804, + 46805, + 46806, + 46807, + 46808, + 46809, + 46810, + 46811, + 46812, + 46813, + 46814, + 46816, + 46817, + 46818, + 46819, + 46820, + 46821, + 46822, + 46823, + 46824, + 46825, + 46826, + 46827, + 46828, + 46829, + 46830, + 46831, + 46832, + 46833, + 46834, + 46835, + 46836, + 46837, + 46838, + 46839, + 46841, + 46842, + 46843, + 46844, + 46845, + 46846, + 46847, + 46848, + 46849, + 46850, + 46851, + 46852, + 46853, + 46854, + 46855, + 46856, + 46857, + 46858, + 46859, + 46860, + 46861, + 46862, + 46863, + 46864, + 46865, + 46866, + 46867, + 46868, + 46869, + 46870, + 46871, + 46872, + 46873, + 46874, + 46875, + 46876, + 46877, + 46878, + 46879, + 46881, + 46882, + 46883, + 46884, + 46885, + 46886, + 46887, + 46888, + 46889, + 46890, + 46891, + 46892, + 46893, + 46894, + 46895, + 46896, + 46897, + 46898, + 46899, + 46900, + 46901, + 46902, + 46903, + 46904, + 46905, + 46906, + 46907, + 46908, + 46909, + 46910, + 46911, + 46912, + 46913, + 46914, + 46915, + 46916, + 46917, + 46918, + 46919, + 46920, + 46921, + 46922, + 46923, + 46924, + 46925, + 46926, + 46927, + 46928, + 46929, + 46930, + 46931, + 46932, + 46933, + 46934, + 46935, + 46936, + 46937, + 46938, + 46939, + 46940, + 46941, + 46942, + 46943, + 46944, + 46945, + 46946, + 46947, + 46948, + 46949, + 46950, + 46951, + 46952, + 46953, + 46954, + 46955, + 46956, + 46957, + 46958, + 46959, + 46960, + 46961, + 46962, + 46963, + 46964, + 46965, + 46966, + 46967, + 46968, + 46969, + 46970, + 46971, + 46972, + 46973, + 46974, + 46975, + 46976, + 46977, + 46978, + 46979, + 46980, + 46981, + 46982, + 46983, + 46984, + 46985, + 46986, + 46987, + 46988, + 46990, + 46991, + 46992, + 46993, + 46994, + 46995, + 46996, + 46997, + 46998, + 46999, + 47000, + 47001, + 47002, + 47003, + 47004, + 47005, + 47006, + 47007, + 47008, + 47009, + 47010, + 47011, + 47012, + 47013, + 47014, + 47015, + 47016, + 47017, + 47018, + 47019, + 47020, + 47021, + 47022, + 47023, + 47024, + 47025, + 47026, + 47027, + 47028, + 47029, + 47030, + 47031, + 47032, + 47033, + 47034, + 47035, + 47036, + 47037, + 47038, + 47039, + 47040, + 47041, + 47042, + 47043, + 47044, + 47045, + 47046, + 47047, + 47048, + 47049, + 47050, + 47051, + 47052, + 47053, + 47055, + 47056, + 47057, + 47058, + 47059, + 47060, + 47061, + 47062, + 47063, + 47064, + 47066, + 47067, + 47068, + 47069, + 47070, + 47071, + 47072, + 47073, + 47074, + 47075, + 47076, + 47077, + 47079, + 47080, + 47081, + 47082, + 47083, + 47084, + 47085, + 47086, + 47087, + 47088, + 47089, + 47090, + 47092, + 47093, + 47094, + 47095, + 47096, + 47097, + 47098, + 47099, + 47100, + 47101, + 47102, + 47103, + 47104, + 47105, + 47106, + 47107, + 47108, + 47109, + 47110, + 47111, + 47112, + 47113, + 47114, + 47115, + 47116, + 47117, + 47118, + 47119, + 47120, + 47121, + 47122, + 47124, + 47125, + 47126, + 47127, + 47128, + 47129, + 47130, + 47131, + 47133, + 47134, + 47135, + 47136, + 47137, + 47138, + 47139, + 47140, + 47141, + 47142, + 47143, + 47144, + 47145, + 47146, + 47147, + 47148, + 47149, + 47150, + 47151, + 47152, + 47153, + 47154, + 47155, + 47156, + 47157, + 47158, + 47159, + 47160, + 47161, + 47162, + 47163, + 47164, + 47165, + 47166, + 47167, + 47168, + 47169, + 47170, + 47171, + 47172, + 47173, + 47174, + 47175, + 47176, + 47177, + 47178, + 47179, + 47180, + 47181, + 47182, + 47183, + 47184, + 47185, + 47186, + 47187, + 47188, + 47189, + 47190, + 47191, + 47192, + 47193, + 47194, + 47195, + 47196, + 47197, + 47198, + 47199, + 47200, + 47201, + 47202, + 47203, + 47204, + 47205, + 47206, + 47207, + 47208, + 47209, + 47210, + 47211, + 47212, + 47213, + 47214, + 47215, + 47216, + 47217, + 47218, + 47219, + 47220, + 47221, + 47222, + 47223, + 47224, + 47225, + 47226, + 47227, + 47228, + 47229, + 47230, + 47231, + 47232, + 47233, + 47234, + 47235, + 47236, + 47237, + 47238, + 47239, + 47240, + 47241, + 47242, + 47243, + 47244, + 47245, + 47246, + 47247, + 47248, + 47249, + 47250, + 47251, + 47252, + 47253, + 47254, + 47255, + 47256, + 47257, + 47258, + 47259, + 47260, + 47261, + 47262, + 47263, + 47264, + 47265, + 47266, + 47267, + 47268, + 47269, + 47270, + 47271, + 47272, + 47273, + 47274, + 47275, + 47276, + 47277, + 47278, + 47279, + 47281, + 47282, + 47283, + 47284, + 47285, + 47286, + 47287, + 47288, + 47289, + 47290, + 47291, + 47292, + 47293, + 47295, + 47296, + 47297, + 47298, + 47299, + 47300, + 47301, + 47302, + 47303, + 47304, + 47305, + 47306, + 47307, + 47308, + 47309, + 47310, + 47311, + 47312, + 47313, + 47314, + 47315, + 47316, + 47317, + 47318, + 47319, + 47320, + 47321, + 47322, + 47323, + 47324, + 47325, + 47326, + 47327, + 47328, + 47329, + 47330, + 47331, + 47332, + 47333, + 47334, + 47335, + 47336, + 47337, + 47338, + 47339, + 47340, + 47341, + 47342, + 47343, + 47344, + 47345, + 47346, + 47347, + 47348, + 47349, + 47350, + 47351, + 47352, + 47353, + 47354, + 47355, + 47356, + 47357, + 47358, + 47359, + 47360, + 47361, + 47362, + 47363, + 47364, + 47365, + 47366, + 47367, + 47368, + 47369, + 47370, + 47371, + 47372, + 47373, + 47374, + 47375, + 47377, + 47378, + 47379, + 47380, + 47381, + 47382, + 47383, + 47384, + 47385, + 47386, + 47387, + 47388, + 47389, + 47390, + 47391, + 47392, + 47393, + 47394, + 47395, + 47396, + 47397, + 47398, + 47399, + 47400, + 47401, + 47402, + 47403, + 47404, + 47405, + 47406, + 47407, + 47408, + 47409, + 47410, + 47411, + 47412, + 47413, + 47414, + 47415, + 47416, + 47417, + 47418, + 47419, + 47420, + 47421, + 47422, + 47423, + 47424, + 47425, + 47426, + 47427, + 47428, + 47429, + 47430, + 47431, + 47432, + 47433, + 47434, + 47435, + 47436, + 47437, + 47438, + 47439, + 47440, + 47441, + 47442, + 47444, + 47445, + 47446, + 47448, + 47449, + 47450, + 47451, + 47452, + 47453, + 47454, + 47455, + 47456, + 47457, + 47458, + 47459, + 47460, + 47461, + 47462, + 47463, + 47464, + 47465, + 47466, + 47467, + 47468, + 47469, + 47470, + 47471, + 47472, + 47473, + 47474, + 47475, + 47476, + 47477, + 47478, + 47479, + 47480, + 47481, + 47482, + 47483, + 47484, + 47485, + 47486, + 47487, + 47488, + 47489, + 47490, + 47491, + 47492, + 47493, + 47494, + 47495, + 47496, + 47497, + 47498, + 47499, + 47500, + 47501, + 47502, + 47503, + 47504, + 47505, + 47506, + 47507, + 47509, + 47510, + 47511, + 47512, + 47513, + 47514, + 47515, + 47516, + 47517, + 47518, + 47519, + 47520, + 47521, + 47522, + 47523, + 47524, + 47525, + 47526, + 47527, + 47528, + 47529, + 47530, + 47531, + 47532, + 47533, + 47534, + 47535, + 47536, + 47537, + 47538, + 47539, + 47540, + 47541, + 47542, + 47543, + 47544, + 47545, + 47546, + 47547, + 47548, + 47549, + 47550, + 47551, + 47552, + 47553, + 47554, + 47555, + 47556, + 47557, + 47558, + 47559, + 47560, + 47561, + 47562, + 47563, + 47564, + 47565, + 47566, + 47567, + 47568, + 47569, + 47570, + 47571, + 47572, + 47573, + 47574, + 47575, + 47576, + 47577, + 47578, + 47579, + 47580, + 47581, + 47582, + 47583, + 47584, + 47585, + 47586, + 47587, + 47588, + 47589, + 47590, + 47591, + 47592, + 47593, + 47594, + 47595, + 47596, + 47597, + 47598, + 47599, + 47600, + 47601, + 47602, + 47603, + 47604, + 47605, + 47606, + 47607, + 47608, + 47609, + 47610, + 47611, + 47612, + 47613, + 47614, + 47615, + 47616, + 47617, + 47618, + 47619, + 47620, + 47621, + 47622, + 47623, + 47624, + 47625, + 47626, + 47627, + 47628, + 47629, + 47630, + 47631, + 47632, + 47633, + 47634, + 47635, + 47636, + 47637, + 47638, + 47639, + 47640, + 47641, + 47642, + 47643, + 47644, + 47645, + 47646, + 47647, + 47648, + 47649, + 47650, + 47651, + 47652, + 47653, + 47654, + 47655, + 47656, + 47657, + 47658, + 47659, + 47660, + 47661, + 47662, + 47663, + 47664, + 47665, + 47666, + 47667, + 47668, + 47669, + 47670, + 47671, + 47672, + 47673, + 47674, + 47675, + 47676, + 47677, + 47678, + 47679, + 47680, + 47681, + 47682, + 47683, + 47684, + 47685, + 47686, + 47687, + 47688, + 47689, + 47690, + 47691, + 47692, + 47693, + 47694, + 47695, + 47696, + 47697, + 47698, + 47699, + 47700, + 47701, + 47702, + 47703, + 47704, + 47705, + 47706, + 47707, + 47708, + 47709, + 47710, + 47712, + 47713, + 47714, + 47715, + 47716, + 47717, + 47718, + 47719, + 47720, + 47721, + 47722, + 47723, + 47724, + 47725, + 47726, + 47727, + 47728, + 47729, + 47730, + 47731, + 47732, + 47733, + 47734, + 47735, + 47736, + 47738, + 47739, + 47740, + 47741, + 47742, + 47743, + 47744, + 47745, + 47746, + 47747, + 47748, + 47749, + 47750, + 47751, + 47752, + 47753, + 47754, + 47755, + 47756, + 47757, + 47758, + 47759, + 47760, + 47761, + 47762, + 47763, + 47764, + 47765, + 47766, + 47767, + 47768, + 47769, + 47770, + 47771, + 47772, + 47773, + 47774, + 47775, + 47776, + 47777, + 47778, + 47779, + 47780, + 47781, + 47782, + 47783, + 47784, + 47785, + 47786, + 47787, + 47788, + 47789, + 47790, + 47791, + 47792, + 47793, + 47794, + 47795, + 47796, + 47797, + 47798, + 47799, + 47800, + 47801, + 47802, + 47803, + 47804, + 47805, + 47806, + 47807, + 47808, + 47809, + 47810, + 47811, + 47812, + 47813, + 47814, + 47815, + 47816, + 47817, + 47818, + 47819, + 47820, + 47821, + 47822, + 47823, + 47824, + 47825, + 47826, + 47827, + 47828, + 47829, + 47830, + 47831, + 47832, + 47833, + 47834, + 47835, + 47836, + 47837, + 47838, + 47839, + 47840, + 47841, + 47843, + 47844, + 47845, + 47846, + 47847, + 47848, + 47849, + 47850, + 47851, + 47852, + 47853, + 47854, + 47855, + 47856, + 47857, + 47858, + 47859, + 47860, + 47861, + 47862, + 47863, + 47864, + 47865, + 47866, + 47867, + 47868, + 47869, + 47870, + 47871, + 47872, + 47874, + 47875, + 47876, + 47877, + 47878, + 47879, + 47880, + 47881, + 47882, + 47883, + 47884, + 47885, + 47886, + 47887, + 47888, + 47889, + 47890, + 47891, + 47893, + 47894, + 47895, + 47896, + 47897, + 47898, + 47899, + 47900, + 47901, + 47902, + 47903, + 47904, + 47905, + 47906, + 47907, + 47908, + 47909, + 47910, + 47911, + 47912, + 47913, + 47914, + 47915, + 47916, + 47917, + 47918, + 47919, + 47920, + 47921, + 47922, + 47923, + 47924, + 47925, + 47926, + 47927, + 47928, + 47929, + 47930, + 47931, + 47932, + 47933, + 47934, + 47935, + 47936, + 47937, + 47938, + 47939, + 47940, + 47941, + 47942, + 47943, + 47944, + 47945, + 47946, + 47947, + 47948, + 47949, + 47950, + 47951, + 47952, + 47953, + 47954, + 47955, + 47956, + 47957, + 47958, + 47959, + 47960, + 47961, + 47962, + 47963, + 47964, + 47965, + 47966, + 47967, + 47968, + 47969, + 47970, + 47971, + 47972, + 47973, + 47974, + 47975, + 47976, + 47977, + 47978, + 47979, + 47980, + 47981, + 47982, + 47983, + 47984, + 47985, + 47986, + 47987, + 47988, + 47990, + 47991, + 47992, + 47993, + 47994, + 47995, + 47996, + 47997, + 47998, + 47999, + 48000, + 48001, + 48002, + 48003, + 48004, + 48005, + 48006, + 48007, + 48008, + 48009, + 48010, + 48011, + 48012, + 48013, + 48014, + 48015, + 48016, + 48017, + 48018, + 48019, + 48020, + 48021, + 48022, + 48023, + 48024, + 48025, + 48026, + 48027, + 48029, + 48030, + 48031, + 48032, + 48033, + 48034, + 48035, + 48036, + 48037, + 48038, + 48039, + 48040, + 48041, + 48043, + 48044, + 48045, + 48046, + 48047, + 48048, + 48049, + 48050, + 48051, + 48052, + 48053, + 48054, + 48055, + 48056, + 48057, + 48058, + 48059, + 48060, + 48061, + 48062, + 48063, + 48064, + 48065, + 48066, + 48067, + 48068, + 48069, + 48070, + 48071, + 48072, + 48073, + 48074, + 48075, + 48076, + 48077, + 48078, + 48079, + 48080, + 48081, + 48082, + 48083, + 48084, + 48085, + 48086, + 48087, + 48088, + 48089, + 48090, + 48091, + 48092, + 48093, + 48094, + 48095, + 48096, + 48097, + 48098, + 48099, + 48100, + 48101, + 48102, + 48103, + 48104, + 48105, + 48106, + 48107, + 48108, + 48109, + 48110, + 48111, + 48112, + 48113, + 48114, + 48115, + 48116, + 48117, + 48118, + 48119, + 48120, + 48121, + 48122, + 48123, + 48124, + 48125, + 48126, + 48127, + 48128, + 48129, + 48130, + 48131, + 48132, + 48133, + 48134, + 48135, + 48136, + 48137, + 48138, + 48139, + 48140, + 48141, + 48142, + 48143, + 48144, + 48145, + 48146, + 48147, + 48148, + 48149, + 48150, + 48151, + 48152, + 48153, + 48154, + 48155, + 48156, + 48157, + 48158, + 48159, + 48160, + 48161, + 48162, + 48163, + 48164, + 48166, + 48167, + 48168, + 48169, + 48170, + 48171, + 48172, + 48173, + 48174, + 48175, + 48176, + 48177, + 48178, + 48179, + 48180, + 48181, + 48182, + 48183, + 48184, + 48185, + 48186, + 48187, + 48188, + 48189, + 48190, + 48191, + 48192, + 48193, + 48194, + 48195, + 48196, + 48197, + 48198, + 48199, + 48200, + 48201, + 48202, + 48203, + 48204, + 48205, + 48206, + 48207, + 48208, + 48209, + 48210, + 48211, + 48212, + 48213, + 48214, + 48215, + 48216, + 48217, + 48218, + 48219, + 48220, + 48221, + 48222, + 48223, + 48224, + 48225, + 48226, + 48227, + 48228, + 48230, + 48231, + 48232, + 48233, + 48234, + 48235, + 48236, + 48237, + 48238, + 48239, + 48240, + 48241, + 48242, + 48243, + 48244, + 48245, + 48246, + 48247, + 48248, + 48249, + 48250, + 48251, + 48252, + 48253, + 48254, + 48255, + 48256, + 48257, + 48258, + 48259, + 48260, + 48261, + 48262, + 48263, + 48264, + 48265, + 48266, + 48267, + 48268, + 48269, + 48270, + 48271, + 48272, + 48273, + 48274, + 48275, + 48276, + 48277, + 48278, + 48279, + 48280, + 48281, + 48282, + 48283, + 48284, + 48285, + 48286, + 48287, + 48288, + 48289, + 48290, + 48291, + 48292, + 48293, + 48294, + 48295, + 48296, + 48297, + 48298, + 48299, + 48300, + 48301, + 48302, + 48303, + 48304, + 48305, + 48306, + 48307, + 48308, + 48309, + 48310, + 48311, + 48312, + 48313, + 48314, + 48315, + 48316, + 48318, + 48319, + 48320, + 48321, + 48322, + 48323, + 48324, + 48325, + 48326, + 48328, + 48329, + 48330, + 48331, + 48332, + 48333, + 48334, + 48335, + 48336, + 48337, + 48338, + 48339, + 48340, + 48341, + 48342, + 48343, + 48344, + 48345, + 48346, + 48347, + 48348, + 48349, + 48350, + 48351, + 48352, + 48353, + 48354, + 48355, + 48356, + 48357, + 48358, + 48359, + 48360, + 48361, + 48362, + 48363, + 48364, + 48365, + 48366, + 48367, + 48368, + 48369, + 48370, + 48371, + 48372, + 48373, + 48374, + 48375, + 48376, + 48377, + 48378, + 48379, + 48380, + 48381, + 48383, + 48385, + 48386, + 48387, + 48388, + 48389, + 48390, + 48391, + 48392, + 48393, + 48394, + 48395, + 48396, + 48397, + 48398, + 48399, + 48400, + 48401, + 48402, + 48403, + 48404, + 48405, + 48406, + 48407, + 48408, + 48409, + 48410, + 48411, + 48412, + 48413, + 48414, + 48415, + 48416, + 48417, + 48418, + 48419, + 48420, + 48421, + 48422, + 48423, + 48424, + 48425, + 48426, + 48427, + 48428, + 48429, + 48430, + 48431, + 48432, + 48433, + 48434, + 48435, + 48436, + 48437, + 48438, + 48439, + 48440, + 48441, + 48442, + 48443, + 48444, + 48445, + 48446, + 48447, + 48448, + 48449, + 48450, + 48451, + 48452, + 48453, + 48454, + 48455, + 48456, + 48457, + 48459, + 48460, + 48461, + 48462, + 48463, + 48464, + 48465, + 48466, + 48467, + 48468, + 48469, + 48470, + 48471, + 48472, + 48473, + 48474, + 48475, + 48476, + 48477, + 48479, + 48480, + 48481, + 48483, + 48484, + 48485, + 48486, + 48487, + 48488, + 48489, + 48490, + 48491, + 48492, + 48493, + 48494, + 48495, + 48496, + 48497, + 48498, + 48499, + 48500, + 48501, + 48502, + 48503, + 48504, + 48505, + 48506, + 48507, + 48508, + 48509, + 48510, + 48511, + 48512, + 48513, + 48514, + 48515, + 48516, + 48517, + 48518, + 48520, + 48521, + 48522, + 48523, + 48524, + 48525, + 48526, + 48527, + 48528, + 48529, + 48530, + 48532, + 48533, + 48534, + 48535, + 48536, + 48537, + 48538, + 48539, + 48540, + 48541, + 48542, + 48543, + 48544, + 48545, + 48546, + 48547, + 48548, + 48549, + 48550, + 48551, + 48552, + 48553, + 48554, + 48555, + 48556, + 48557, + 48558, + 48559, + 48560, + 48561, + 48562, + 48563, + 48564, + 48565, + 48566, + 48567, + 48568, + 48570, + 48571, + 48572, + 48573, + 48574, + 48575, + 48576, + 48577, + 48578, + 48579, + 48580, + 48581, + 48582, + 48583, + 48584, + 48585, + 48586, + 48587, + 48588, + 48589, + 48591, + 48592, + 48593, + 48594, + 48595, + 48596, + 48597, + 48598, + 48599, + 48600, + 48601, + 48602, + 48603, + 48604, + 48605, + 48606, + 48607, + 48608, + 48609, + 48610, + 48611, + 48612, + 48613, + 48614, + 48615, + 48616, + 48617, + 48618, + 48619, + 48620, + 48621, + 48622, + 48623, + 48624, + 48625, + 48626, + 48627, + 48628, + 48629, + 48630, + 48631, + 48632, + 48633, + 48634, + 48635, + 48636, + 48637, + 48638, + 48639, + 48640, + 48641, + 48642, + 48643, + 48644, + 48645, + 48646, + 48647, + 48648, + 48649, + 48650, + 48651, + 48652, + 48653, + 48654, + 48655, + 48656, + 48657, + 48658, + 48659, + 48660, + 48661, + 48662, + 48663, + 48664, + 48665, + 48666, + 48667, + 48668, + 48669, + 48670, + 48671, + 48672, + 48673, + 48674, + 48675, + 48676, + 48677, + 48678, + 48679, + 48680, + 48681, + 48682, + 48683, + 48684, + 48685, + 48686, + 48687, + 48688, + 48689, + 48690, + 48691, + 48692, + 48693, + 48694, + 48695, + 48696, + 48697, + 48698, + 48699, + 48700, + 48701, + 48702, + 48703, + 48704, + 48706, + 48707, + 48708, + 48709, + 48710, + 48711, + 48712, + 48713, + 48715, + 48716, + 48717, + 48718, + 48719, + 48720, + 48721, + 48722, + 48723, + 48724, + 48725, + 48726, + 48727, + 48728, + 48729, + 48730, + 48731, + 48732, + 48733, + 48734, + 48735, + 48736, + 48737, + 48738, + 48739, + 48740, + 48741, + 48742, + 48743, + 48744, + 48745, + 48746, + 48747, + 48748, + 48749, + 48750, + 48751, + 48752, + 48753, + 48754, + 48755, + 48756, + 48757, + 48758, + 48759, + 48760, + 48761, + 48762, + 48764, + 48765, + 48766, + 48767, + 48768, + 48769, + 48770, + 48771, + 48772, + 48773, + 48774, + 48775, + 48776, + 48777, + 48778, + 48779, + 48780, + 48781, + 48782, + 48783, + 48784, + 48785, + 48786, + 48787, + 48788, + 48789, + 48790, + 48791, + 48792, + 48793, + 48794, + 48795, + 48796, + 48797, + 48798, + 48800, + 48801, + 48802, + 48803, + 48804, + 48805, + 48806, + 48807, + 48808, + 48809, + 48810, + 48811, + 48812, + 48813, + 48814, + 48815, + 48816, + 48817, + 48818, + 48819, + 48820, + 48821, + 48822, + 48823, + 48824, + 48825, + 48826, + 48827, + 48828, + 48829, + 48830, + 48831, + 48832, + 48833, + 48834, + 48835, + 48836, + 48837, + 48838, + 48839, + 48840, + 48841, + 48842, + 48843, + 48844, + 48845, + 48846, + 48847, + 48848, + 48849, + 48850, + 48851, + 48852, + 48853, + 48854, + 48855, + 48856, + 48857, + 48858, + 48859, + 48860, + 48861, + 48862, + 48863, + 48864, + 48865, + 48866, + 48867, + 48868, + 48869, + 48870, + 48871, + 48872, + 48873, + 48874, + 48875, + 48876, + 48877, + 48878, + 48879, + 48880, + 48881, + 48882, + 48883, + 48884, + 48885, + 48886, + 48887, + 48888, + 48889, + 48890, + 48891, + 48892, + 48893, + 48894, + 48895, + 48896, + 48897, + 48898, + 48899, + 48900, + 48901, + 48902, + 48903, + 48904, + 48905, + 48906, + 48907, + 48908, + 48909, + 48910, + 48911, + 48912, + 48913, + 48914, + 48915, + 48916, + 48917, + 48918, + 48919, + 48920, + 48921, + 48922, + 48923, + 48924, + 48925, + 48926, + 48927, + 48928, + 48929, + 48930, + 48931, + 48932, + 48933, + 48934, + 48935, + 48936, + 48937, + 48938, + 48939, + 48940, + 48941, + 48942, + 48943, + 48944, + 48945, + 48946, + 48947, + 48948, + 48949, + 48950, + 48951, + 48952, + 48953, + 48954, + 48955, + 48956, + 48958, + 48959, + 48960, + 48961, + 48962, + 48963, + 48964, + 48965, + 48966, + 48967, + 48968, + 48969, + 48970, + 48971, + 48972, + 48973, + 48974, + 48975, + 48976, + 48977, + 48978, + 48979, + 48980, + 48982, + 48983, + 48984, + 48985, + 48986, + 48987, + 48988, + 48989, + 48990, + 48991, + 48992, + 48993, + 48994, + 48995, + 48996, + 48997, + 48998, + 48999, + 49000, + 49001, + 49002, + 49003, + 49004, + 49005, + 49006, + 49007, + 49008, + 49009, + 49010, + 49011, + 49012, + 49013, + 49014, + 49015, + 49016, + 49017, + 49018, + 49019, + 49020, + 49021, + 49022, + 49023, + 49024, + 49025, + 49027, + 49028, + 49029, + 49030, + 49031, + 49032, + 49033, + 49034, + 49036, + 49037, + 49038, + 49039, + 49040, + 49041, + 49042, + 49043, + 49044, + 49045, + 49046, + 49047, + 49048, + 49049, + 49050, + 49051, + 49052, + 49053, + 49054, + 49055, + 49056, + 49057, + 49058, + 49059, + 49060, + 49061, + 49062, + 49063, + 49064, + 49065, + 49066, + 49067, + 49068, + 49069, + 49070, + 49071, + 49072, + 49073, + 49074, + 49075, + 49076, + 49077, + 49078, + 49079, + 49080, + 49081, + 49082, + 49083, + 49084, + 49085, + 49086, + 49087, + 49088, + 49089, + 49090, + 49091, + 49092, + 49093, + 49094, + 49095, + 49096, + 49097, + 49098, + 49099, + 49100, + 49101, + 49102, + 49103, + 49104, + 49105, + 49106, + 49107, + 49108, + 49109, + 49110, + 49111, + 49112, + 49113, + 49114, + 49115, + 49116, + 49117, + 49118, + 49119, + 49120, + 49121, + 49122, + 49123, + 49124, + 49125, + 49126, + 49127, + 49128, + 49129, + 49130, + 49131, + 49132, + 49133, + 49134, + 49135, + 49136, + 49137, + 49138, + 49139, + 49140, + 49141, + 49142, + 49143, + 49144, + 49145, + 49146, + 49147, + 49148, + 49149, + 49150, + 49151, + 49152, + 49153, + 49154, + 49155, + 49156, + 49157, + 49158, + 49159, + 49160, + 49161, + 49162, + 49163, + 49164, + 49165, + 49166, + 49167, + 49168, + 49169, + 49170, + 49171, + 49172, + 49173, + 49174, + 49175, + 49176, + 49177, + 49178, + 49179, + 49180, + 49181, + 49182, + 49183, + 49184, + 49185, + 49186, + 49187, + 49188, + 49189, + 49190, + 49191, + 49192, + 49193, + 49194, + 49195, + 49196, + 49197, + 49198, + 49200, + 49201, + 49202, + 49203, + 49204, + 49205, + 49206, + 49207, + 49208, + 49209, + 49210, + 49211, + 49212, + 49213, + 49214, + 49215, + 49216, + 49217, + 49218, + 49219, + 49220, + 49221, + 49222, + 49223, + 49224, + 49225, + 49226, + 49227, + 49228, + 49229, + 49230, + 49231, + 49232, + 49233, + 49234, + 49235, + 49236, + 49237, + 49238, + 49239, + 49240, + 49241, + 49242, + 49243, + 49244, + 49245, + 49246, + 49247, + 49248, + 49249, + 49250, + 49251, + 49252, + 49253, + 49254, + 49255, + 49256, + 49257, + 49258, + 49259, + 49260, + 49261, + 49262, + 49263, + 49264, + 49265, + 49266, + 49267, + 49268, + 49269, + 49270, + 49271, + 49272, + 49273, + 49274, + 49275, + 49276, + 49277, + 49278, + 49279, + 49280, + 49281, + 49282, + 49283, + 49284, + 49285, + 49286, + 49287, + 49288, + 49289, + 49290, + 49291, + 49292, + 49293, + 49294, + 49295, + 49296, + 49297, + 49298, + 49299, + 49300, + 49301, + 49303, + 49304, + 49305, + 49306, + 49307, + 49308, + 49309, + 49310, + 49311, + 49312, + 49313, + 49314, + 49315, + 49316, + 49317, + 49318, + 49319, + 49320, + 49321, + 49322, + 49323, + 49324, + 49325, + 49326, + 49327, + 49328, + 49329, + 49330, + 49331, + 49333, + 49334, + 49335, + 49338, + 49339, + 49340, + 49341, + 49342, + 49343, + 49344, + 49345, + 49346, + 49347, + 49348, + 49349, + 49350, + 49351, + 49352, + 49353, + 49354, + 49355, + 49356, + 49357, + 49358, + 49359, + 49360, + 49361, + 49362, + 49363, + 49364, + 49365, + 49366, + 49367, + 49368, + 49369, + 49370, + 49371, + 49372, + 49373, + 49374, + 49375, + 49376, + 49377, + 49378, + 49379, + 49380, + 49381, + 49382, + 49383, + 49384, + 49385, + 49386, + 49387, + 49388, + 49389, + 49390, + 49391, + 49392, + 49393, + 49394, + 49395, + 49396, + 49397, + 49398, + 49399, + 49400, + 49401, + 49402, + 49403, + 49404, + 49405, + 49406, + 49407, + 49408, + 49409, + 49410, + 49411, + 49412, + 49413, + 49414, + 49415, + 49416, + 49418, + 49419, + 49420, + 49421, + 49422, + 49423, + 49424, + 49425, + 49426, + 49427, + 49428, + 49429, + 49430, + 49431, + 49432, + 49433, + 49434, + 49435, + 49436, + 49437, + 49438, + 49439, + 49440, + 49441, + 49442, + 49443, + 49444, + 49445, + 49446, + 49447, + 49448, + 49449, + 49450, + 49451, + 49452, + 49453, + 49454, + 49455, + 49456, + 49457, + 49458, + 49459, + 49460, + 49461, + 49463, + 49464, + 49465, + 49466, + 49467, + 49468, + 49469, + 49471, + 49472, + 49473, + 49474, + 49475, + 49476, + 49477, + 49478, + 49479, + 49480, + 49481, + 49482, + 49483, + 49484, + 49485, + 49486, + 49487, + 49488, + 49489, + 49490, + 49491, + 49492, + 49493, + 49494, + 49495, + 49496, + 49497, + 49498, + 49499, + 49500, + 49501, + 49502, + 49503, + 49504, + 49505, + 49506, + 49507, + 49508, + 49509, + 49510, + 49511, + 49512, + 49513, + 49514, + 49515, + 49516, + 49517, + 49518, + 49519, + 49520, + 49521, + 49522, + 49523, + 49524, + 49525, + 49526, + 49527, + 49528, + 49529, + 49530, + 49531, + 49532, + 49533, + 49534, + 49535, + 49536, + 49537, + 49538, + 49539, + 49540, + 49541, + 49542, + 49543, + 49544, + 49545, + 49546, + 49547, + 49549, + 49550, + 49551, + 49552, + 49553, + 49554, + 49555, + 49556, + 49557, + 49558, + 49559, + 49560, + 49561, + 49562, + 49563, + 49564, + 49565, + 49566, + 49567, + 49568, + 49569, + 49570, + 49571, + 49572, + 49573, + 49574, + 49575, + 49576, + 49577, + 49578, + 49579, + 49580, + 49581, + 49582, + 49583, + 49584, + 49585, + 49586, + 49587, + 49588, + 49589, + 49590, + 49591, + 49592, + 49593, + 49594, + 49595, + 49596, + 49597, + 49598, + 49599, + 49600, + 49601, + 49602, + 49603, + 49604, + 49605, + 49606, + 49607, + 49608, + 49609, + 49610, + 49611, + 49612, + 49613, + 49614, + 49615, + 49616, + 49617, + 49618, + 49619, + 49620, + 49621, + 49622, + 49623, + 49624, + 49625, + 49626, + 49627, + 49628, + 49629, + 49630, + 49631, + 49632, + 49633, + 49634, + 49635, + 49636, + 49637, + 49638, + 49639, + 49640, + 49642, + 49643, + 49644, + 49645, + 49646, + 49647, + 49648, + 49649, + 49650, + 49651, + 49652, + 49653, + 49654, + 49655, + 49656, + 49658, + 49659, + 49660, + 49661, + 49662, + 49663, + 49664, + 49665, + 49666, + 49667, + 49668, + 49669, + 49670, + 49671, + 49672, + 49673, + 49674, + 49675, + 49677, + 49678, + 49679, + 49680, + 49681, + 49682, + 49683, + 49684, + 49685, + 49686, + 49687, + 49688, + 49689, + 49690, + 49691, + 49692, + 49693, + 49694, + 49695, + 49696, + 49697, + 49698, + 49699, + 49700, + 49701, + 49702, + 49703, + 49704, + 49705, + 49706, + 49707, + 49708, + 49709, + 49710, + 49711, + 49712, + 49713, + 49714, + 49715, + 49716, + 49717, + 49718, + 49719, + 49720, + 49721, + 49722, + 49723, + 49724, + 49725, + 49726, + 49727, + 49728, + 49729, + 49730, + 49731, + 49732, + 49733, + 49734, + 49735, + 49736, + 49737, + 49738, + 49739, + 49740, + 49741, + 49742, + 49743, + 49744, + 49745, + 49746, + 49747, + 49748, + 49749, + 49750, + 49752, + 49753, + 49754, + 49755, + 49756, + 49757, + 49758, + 49759, + 49760, + 49761, + 49762, + 49763, + 49765, + 49766, + 49767, + 49768, + 49769, + 49770, + 49771, + 49772, + 49773, + 49774, + 49775, + 49776, + 49777, + 49778, + 49779, + 49780, + 49781, + 49782, + 49783, + 49784, + 49785, + 49786, + 49787, + 49788, + 49789, + 49790, + 49791, + 49792, + 49793, + 49795, + 49796, + 49797, + 49798, + 49799, + 49800, + 49801, + 49802, + 49803, + 49804, + 49805, + 49806, + 49807, + 49808, + 49809, + 49810, + 49811, + 49812, + 49813, + 49814, + 49815, + 49816, + 49817, + 49818, + 49819, + 49820, + 49821, + 49822, + 49823, + 49824, + 49825, + 49826, + 49827, + 49828, + 49829, + 49830, + 49831, + 49832, + 49833, + 49834, + 49835, + 49836, + 49837, + 49838, + 49839, + 49840, + 49841, + 49842, + 49843, + 49844, + 49846, + 49847, + 49848, + 49849, + 49850, + 49851, + 49852, + 49853, + 49854, + 49855, + 49856, + 49857, + 49858, + 49859, + 49860, + 49861, + 49862, + 49863, + 49864, + 49865, + 49866, + 49867, + 49868, + 49869, + 49870, + 49871, + 49872, + 49873, + 49874, + 49875, + 49876, + 49877, + 49878, + 49879, + 49880, + 49881, + 49882, + 49883, + 49884, + 49885, + 49886, + 49887, + 49888, + 49889, + 49890, + 49891, + 49892, + 49893, + 49894, + 49895, + 49896, + 49897, + 49898, + 49899, + 49900, + 49901, + 49902, + 49903, + 49904, + 49905, + 49906, + 49907, + 49908, + 49909, + 49910, + 49911, + 49912, + 49913, + 49914, + 49915, + 49916, + 49917, + 49918, + 49919, + 49920, + 49921, + 49922, + 49923, + 49924, + 49926, + 49927, + 49928, + 49929, + 49930, + 49931, + 49932, + 49933, + 49934, + 49935, + 49936, + 49937, + 49938, + 49939, + 49940, + 49941, + 49942, + 49943, + 49944, + 49945, + 49946, + 49947, + 49948, + 49949, + 49950, + 49951, + 49952, + 49954, + 49955, + 49956, + 49957, + 49958, + 49959, + 49960, + 49961, + 49962, + 49963, + 49964, + 49965, + 49966, + 49967, + 49968, + 49969, + 49970, + 49971, + 49972, + 49973, + 49974, + 49975, + 49976, + 49977, + 49978, + 49979, + 49980, + 49981, + 49982, + 49983, + 49984, + 49985, + 49986, + 49987, + 49988, + 49989, + 49990, + 49991, + 49992, + 49993, + 49994, + 49995, + 49996, + 49997, + 49998, + 49999, + 50000, + 50001, + 50002, + 50003, + 50004, + 50005, + 50006, + 50007, + 50008, + 50009, + 50011, + 50012, + 50013, + 50014, + 50015, + 50016, + 50017, + 50018, + 50019, + 50020, + 50022, + 50023, + 50024, + 50025, + 50026, + 50027, + 50028, + 50029, + 50030, + 50031, + 50032, + 50033, + 50034, + 50036, + 50038, + 50039, + 50040, + 50041, + 50042, + 50043, + 50044, + 50045, + 50046, + 50047, + 50048, + 50049, + 50050, + 50051, + 50052, + 50053, + 50054, + 50055, + 50056, + 50057, + 50058, + 50059, + 50060, + 50061, + 50062, + 50063, + 50064, + 50065, + 50066, + 50067, + 50068, + 50069, + 50070, + 50071, + 50072, + 50073, + 50074, + 50075, + 50076, + 50077, + 50078, + 50079, + 50080, + 50081, + 50082, + 50083, + 50084, + 50085, + 50086, + 50087, + 50088, + 50089, + 50090, + 50091, + 50092, + 50093, + 50094, + 50095, + 50096, + 50097, + 50098, + 50099, + 50100, + 50101, + 50102, + 50103, + 50104, + 50105, + 50106, + 50107, + 50108, + 50109, + 50110, + 50111, + 50112, + 50113, + 50114, + 50115, + 50116, + 50117, + 50118, + 50119, + 50121, + 50122, + 50123, + 50124, + 50125, + 50126, + 50127, + 50128, + 50129, + 50130, + 50131, + 50132, + 50133, + 50135, + 50136, + 50137, + 50138, + 50139, + 50140, + 50141, + 50142, + 50143, + 50144, + 50145, + 50146, + 50147, + 50148, + 50149, + 50150, + 50151, + 50152, + 50153, + 50154, + 50156, + 50157, + 50158, + 50159, + 50160, + 50161, + 50162, + 50163, + 50164, + 50165, + 50166, + 50167, + 50168, + 50169, + 50170, + 50171, + 50172, + 50173, + 50174, + 50175, + 50176, + 50177, + 50178, + 50179, + 50180, + 50181, + 50182, + 50183, + 50184, + 50185, + 50186, + 50187, + 50188, + 50189, + 50190, + 50191, + 50192, + 50193, + 50194, + 50195, + 50196, + 50197, + 50198, + 50199, + 50200, + 50201, + 50202, + 50203, + 50204, + 50205, + 50206, + 50207, + 50208, + 50209, + 50210, + 50211, + 50212, + 50213, + 50214, + 50215, + 50216, + 50217, + 50218, + 50219, + 50220, + 50221, + 50222, + 50223, + 50224, + 50225, + 50226, + 50227, + 50228, + 50229, + 50230, + 50231, + 50232, + 50233, + 50234, + 50235, + 50237, + 50238, + 50239, + 50240, + 50241, + 50242, + 50243, + 50244, + 50245, + 50246, + 50247, + 50248, + 50249, + 50250, + 50251, + 50252, + 50253, + 50254, + 50255, + 50256, + 50257, + 50259, + 50260, + 50261, + 50262, + 50263, + 50264, + 50265, + 50266, + 50268, + 50269, + 50270, + 50271, + 50272, + 50273, + 50274, + 50275, + 50276, + 50277, + 50278, + 50279, + 50280, + 50281, + 50282, + 50283, + 50284, + 50285, + 50286, + 50287, + 50288, + 50289, + 50290, + 50291, + 50292, + 50293, + 50294, + 50295, + 50296, + 50297, + 50298, + 50299, + 50300, + 50301, + 50302, + 50303, + 50304, + 50305, + 50307, + 50308, + 50309, + 50310, + 50311, + 50313, + 50314, + 50315, + 50316, + 50317, + 50318, + 50321, + 50322, + 50323, + 50324, + 50325, + 50326, + 50327, + 50328, + 50329, + 50330, + 50331, + 50332, + 50333, + 50334, + 50335, + 50336, + 50337, + 50338, + 50339, + 50340, + 50342, + 50343, + 50344, + 50345, + 50346, + 50347, + 50348, + 50349, + 50350, + 50351, + 50352, + 50353, + 50354, + 50355, + 50356, + 50357, + 50358, + 50359, + 50360, + 50361, + 50362, + 50363, + 50364, + 50365, + 50366, + 50367, + 50368, + 50369, + 50370, + 50371, + 50372, + 50373, + 50374, + 50375, + 50376, + 50377, + 50378, + 50379, + 50380, + 50381, + 50382, + 50383, + 50384, + 50385, + 50386, + 50387, + 50388, + 50389, + 50390, + 50391, + 50393, + 50394, + 50395, + 50396, + 50397, + 50398, + 50399, + 50400, + 50401, + 50402, + 50403, + 50404, + 50405, + 50406, + 50407, + 50408, + 50409, + 50410, + 50411, + 50412, + 50413, + 50414, + 50415, + 50416, + 50417, + 50418, + 50419, + 50420, + 50421, + 50422, + 50423, + 50424, + 50425, + 50426, + 50427, + 50428, + 50429, + 50430, + 50431, + 50432, + 50433, + 50434, + 50435, + 50437, + 50438, + 50439, + 50440, + 50441, + 50442, + 50443, + 50444, + 50445, + 50446, + 50447, + 50448, + 50449, + 50450, + 50451, + 50452, + 50453, + 50454, + 50455, + 50456, + 50457, + 50458, + 50459, + 50460, + 50461, + 50462, + 50463, + 50464, + 50465, + 50466, + 50467, + 50468, + 50469, + 50470, + 50471, + 50472, + 50473, + 50474, + 50475, + 50476, + 50477, + 50478, + 50479, + 50480, + 50481, + 50482, + 50483, + 50484, + 50485, + 50486, + 50487, + 50488, + 50489, + 50490, + 50491, + 50492, + 50493, + 50494, + 50495, + 50496, + 50497, + 50498, + 50499, + 50500, + 50501, + 50502, + 50503, + 50504, + 50505, + 50506, + 50507, + 50508, + 50509, + 50510, + 50511, + 50512, + 50513, + 50514, + 50515, + 50516, + 50517, + 50518, + 50519, + 50520, + 50521, + 50522, + 50523, + 50524, + 50525, + 50526, + 50527, + 50528, + 50529, + 50530, + 50531, + 50532, + 50533, + 50534, + 50535, + 50536, + 50537, + 50538, + 50539, + 50540, + 50541, + 50542, + 50543, + 50544, + 50545, + 50546, + 50547, + 50548, + 50549, + 50550, + 50551, + 50552, + 50553, + 50554, + 50555, + 50556, + 50557, + 50558, + 50559, + 50560, + 50561, + 50562, + 50563, + 50564, + 50565, + 50566, + 50567, + 50568, + 50569, + 50570, + 50572, + 50573, + 50574, + 50575, + 50576, + 50577, + 50578, + 50579, + 50580, + 50581, + 50582, + 50583, + 50584, + 50586, + 50587, + 50588, + 50589, + 50590, + 50591, + 50592, + 50593, + 50594, + 50595, + 50596, + 50597, + 50598, + 50599, + 50600, + 50601, + 50602, + 50603, + 50604, + 50605, + 50606, + 50607, + 50608, + 50609, + 50610, + 50611, + 50612, + 50613, + 50614, + 50615, + 50616, + 50617, + 50618, + 50619, + 50620, + 50621, + 50622, + 50623, + 50624, + 50625, + 50626, + 50627, + 50628, + 50629, + 50630, + 50631, + 50632, + 50633, + 50634, + 50635, + 50636, + 50637, + 50638, + 50639, + 50640, + 50641, + 50642, + 50643, + 50644, + 50645, + 50646, + 50647, + 50648, + 50649, + 50650, + 50651, + 50652, + 50653, + 50655, + 50656, + 50657, + 50658, + 50659, + 50660, + 50661, + 50662, + 50663, + 50664, + 50665, + 50666, + 50667, + 50668, + 50669, + 50670, + 50671, + 50672, + 50673, + 50674, + 50675, + 50678, + 50679, + 50680, + 50681, + 50682, + 50683, + 50684, + 50685, + 50686, + 50687, + 50688, + 50689, + 50690, + 50691, + 50692, + 50693, + 50694, + 50695, + 50697, + 50698, + 50699, + 50700, + 50701, + 50702, + 50703, + 50704, + 50705, + 50706, + 50707, + 50708, + 50709, + 50710, + 50711, + 50712, + 50713, + 50714, + 50715, + 50716, + 50717, + 50718, + 50719, + 50720, + 50721, + 50722, + 50723, + 50724, + 50725, + 50726, + 50727, + 50728, + 50729, + 50730, + 50731, + 50732, + 50733, + 50734, + 50735, + 50736, + 50737, + 50738, + 50739, + 50740, + 50741, + 50742, + 50743, + 50744, + 50745, + 50746, + 50747, + 50748, + 50749, + 50750, + 50751, + 50752, + 50753, + 50754, + 50755, + 50756, + 50757, + 50758, + 50759, + 50760, + 50761, + 50762, + 50763, + 50764, + 50765, + 50766, + 50767, + 50768, + 50769, + 50770, + 50771, + 50772, + 50773, + 50774, + 50775, + 50776, + 50777, + 50778, + 50779, + 50780, + 50781, + 50782, + 50783, + 50784, + 50785, + 50786, + 50787, + 50788, + 50789, + 50790, + 50791, + 50792, + 50793, + 50794, + 50795, + 50796, + 50797, + 50798, + 50799, + 50800, + 50801, + 50802, + 50803, + 50804, + 50805, + 50806, + 50807, + 50808, + 50809, + 50810, + 50811, + 50812, + 50813, + 50814, + 50815, + 50816, + 50817, + 50818, + 50819, + 50820, + 50821, + 50822, + 50823, + 50824, + 50825, + 50826, + 50827, + 50829, + 50830, + 50831, + 50832, + 50833, + 50834, + 50835, + 50836, + 50837, + 50838, + 50839, + 50840, + 50841, + 50842, + 50843, + 50844, + 50845, + 50846, + 50847, + 50849, + 50850, + 50851, + 50852, + 50853, + 50854, + 50855, + 50856, + 50857, + 50858, + 50859, + 50860, + 50861, + 50863, + 50864, + 50865, + 50866, + 50867, + 50869, + 50870, + 50871, + 50872, + 50873, + 50874, + 50875, + 50876, + 50877, + 50878, + 50879, + 50880, + 50881, + 50882, + 50883, + 50884, + 50885, + 50886, + 50887, + 50888, + 50889, + 50890, + 50891, + 50892, + 50893, + 50894, + 50895, + 50896, + 50897, + 50898, + 50899, + 50900, + 50901, + 50902, + 50903, + 50904, + 50905, + 50906, + 50907, + 50908, + 50909, + 50910, + 50911, + 50912, + 50913, + 50914, + 50915, + 50916, + 50917, + 50918, + 50919, + 50920, + 50921, + 50922, + 50923, + 50924, + 50925, + 50926, + 50927, + 50928, + 50929, + 50930, + 50931, + 50932, + 50933, + 50934, + 50935, + 50936, + 50937, + 50938, + 50939, + 50940, + 50941, + 50942, + 50943, + 50944, + 50945, + 50946, + 50947, + 50948, + 50949, + 50950, + 50951, + 50952, + 50953, + 50954, + 50955, + 50956, + 50957, + 50958, + 50959, + 50960, + 50961, + 50962, + 50963, + 50964, + 50965, + 50966, + 50967, + 50968, + 50969, + 50970, + 50971, + 50972, + 50973, + 50974, + 50975, + 50976, + 50977, + 50978, + 50979, + 50980, + 50981, + 50982, + 50983, + 50984, + 50985, + 50986, + 50987, + 50988, + 50989, + 50990, + 50991, + 50992, + 50993, + 50994, + 50995, + 50996, + 50997, + 50998, + 50999, + 51000, + 51001, + 51002, + 51003, + 51004, + 51005, + 51006, + 51007, + 51008, + 51009, + 51010, + 51011, + 51012, + 51013, + 51014, + 51015, + 51016, + 51017, + 51018, + 51019, + 51020, + 51021, + 51022, + 51023, + 51024, + 51025, + 51026, + 51027, + 51028, + 51029, + 51030, + 51031, + 51032, + 51033, + 51034, + 51035, + 51036, + 51037, + 51038, + 51039, + 51040, + 51041, + 51042, + 51043, + 51044, + 51045, + 51046, + 51047, + 51048, + 51049, + 51050, + 51051, + 51052, + 51053, + 51054, + 51055, + 51056, + 51057, + 51058, + 51059, + 51060, + 51061, + 51062, + 51063, + 51064, + 51065, + 51066, + 51067, + 51068, + 51069, + 51070, + 51071, + 51072, + 51073, + 51074, + 51075, + 51076, + 51077, + 51078, + 51079, + 51080, + 51081, + 51082, + 51083, + 51084, + 51085, + 51086, + 51087, + 51088, + 51089, + 51090, + 51091, + 51092, + 51093, + 51094, + 51095, + 51096, + 51097, + 51098, + 51099, + 51100, + 51101, + 51102, + 51103, + 51104, + 51105, + 51106, + 51107, + 51108, + 51109, + 51110, + 51111, + 51112, + 51113, + 51114, + 51115, + 51116, + 51117, + 51118, + 51119, + 51120, + 51121, + 51122, + 51123, + 51124, + 51125, + 51126, + 51127, + 51128, + 51129, + 51130, + 51131, + 51132, + 51133, + 51134, + 51135, + 51136, + 51137, + 51138, + 51139, + 51140, + 51141, + 51142, + 51143, + 51144, + 51145, + 51146, + 51147, + 51148, + 51149, + 51150, + 51151, + 51152, + 51153, + 51154, + 51155, + 51156, + 51157, + 51158, + 51159, + 51160, + 51161, + 51162, + 51163, + 51164, + 51165, + 51166, + 51167, + 51168, + 51169, + 51170, + 51171, + 51172, + 51173, + 51174, + 51175, + 51176, + 51177, + 51178, + 51179, + 51180, + 51181, + 51182, + 51183, + 51184, + 51185, + 51186, + 51187, + 51188, + 51189, + 51190, + 51191, + 51192, + 51193, + 51194, + 51195, + 51196, + 51197, + 51198, + 51199, + 51200, + 51201, + 51202, + 51203, + 51205, + 51206, + 51207, + 51208, + 51209, + 51210, + 51211, + 51212, + 51213, + 51214, + 51215, + 51216, + 51217, + 51218, + 51219, + 51220, + 51221, + 51222, + 51223, + 51224, + 51225, + 51226, + 51227, + 51228, + 51229, + 51230, + 51231, + 51232, + 51233, + 51234, + 51235, + 51236, + 51237, + 51238, + 51239, + 51240, + 51241, + 51242, + 51243, + 51244, + 51245, + 51246, + 51247, + 51248, + 51249, + 51250, + 51251, + 51252, + 51253, + 51254, + 51255, + 51256, + 51257, + 51258, + 51259, + 51260, + 51261, + 51262, + 51263, + 51264, + 51265, + 51266, + 51267, + 51268, + 51269, + 51270, + 51271, + 51272, + 51273, + 51274, + 51275, + 51276, + 51277, + 51278, + 51279, + 51280, + 51281, + 51282, + 51283, + 51284, + 51285, + 51286, + 51287, + 51288, + 51289, + 51290, + 51291, + 51292, + 51293, + 51294, + 51295, + 51296, + 51297, + 51298, + 51299, + 51300, + 51301, + 51302, + 51303, + 51304, + 51305, + 51306, + 51307, + 51308, + 51309, + 51310, + 51311, + 51312, + 51313, + 51314, + 51315, + 51316, + 51317, + 51318, + 51319, + 51320, + 51321, + 51322, + 51323, + 51324, + 51325, + 51326, + 51327, + 51328, + 51329, + 51330, + 51331, + 51332, + 51333, + 51334, + 51335, + 51336, + 51337, + 51338, + 51339, + 51340, + 51341, + 51342, + 51343, + 51344, + 51345, + 51347, + 51348, + 51349, + 51350, + 51351, + 51352, + 51353, + 51354, + 51355, + 51356, + 51357, + 51358, + 51359, + 51360, + 51361, + 51362, + 51363, + 51364, + 51365, + 51366, + 51367, + 51368, + 51369, + 51370, + 51371, + 51372, + 51373, + 51374, + 51375, + 51376, + 51377, + 51378, + 51379, + 51380, + 51381, + 51382, + 51383, + 51384, + 51385, + 51386, + 51387, + 51388, + 51389, + 51390, + 51391, + 51392, + 51393, + 51394, + 51395, + 51396, + 51397, + 51398, + 51399, + 51400, + 51401, + 51402, + 51403, + 51404, + 51405, + 51406, + 51407, + 51408, + 51409, + 51410, + 51411, + 51412, + 51413, + 51414, + 51415, + 51416, + 51417, + 51418, + 51419, + 51420, + 51421, + 51422, + 51423, + 51424, + 51425, + 51426, + 51427, + 51428, + 51429, + 51430, + 51431, + 51432, + 51433, + 51434, + 51435, + 51436, + 51437, + 51438, + 51439, + 51440, + 51441, + 51442, + 51443, + 51444, + 51445, + 51446, + 51447, + 51448, + 51449, + 51450, + 51451, + 51452, + 51453, + 51454, + 51455, + 51456, + 51457, + 51458, + 51459, + 51460, + 51461, + 51462, + 51463, + 51464, + 51465, + 51466, + 51467, + 51468, + 51469, + 51470, + 51471, + 51472, + 51473, + 51474, + 51475, + 51476, + 51477, + 51478, + 51479, + 51480, + 51481, + 51482, + 51483, + 51484, + 51485, + 51486, + 51487, + 51488, + 51489, + 51490, + 51491, + 51492, + 51493, + 51494, + 51495, + 51496, + 51497, + 51498, + 51499, + 51500, + 51501, + 51502, + 51503, + 51504, + 51505, + 51506, + 51507, + 51508, + 51509, + 51510, + 51511, + 51512, + 51513, + 51514, + 51515, + 51516, + 51517, + 51518, + 51519, + 51520, + 51521, + 51522, + 51523, + 51524, + 51525, + 51526, + 51527, + 51529, + 51530, + 51531, + 51532, + 51533, + 51534, + 51535, + 51536, + 51537, + 51538, + 51539, + 51540, + 51541, + 51542, + 51543, + 51544, + 51545, + 51546, + 51547, + 51548, + 51549, + 51550, + 51551, + 51552, + 51553, + 51554, + 51555, + 51556, + 51557, + 51558, + 51559, + 51560, + 51561, + 51562, + 51563, + 51564, + 51565, + 51566, + 51567, + 51568, + 51569, + 51570, + 51571, + 51572, + 51573, + 51574, + 51575, + 51576, + 51577, + 51578, + 51579, + 51580, + 51581, + 51582, + 51583, + 51584, + 51585, + 51586, + 51587, + 51589, + 51590, + 51591, + 51592, + 51593, + 51594, + 51595, + 51596, + 51597, + 51598, + 51599, + 51600, + 51601, + 51602, + 51603, + 51604, + 51605, + 51606, + 51607, + 51608, + 51609, + 51611, + 51612, + 51613, + 51614, + 51615, + 51616, + 51617, + 51618, + 51619, + 51620, + 51621, + 51622, + 51623, + 51624, + 51625, + 51626, + 51627, + 51628, + 51629, + 51630, + 51631, + 51632, + 51633, + 51634, + 51635, + 51636, + 51637, + 51638, + 51639, + 51640, + 51641, + 51642, + 51643, + 51644, + 51645, + 51646, + 51647, + 51648, + 51649, + 51650, + 51651, + 51652, + 51653, + 51654, + 51655, + 51656, + 51657, + 51658, + 51659, + 51660, + 51661, + 51662, + 51663, + 51664, + 51665, + 51666, + 51667, + 51668, + 51669, + 51670, + 51671, + 51672, + 51673, + 51674, + 51675, + 51676, + 51677, + 51678, + 51679, + 51680, + 51681, + 51682, + 51683, + 51684, + 51685, + 51686, + 51687, + 51688, + 51689, + 51690, + 51691, + 51692, + 51693, + 51694, + 51695, + 51696, + 51697, + 51698, + 51699, + 51700, + 51701, + 51702, + 51703, + 51704, + 51705, + 51706, + 51707, + 51708, + 51709, + 51710, + 51711, + 51712, + 51713, + 51714, + 51715, + 51716, + 51717, + 51718, + 51719, + 51720, + 51721, + 51722, + 51723, + 51724, + 51725, + 51726, + 51727, + 51728, + 51729, + 51730, + 51731, + 51732, + 51733, + 51734, + 51735, + 51736, + 51737, + 51738, + 51739, + 51740, + 51741, + 51742, + 51743, + 51744, + 51745, + 51746, + 51747, + 51748, + 51750, + 51751, + 51752, + 51753, + 51754, + 51755, + 51756, + 51757, + 51758, + 51760, + 51761, + 51762, + 51763, + 51764, + 51765, + 51766, + 51767, + 51768, + 51769, + 51770, + 51771, + 51772, + 51773, + 51774, + 51775, + 51776, + 51777, + 51778, + 51779, + 51780, + 51781, + 51782, + 51783, + 51784, + 51785, + 51786, + 51787, + 51788, + 51789, + 51790, + 51791, + 51792, + 51793, + 51794, + 51795, + 51796, + 51797, + 51798, + 51799, + 51800, + 51801, + 51802, + 51803, + 51804, + 51805, + 51806, + 51807, + 51808, + 51809, + 51810, + 51811, + 51812, + 51813, + 51814, + 51815, + 51816, + 51817, + 51818, + 51819, + 51820, + 51821, + 51822, + 51823, + 51824, + 51825, + 51826, + 51827, + 51828, + 51829, + 51830, + 51831, + 51832, + 51833, + 51834, + 51835, + 51836, + 51837, + 51838, + 51839, + 51840, + 51841, + 51843, + 51844, + 51845, + 51846, + 51847, + 51848, + 51849, + 51850, + 51851, + 51852, + 51853, + 51854, + 51855, + 51856, + 51857, + 51858, + 51859, + 51860, + 51861, + 51862, + 51863, + 51864, + 51865, + 51866, + 51867, + 51868, + 51869, + 51870, + 51871, + 51872, + 51873, + 51874, + 51875, + 51876, + 51877, + 51878, + 51879, + 51880, + 51881, + 51882, + 51883, + 51884, + 51885, + 51886, + 51887, + 51888, + 51889, + 51890, + 51891, + 51892, + 51893, + 51894, + 51895, + 51896, + 51897, + 51898, + 51899, + 51900, + 51901, + 51902, + 51903, + 51904, + 51905, + 51906, + 51907, + 51908, + 51909, + 51910, + 51911, + 51912, + 51913, + 51914, + 51915, + 51916, + 51917, + 51918, + 51919, + 51920, + 51921, + 51922, + 51923, + 51924, + 51925, + 51926, + 51927, + 51928, + 51929, + 51930, + 51931, + 51932, + 51933, + 51934, + 51935, + 51936, + 51937, + 51938, + 51939, + 51940, + 51941, + 51942, + 51943, + 51944, + 51945, + 51946, + 51947, + 51948, + 51949, + 51950, + 51951, + 51953, + 51955, + 51956, + 51957, + 51958, + 51959, + 51960, + 51961, + 51962, + 51963, + 51964, + 51965, + 51966, + 51967, + 51968, + 51969, + 51970, + 51971, + 51972, + 51973, + 51974, + 51975, + 51976, + 51977, + 51978, + 51979, + 51980, + 51981, + 51982, + 51983, + 51984, + 51985, + 51986, + 51987, + 51988, + 51989, + 51990, + 51991, + 51992, + 51993, + 51994, + 51995, + 51996, + 51997, + 51998, + 51999, + 52000, + 52001, + 52002, + 52003, + 52004, + 52005, + 52006, + 52007, + 52008, + 52009, + 52010, + 52011, + 52012, + 52013, + 52014, + 52015, + 52016, + 52017, + 52019, + 52020, + 52021, + 52022, + 52023, + 52024, + 52025, + 52026, + 52027, + 52028, + 52029, + 52030, + 52031, + 52032, + 52033, + 52034, + 52035, + 52036, + 52037, + 52038, + 52039, + 52040, + 52041, + 52042, + 52043, + 52044, + 52045, + 52046, + 52047, + 52048, + 52049, + 52050, + 52051, + 52052, + 52053, + 52054, + 52055, + 52056, + 52057, + 52058, + 52059, + 52060, + 52061, + 52062, + 52063, + 52064, + 52065, + 52066, + 52067, + 52068, + 52069, + 52070, + 52071, + 52072, + 52073, + 52074, + 52075, + 52076, + 52077, + 52078, + 52079, + 52080, + 52081, + 52082, + 52083, + 52084, + 52085, + 52086, + 52087, + 52088, + 52089, + 52090, + 52091, + 52092, + 52093, + 52094, + 52095, + 52096, + 52098, + 52099, + 52100, + 52101, + 52102, + 52104, + 52105, + 52106, + 52107, + 52108, + 52109, + 52110, + 52111, + 52112, + 52113, + 52114, + 52115, + 52116, + 52117, + 52118, + 52119, + 52120, + 52121, + 52122, + 52123, + 52124, + 52125, + 52126, + 52127, + 52128, + 52129, + 52130, + 52131, + 52132, + 52133, + 52134, + 52135, + 52136, + 52137, + 52138, + 52139, + 52140, + 52141, + 52142, + 52143, + 52144, + 52145, + 52146, + 52147, + 52148, + 52149, + 52150, + 52151, + 52152, + 52153, + 52154, + 52155, + 52156, + 52157, + 52158, + 52159, + 52160, + 52161, + 52162, + 52163, + 52164, + 52165, + 52166, + 52167, + 52168, + 52169, + 52170, + 52171, + 52172, + 52173, + 52174, + 52175, + 52176, + 52177, + 52178, + 52179, + 52180, + 52181, + 52182, + 52183, + 52184, + 52185, + 52186, + 52187, + 52188, + 52189, + 52190, + 52191, + 52192, + 52193, + 52194, + 52195, + 52196, + 52197, + 52198, + 52199, + 52200, + 52201, + 52202, + 52203, + 52204, + 52205, + 52206, + 52207, + 52208, + 52209, + 52210, + 52211, + 52212, + 52213, + 52214, + 52215, + 52216, + 52217, + 52218, + 52220, + 52221, + 52222, + 52223, + 52224, + 52225, + 52226, + 52227, + 52228, + 52229, + 52230, + 52231, + 52232, + 52233, + 52234, + 52235, + 52236, + 52237, + 52238, + 52239, + 52240, + 52241, + 52242, + 52243, + 52244, + 52245, + 52246, + 52247, + 52248, + 52249, + 52250, + 52251, + 52252, + 52253, + 52254, + 52255, + 52256, + 52257, + 52258, + 52259, + 52260, + 52261, + 52262, + 52263, + 52264, + 52265, + 52266, + 52267, + 52268, + 52269, + 52270, + 52271, + 52273, + 52274, + 52276, + 52277, + 52278, + 52279, + 52280, + 52281, + 52282, + 52283, + 52284, + 52285, + 52286, + 52287, + 52288, + 52289, + 52290, + 52291, + 52292, + 52293, + 52294, + 52295, + 52296, + 52297, + 52298, + 52299, + 52300, + 52301, + 52302, + 52303, + 52304, + 52305, + 52306, + 52307, + 52308, + 52309, + 52310, + 52311, + 52312, + 52313, + 52314, + 52315, + 52316, + 52317, + 52318, + 52319, + 52320, + 52321, + 52322, + 52323, + 52324, + 52325, + 52326, + 52327, + 52328, + 52329, + 52330, + 52331, + 52332, + 52333, + 52334, + 52335, + 52336, + 52337, + 52338, + 52339, + 52340, + 52341, + 52342, + 52343, + 52344, + 52345, + 52346, + 52347, + 52348, + 52349, + 52350, + 52351, + 52352, + 52353, + 52354, + 52355, + 52356, + 52357, + 52358, + 52359, + 52360, + 52361, + 52362, + 52363, + 52364, + 52365, + 52366, + 52367, + 52368, + 52371, + 52372, + 52373, + 52374, + 52375, + 52376, + 52377, + 52378, + 52379, + 52380, + 52381, + 52382, + 52383, + 52384, + 52385, + 52386, + 52387, + 52388, + 52389, + 52390, + 52391, + 52392, + 52393, + 52394, + 52395, + 52396, + 52397, + 52398, + 52399, + 52400, + 52401, + 52402, + 52403, + 52404, + 52405, + 52406, + 52407, + 52408, + 52409, + 52410, + 52411, + 52412, + 52413, + 52414, + 52415, + 52416, + 52417, + 52418, + 52419, + 52420, + 52421, + 52422, + 52423, + 52424, + 52425, + 52426, + 52427, + 52428, + 52429, + 52430, + 52431, + 52432, + 52433, + 52434, + 52435, + 52436, + 52437, + 52438, + 52439, + 52440, + 52441, + 52442, + 52444, + 52445, + 52446, + 52447, + 52448, + 52449, + 52450, + 52451, + 52452, + 52453, + 52454, + 52455, + 52456, + 52457, + 52458, + 52459, + 52460, + 52461, + 52462, + 52463, + 52464, + 52465, + 52466, + 52467, + 52468, + 52469, + 52470, + 52471, + 52472, + 52473, + 52474, + 52475, + 52476, + 52477, + 52478, + 52479, + 52480, + 52481, + 52482, + 52483, + 52484, + 52485, + 52486, + 52487, + 52488, + 52489, + 52490, + 52491, + 52492, + 52493, + 52494, + 52495, + 52496, + 52497, + 52498, + 52499, + 52500, + 52501, + 52502, + 52503, + 52504, + 52505, + 52506, + 52507, + 52508, + 52509, + 52510, + 52511, + 52512, + 52513, + 52514, + 52515, + 52516, + 52517, + 52518, + 52519, + 52520, + 52521, + 52522, + 52523, + 52524, + 52525, + 52526, + 52527, + 52528, + 52529, + 52530, + 52531, + 52532, + 52533, + 52534, + 52535, + 52536, + 52537, + 52538, + 52539, + 52540, + 52541, + 52542, + 52543, + 52544, + 52545, + 52546, + 52547, + 52548, + 52549, + 52550, + 52551, + 52552, + 52553, + 52554, + 52555, + 52556, + 52557, + 52558, + 52559, + 52560, + 52561, + 52562, + 52563, + 52564, + 52565, + 52566, + 52567, + 52569, + 52570, + 52571, + 52572, + 52573, + 52574, + 52575, + 52576, + 52577, + 52578, + 52579, + 52580, + 52581, + 52582, + 52583, + 52584, + 52585, + 52586, + 52587, + 52588, + 52589, + 52590, + 52591, + 52592, + 52593, + 52594, + 52595, + 52596, + 52597, + 52598, + 52599, + 52600, + 52601, + 52602, + 52603, + 52604, + 52605, + 52606, + 52607, + 52608, + 52609, + 52610, + 52611, + 52612, + 52613, + 52614, + 52615, + 52616, + 52617, + 52618, + 52619, + 52620, + 52621, + 52622, + 52623, + 52624, + 52625, + 52626, + 52627, + 52629, + 52630, + 52631, + 52632, + 52633, + 52634, + 52635, + 52636, + 52637, + 52638, + 52639, + 52640, + 52641, + 52642, + 52643, + 52644, + 52645, + 52646, + 52647, + 52648, + 52649, + 52650, + 52651, + 52652, + 52653, + 52654, + 52655, + 52656, + 52657, + 52658, + 52659, + 52660, + 52661, + 52662, + 52663, + 52664, + 52665, + 52666, + 52667, + 52668, + 52669, + 52670, + 52671, + 52672, + 52673, + 52674, + 52675, + 52676, + 52677, + 52678, + 52679, + 52681, + 52682, + 52683, + 52684, + 52685, + 52686, + 52687, + 52688, + 52689, + 52690, + 52691, + 52692, + 52693, + 52694, + 52695, + 52696, + 52698, + 52699, + 52700, + 52701, + 52702, + 52703, + 52704, + 52705, + 52706, + 52707, + 52708, + 52709, + 52710, + 52711, + 52712, + 52713, + 52714, + 52715, + 52716, + 52717, + 52718, + 52719, + 52720, + 52721, + 52722, + 52723, + 52724, + 52725, + 52726, + 52727, + 52728, + 52729, + 52730, + 52731, + 52732, + 52733, + 52734, + 52735, + 52736, + 52737, + 52738, + 52739, + 52740, + 52741, + 52742, + 52743, + 52744, + 52745, + 52746, + 52747, + 52748, + 52749, + 52750, + 52751, + 52752, + 52753, + 52754, + 52755, + 52756, + 52757, + 52758, + 52759, + 52760, + 52761, + 52762, + 52763, + 52764, + 52765, + 52766, + 52767, + 52768, + 52769, + 52770, + 52771, + 52772, + 52773, + 52774, + 52775, + 52776, + 52777, + 52778, + 52779, + 52780, + 52781, + 52782, + 52783, + 52784, + 52785, + 52786, + 52787, + 52788, + 52789, + 52790, + 52791, + 52792, + 52793, + 52794, + 52795, + 52796, + 52797, + 52798, + 52799, + 52800, + 52801, + 52802, + 52803, + 52804, + 52805, + 52806, + 52807, + 52808, + 52809, + 52810, + 52811, + 52812, + 52813, + 52814, + 52815, + 52816, + 52817, + 52818, + 52819, + 52820, + 52821, + 52822, + 52823, + 52824, + 52825, + 52826, + 52827, + 52828, + 52829, + 52830, + 52831, + 52832, + 52833, + 52834, + 52835, + 52836, + 52837, + 52838, + 52839, + 52840, + 52841, + 52842, + 52843, + 52844, + 52845, + 52846, + 52847, + 52848, + 52849, + 52850, + 52851, + 52852, + 52853, + 52854, + 52855, + 52856, + 52857, + 52858, + 52859, + 52860, + 52861, + 52862, + 52863, + 52864, + 52865, + 52866, + 52867, + 52868, + 52869, + 52870, + 52871, + 52872, + 52873, + 52875, + 52876, + 52877, + 52878, + 52879, + 52880, + 52881, + 52882, + 52883, + 52884, + 52885, + 52886, + 52887, + 52888, + 52889, + 52890, + 52891, + 52892, + 52893, + 52894, + 52895, + 52896, + 52897, + 52898, + 52899, + 52900, + 52901, + 52902, + 52903, + 52904, + 52905, + 52906, + 52907, + 52908, + 52909, + 52910, + 52911, + 52912, + 52913, + 52914, + 52915, + 52916, + 52917, + 52918, + 52919, + 52920, + 52921, + 52922, + 52923, + 52924, + 52925, + 52926, + 52927, + 52928, + 52929, + 52930, + 52931, + 52932, + 52933, + 52934, + 52935, + 52936, + 52937, + 52938, + 52939, + 52940, + 52941, + 52942, + 52943, + 52944, + 52945, + 52946, + 52947, + 52948, + 52949, + 52950, + 52951, + 52952, + 52953, + 52954, + 52955, + 52956, + 52957, + 52958, + 52959, + 52960, + 52961, + 52962, + 52963, + 52964, + 52965, + 52966, + 52967, + 52968, + 52969, + 52970, + 52971, + 52972, + 52973, + 52974, + 52975, + 52976, + 52977, + 52978, + 52979, + 52981, + 52982, + 52983, + 52985, + 52986, + 52987, + 52988, + 52989, + 52990, + 52991, + 52992, + 52993, + 52994, + 52995, + 52996, + 52997, + 52998, + 52999, + 53000, + 53001, + 53002, + 53003, + 53004, + 53005, + 53006, + 53007, + 53008, + 53009, + 53010, + 53011, + 53012, + 53013, + 53014, + 53015, + 53016, + 53017, + 53018, + 53019, + 53020, + 53021, + 53022, + 53023, + 53024, + 53025, + 53026, + 53027, + 53028, + 53029, + 53030, + 53031, + 53032, + 53033, + 53034, + 53035, + 53036, + 53037, + 53038, + 53039, + 53040, + 53041, + 53042, + 53043, + 53044, + 53045, + 53046, + 53047, + 53048, + 53049, + 53050, + 53051, + 53052, + 53053, + 53054, + 53055, + 53056, + 53057, + 53058, + 53059, + 53060, + 53061, + 53062, + 53063, + 53064, + 53065, + 53066, + 53067, + 53068, + 53069, + 53070, + 53071, + 53072, + 53073, + 53074, + 53075, + 53076, + 53077, + 53078, + 53079, + 53080, + 53081, + 53082, + 53083, + 53084, + 53085, + 53086, + 53087, + 53088, + 53089, + 53090, + 53091, + 53092, + 53093, + 53094, + 53095, + 53096, + 53097, + 53098, + 53099, + 53100, + 53101, + 53102, + 53103, + 53104, + 53105, + 53106, + 53107, + 53108, + 53109, + 53110, + 53111, + 53112, + 53113, + 53114, + 53115, + 53116, + 53117, + 53118, + 53119, + 53120, + 53121, + 53122, + 53123, + 53124, + 53125, + 53126, + 53127, + 53128, + 53129, + 53130, + 53131, + 53132, + 53134, + 53135, + 53136, + 53137, + 53138, + 53139, + 53140, + 53141, + 53142, + 53143, + 53144, + 53145, + 53146, + 53147, + 53148, + 53149, + 53150, + 53151, + 53152, + 53153, + 53154, + 53155, + 53156, + 53157, + 53158, + 53159, + 53160, + 53161, + 53162, + 53163, + 53164, + 53165, + 53166, + 53167, + 53168, + 53169, + 53170, + 53171, + 53172, + 53173, + 53174, + 53175, + 53176, + 53177, + 53178, + 53179, + 53180, + 53181, + 53182, + 53183, + 53184, + 53185, + 53186, + 53187, + 53188, + 53189, + 53190, + 53191 + ], + "validation": [ + 124, + 162, + 228, + 275, + 362, + 374, + 458, + 505, + 554, + 597, + 618, + 647, + 669, + 725, + 791, + 842, + 909, + 1040, + 1045, + 1052, + 1064, + 1089, + 1102, + 1166, + 1184, + 1216, + 1229, + 1257, + 1260, + 1262, + 1420, + 1441, + 1520, + 1549, + 1571, + 1625, + 1728, + 1860, + 2000, + 2082, + 2095, + 2154, + 2191, + 2238, + 2347, + 2381, + 2391, + 2412, + 2418, + 2432, + 2488, + 2511, + 2846, + 3172, + 3176, + 3195, + 3323, + 3451, + 3599, + 3611, + 3614, + 3660, + 3758, + 3800, + 3826, + 3873, + 3921, + 3959, + 3987, + 4042, + 4264, + 4299, + 4314, + 4399, + 4582, + 4604, + 4659, + 4677, + 4681, + 4699, + 4706, + 4715, + 4731, + 4744, + 4875, + 4944, + 4994, + 5138, + 5141, + 5157, + 5249, + 5371, + 5449, + 5456, + 5583, + 5589, + 5595, + 5607, + 5609, + 5664, + 5690, + 5730, + 5875, + 5919, + 5990, + 6005, + 6039, + 6197, + 6245, + 6357, + 6383, + 6411, + 6433, + 6458, + 6524, + 6541, + 6545, + 6566, + 6693, + 6716, + 6824, + 6912, + 6932, + 7011, + 7023, + 7078, + 7111, + 7156, + 7185, + 7266, + 7310, + 7381, + 7502, + 7674, + 7735, + 7761, + 7806, + 7814, + 7815, + 7820, + 7839, + 7942, + 7962, + 8014, + 8094, + 8157, + 8201, + 8250, + 8341, + 8396, + 8498, + 8551, + 8560, + 8616, + 8627, + 8679, + 8717, + 8729, + 8764, + 8783, + 8885, + 8983, + 9004, + 9154, + 9417, + 9529, + 9541, + 9543, + 9582, + 9615, + 9629, + 9667, + 9673, + 9707, + 9709, + 9713, + 9715, + 9730, + 9751, + 9877, + 9884, + 9988, + 10014, + 10015, + 10024, + 10026, + 10064, + 10083, + 10119, + 10155, + 10200, + 10301, + 10378, + 10422, + 10469, + 10518, + 10557, + 10614, + 10633, + 10638, + 10665, + 10674, + 10817, + 10946, + 10966, + 11159, + 11166, + 11251, + 11294, + 11433, + 11440, + 11474, + 11499, + 11503, + 11511, + 11530, + 11580, + 11671, + 11678, + 11760, + 11865, + 11941, + 11952, + 12022, + 12094, + 12098, + 12223, + 12343, + 12386, + 12426, + 12457, + 12477, + 12484, + 12527, + 12571, + 12594, + 12595, + 12676, + 12747, + 12799, + 12834, + 12848, + 12861, + 12932, + 12965, + 13013, + 13050, + 13116, + 13183, + 13314, + 13363, + 13527, + 13616, + 13622, + 13649, + 13696, + 13744, + 13781, + 13816, + 13848, + 13998, + 14009, + 14018, + 14032, + 14198, + 14248, + 14273, + 14283, + 14315, + 14328, + 14405, + 14434, + 14437, + 14476, + 14496, + 14583, + 14595, + 14620, + 14657, + 14704, + 14743, + 14788, + 14792, + 14812, + 14865, + 14899, + 14907, + 14945, + 14980, + 14993, + 15000, + 15024, + 15035, + 15142, + 15169, + 15210, + 15271, + 15377, + 15425, + 15579, + 15605, + 15625, + 15715, + 15888, + 15894, + 15925, + 16013, + 16109, + 16166, + 16284, + 16433, + 16444, + 16531, + 16554, + 16585, + 16664, + 16707, + 16760, + 16791, + 16823, + 16855, + 16924, + 16993, + 17009, + 17030, + 17059, + 17116, + 17131, + 17141, + 17234, + 17239, + 17246, + 17252, + 17436, + 17450, + 17457, + 17490, + 17511, + 17512, + 17535, + 17567, + 17591, + 17601, + 17613, + 17616, + 17619, + 17711, + 17970, + 18002, + 18031, + 18032, + 18033, + 18038, + 18047, + 18078, + 18110, + 18250, + 18281, + 18315, + 18418, + 18429, + 18450, + 18457, + 18565, + 18605, + 18665, + 18739, + 18778, + 18780, + 18877, + 18948, + 19012, + 19126, + 19229, + 19298, + 19365, + 19398, + 19480, + 19534, + 19579, + 19733, + 19751, + 19851, + 19954, + 20098, + 20131, + 20173, + 20206, + 20211, + 20316, + 20333, + 20352, + 20417, + 20450, + 20482, + 20557, + 20624, + 20722, + 20731, + 20741, + 20753, + 20820, + 20827, + 20837, + 20839, + 20874, + 20969, + 20986, + 21050, + 21153, + 21162, + 21165, + 21193, + 21248, + 21259, + 21279, + 21284, + 21321, + 21392, + 21440, + 21453, + 21587, + 21611, + 21662, + 21709, + 21790, + 21793, + 21827, + 21954, + 21982, + 22104, + 22110, + 22185, + 22197, + 22213, + 22229, + 22245, + 22279, + 22435, + 22492, + 22518, + 22539, + 22609, + 22664, + 22690, + 22755, + 22780, + 22821, + 22829, + 22946, + 22950, + 22960, + 22973, + 22999, + 23077, + 23090, + 23138, + 23153, + 23246, + 23395, + 23421, + 23555, + 23591, + 23604, + 23732, + 23774, + 23796, + 23833, + 23944, + 23976, + 23981, + 24021, + 24123, + 24153, + 24224, + 24251, + 24278, + 24382, + 24425, + 24426, + 24456, + 24527, + 24533, + 24653, + 24657, + 24688, + 24730, + 24756, + 24757, + 24803, + 24830, + 24845, + 24925, + 24971, + 25177, + 25259, + 25384, + 25439, + 25443, + 25459, + 25532, + 25540, + 25552, + 25570, + 25573, + 25619, + 25622, + 25764, + 25815, + 25819, + 26021, + 26042, + 26109, + 26167, + 26227, + 26304, + 26355, + 26371, + 26396, + 26411, + 26457, + 26503, + 26507, + 26521, + 26527, + 26619, + 26708, + 26733, + 26749, + 26884, + 26995, + 27010, + 27026, + 27031, + 27092, + 27181, + 27197, + 27260, + 27325, + 27329, + 27349, + 27369, + 27376, + 27422, + 27479, + 27572, + 27592, + 27621, + 27678, + 27716, + 27761, + 27778, + 27809, + 27845, + 27848, + 27857, + 27932, + 27954, + 28003, + 28004, + 28174, + 28204, + 28208, + 28230, + 28242, + 28250, + 28264, + 28278, + 28300, + 28331, + 28333, + 28340, + 28342, + 28367, + 28416, + 28436, + 28474, + 28481, + 28494, + 28598, + 28739, + 28792, + 28820, + 28867, + 28947, + 28953, + 28964, + 28991, + 29053, + 29098, + 29182, + 29189, + 29218, + 29366, + 29383, + 29441, + 29509, + 29536, + 29688, + 29823, + 29832, + 29837, + 29862, + 29866, + 29890, + 29897, + 29944, + 29963, + 30003, + 30082, + 30096, + 30104, + 30123, + 30170, + 30214, + 30377, + 30380, + 30414, + 30468, + 30478, + 30510, + 30537, + 30625, + 30647, + 30666, + 30734, + 30793, + 30796, + 30815, + 30837, + 30838, + 30922, + 30948, + 30953, + 30988, + 31001, + 31042, + 31091, + 31190, + 31241, + 31261, + 31279, + 31431, + 31457, + 31458, + 31485, + 31509, + 31558, + 31590, + 31723, + 31734, + 31770, + 31812, + 31821, + 31874, + 32093, + 32102, + 32120, + 32121, + 32130, + 32146, + 32309, + 32345, + 32402, + 32406, + 32504, + 32585, + 32611, + 32704, + 32762, + 32822, + 32841, + 32896, + 32902, + 32979, + 33013, + 33026, + 33141, + 33169, + 33208, + 33244, + 33308, + 33368, + 33393, + 33458, + 33469, + 33474, + 33551, + 33668, + 33671, + 33711, + 33777, + 33788, + 33790, + 33806, + 33816, + 33879, + 33904, + 33997, + 34036, + 34078, + 34181, + 34353, + 34385, + 34467, + 34551, + 34622, + 34783, + 34814, + 34815, + 34844, + 34888, + 34889, + 34980, + 35197, + 35260, + 35312, + 35368, + 35373, + 35419, + 35431, + 35437, + 35452, + 35485, + 35508, + 35548, + 35563, + 35575, + 35623, + 35639, + 35648, + 35706, + 35719, + 35767, + 35899, + 35918, + 35944, + 35953, + 36007, + 36129, + 36169, + 36197, + 36236, + 36255, + 36277, + 36324, + 36332, + 36367, + 36377, + 36463, + 36471, + 36740, + 36802, + 36884, + 36960, + 37099, + 37112, + 37122, + 37132, + 37270, + 37334, + 37347, + 37394, + 37434, + 37485, + 37548, + 37561, + 37575, + 37649, + 37712, + 37823, + 37856, + 37893, + 37894, + 37922, + 37932, + 37962, + 37982, + 38023, + 38054, + 38124, + 38194, + 38266, + 38295, + 38297, + 38409, + 38428, + 38552, + 38600, + 38709, + 38766, + 38786, + 38794, + 38878, + 38913, + 39015, + 39017, + 39112, + 39147, + 39215, + 39227, + 39259, + 39301, + 39347, + 39391, + 39404, + 39411, + 39443, + 39503, + 39547, + 39569, + 39572, + 39620, + 39801, + 39804, + 39842, + 39879, + 39940, + 39969, + 39981, + 40022, + 40126, + 40190, + 40218, + 40227, + 40234, + 40255, + 40340, + 40347, + 40401, + 40410, + 40415, + 40529, + 40553, + 40604, + 40716, + 40770, + 40916, + 41060, + 41116, + 41278, + 41445, + 41604, + 41779, + 41807, + 41849, + 41854, + 41929, + 41942, + 41943, + 42002, + 42009, + 42073, + 42082, + 42167, + 42187, + 42257, + 42342, + 42489, + 42590, + 42593, + 42642, + 42658, + 42659, + 42717, + 42818, + 42956, + 43007, + 43013, + 43023, + 43109, + 43125, + 43222, + 43320, + 43359, + 43391, + 43401, + 43454, + 43606, + 43622, + 43683, + 43763, + 43856, + 43937, + 43939, + 43950, + 43965, + 43984, + 44103, + 44142, + 44143, + 44205, + 44257, + 44259, + 44428, + 44502, + 44509, + 44577, + 44606, + 44796, + 44820, + 44837, + 44868, + 44909, + 44911, + 44915, + 44954, + 45063, + 45191, + 45266, + 45300, + 45304, + 45310, + 45444, + 45474, + 45515, + 45607, + 45683, + 45700, + 45854, + 45875, + 45925, + 45993, + 46019, + 46057, + 46131, + 46155, + 46176, + 46232, + 46257, + 46330, + 46376, + 46414, + 46424, + 46456, + 46524, + 46525, + 46526, + 46529, + 46532, + 46573, + 46594, + 46613, + 46676, + 46695, + 46754, + 46777, + 46815, + 46840, + 46880, + 46989, + 47054, + 47065, + 47078, + 47091, + 47123, + 47132, + 47280, + 47294, + 47376, + 47443, + 47447, + 47508, + 47711, + 47737, + 47842, + 47873, + 47892, + 47989, + 48028, + 48042, + 48165, + 48229, + 48317, + 48327, + 48382, + 48384, + 48458, + 48478, + 48482, + 48519, + 48531, + 48569, + 48590, + 48705, + 48714, + 48763, + 48799, + 48957, + 48981, + 49026, + 49035, + 49199, + 49302, + 49332, + 49336, + 49337, + 49417, + 49462, + 49470, + 49548, + 49641, + 49657, + 49676, + 49751, + 49764, + 49794, + 49845, + 49925, + 49953, + 50010, + 50021, + 50035, + 50037, + 50120, + 50134, + 50155, + 50236, + 50258, + 50267, + 50306, + 50312, + 50319, + 50320, + 50341, + 50392, + 50436, + 50571, + 50585, + 50654, + 50676, + 50677, + 50696, + 50828, + 50848, + 50862, + 50868, + 51204, + 51346, + 51528, + 51588, + 51610, + 51749, + 51759, + 51842, + 51952, + 51954, + 52018, + 52097, + 52103, + 52219, + 52272, + 52275, + 52369, + 52370, + 52443, + 52568, + 52628, + 52680, + 52697, + 52874, + 52980, + 52984, + 53133 + ] +} diff --git a/releases/bridge-native-v3/memory/static_bank_3000/contract.json b/releases/bridge-native-v3/memory/static_bank_3000/contract.json new file mode 100644 index 0000000000000000000000000000000000000000..3f501af7934ac97df58e7787025c8ed08a59b97e --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/contract.json @@ -0,0 +1,95 @@ +{ + "contract": { + "version": "bridge_per_trajectory_static_bank_v1", + "identity": { + "version": "bridge_recovery_identity_v2", + "stage1_format": "bridge_cte_stage1_v1", + "cte_preprocess_id": "bridge_cte_image0_rgb_singleframe_256_bf16_wan22_v1", + "policy_preprocess_id": "widowx_policy_transform_rgb_256_v1", + "static_retrieval_preprocess_id": "support_cte_singleframe256_per_trajectory_temporal_mean_v1", + "action_contract_id": "bridge_reached_delta_legacy_quantile_v0", + "normalizer_sha256": "a8c20660c594523fdeaaeba0cd106937f67c2b71d736aa6efd4200c3f5843594", + "normalizer_source": "cosmos_framework/data/generator/action/datasets/widowx_bridge_v3_dataset.py", + "cte_training_contract_sha256": "85671edb0d8327a922a3596c8331d58b8d1626ae1441606223c4beb6f7d22f40", + "cte_training_contract_fingerprint": "85671edb0d8327a922a3596c8331d58b8d1626ae1441606223c4beb6f7d22f40", + "vae_sha256": "20eb789667fa5e60e7516bf509512f6cb61f01b0aa0695eadaea930c13892b36", + "fps": 5, + "boundary_stride": 4, + "effect_raw_controls": 16, + "dataset": "/home/gpu4/tianyi/TTTVLA/datasets/bridge_orig_1.0.0_lerobot", + "dataset_metadata_sha256": { + "info.json": "14fc7b0ae473266a2c7ee461cfb6d3d621f03ec4f51611cda07498d17eb57291", + "episodes.jsonl": "39043e8ffb580c02e9b884abd67f31dd5d1b87cdb763332b7957a1101e4c6952", + "tasks.jsonl": "2a832f97957188860ab3e95f5096385bffe0e5b03140531897e3e8d281fac625" + }, + "source_code_sha256": { + "scripts/train_bridge_cte.py": "2d02320c737e7af896d31d15295b56f542b4cf056f6ed99db1c6d60baf8e7c91", + "scripts/bridge_cte_data.py": "dd26fb489961f3d71d5493a35a1657ed56b2c167b19da22a4a3cf8ea263f01b8", + "scripts/bridge_cte_loss.py": "13bdac4724cdc82942c4e1e7d8740d0544ea273330e82a73902b4e99ac915ab8", + "cosmos_framework/model/zeva/causal_transition_encoder.py": "7c3afcb1458f75898e79499ad94718f9a1357d89f7a6dd3be89a7148e231f331", + "cosmos_framework/model/zeva/cte_losses.py": "7b792dd3cef46382405223bc40b4b6aa6470ea6432bcd701c3af2eb62d463e62" + }, + "model_config": { + "action_dim": 7, + "hidden_dim": 256, + "retrieval_dim": 128, + "phase_dim": 128, + "effect_dim": 128, + "transition_steps": 4, + "effect_window_transitions": 4, + "effect_target_grid": [ + 4, + 6 + ], + "num_layers": 4, + "num_heads": 8, + "image_channels": 48, + "ema_decay": 0.996, + "use_mamba": false, + "vision_chunk_size": 256, + "vision_gradient_checkpointing": true, + "vision_checkpoint_threshold": 1024 + }, + "checkpoint_step": 30000, + "cte_checkpoint_sha256": "5c94378ea87b875dd709d46cf7941cdb5ca33584df071fef254311c6bbab912e", + "cte_checkpoint_path": "/home/gpu4/tianyi/Zeva/.artifacts/bridge_cte_stage1_20260924/checkpoints/cte_step_000030000.pt", + "split_sha256": "812c70f836242e992572c4085fb7f37732e384c9c84cdaedd20aa5355e934153", + "train_episodes": 52128, + "validation_episodes": 1064 + }, + "selection_sha256": "e050674077f2a06279a821da9d0dcfd4e6bfe3bcc1f0b9838a9b717738556566", + "partitions_sha256": "866d7e26be7f642a0855dfddbb62ebd0a37ed2055a88c0686dc2bfa9976175e6", + "key_pooling": "L2_normalize(mean_t(CTE.retrieval.float32[valid_t]))", + "value_pooling": "mean_t(CTE.causal_interaction_state.float32[valid_t])", + "task_pooling": false, + "complete_support_trajectories": true, + "query_future_used": false, + "retrieval_head": null, + "retrieval_head_status": "Bridge policy-readout Q head not trained; RoboCasa head forbidden", + "original_export_equivalence": "Per-trajectory schema only; original time-pooling exporter unavailable", + "default_retrieval": { + "top_k": 5, + "temperature": 0.07 + }, + "frame_microbatch": 4, + "episode_batch_size": 1, + "numerics": { + "torch": "2.10.0+cu128", + "cuda": "12.8", + "cudnn": 91002, + "cudnn_benchmark": true, + "cudnn_deterministic": false, + "cudnn_allow_tf32": true, + "matmul_allow_tf32": false, + "vae_dtype": "bfloat16", + "cte_autocast": "bfloat16", + "pooled_storage": "float32", + "note": "Zeva defaults; autotuned live re-encoding is not guaranteed bitwise identical" + }, + "producer_source_sha256": { + "scripts/build_bridge_static_bank.py": "2a1dd0141566fe8c200a9826dbd47d10499b85feb4f4781d3677dad8d61cf9f7", + "scripts/bridge_recovery_contract.py": "23a5eba6e33ece86e5f0d7802f35fef5515b9102df7f22ee759c8a30fb10b144" + } + }, + "fingerprint": "80b06645732acd6f1ac1396439c1094ce58081916ddd9a76f9deacd35a1c6869" +} diff --git a/releases/bridge-native-v3/memory/static_bank_3000/diagnostics.json b/releases/bridge-native-v3/memory/static_bank_3000/diagnostics.json new file mode 100644 index 0000000000000000000000000000000000000000..0d9cbcc9a58eb6e42e88f36ebbc0fed93ad70cc2 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/diagnostics.json @@ -0,0 +1,110 @@ +{ + "passed": true, + "entries": 3000, + "distinct_canonical_instructions": 1932, + "raw_frames": 103585, + "encoded_boundaries": 27073, + "completed_effect_windows": 4922, + "raw_length_min": 17, + "raw_length_median": 33.0, + "raw_length_max": 96, + "key_shape": [ + 3000, + 128 + ], + "value_shape": [ + 3000, + 256 + ], + "key_norm_max_abs_error": 1.1920928955078125e-07, + "centered_key_effective_rank": 30.88991355895996, + "raw_feature_tensor_bytes": 4608000, + "support_validation_overlap": 0, + "support_existing_pilot_overlap": 0, + "support_query_overlap": 0, + "retrieval_operator_test": "Synthetic Q / top-5 cosine + softmax operator only; NOT learned retrieval accuracy", + "top_instructions": [ + [ + "sweep into pile", + 84 + ], + [ + "close the drawer", + 44 + ], + [ + "open the drawer", + 42 + ], + [ + "turn lever vertical to front", + 32 + ], + [ + "put carrot on plate", + 25 + ], + [ + "close microwave", + 24 + ], + [ + "take carrot off plate", + 22 + ], + [ + "take broccoli out of pan", + 22 + ], + [ + "flip pot upright in sink", + 19 + ], + [ + "put pear in bowl", + 16 + ], + [ + "fold the cloth from bottom left to top right", + 16 + ], + [ + "open fridge", + 16 + ], + [ + "topple metal pot cardboard fence", + 15 + ], + [ + "open microwave", + 15 + ], + [ + "put lid on pot or pan", + 15 + ], + [ + "lever vertical to front", + 15 + ], + [ + "put knife on cutting board", + 14 + ], + [ + "close fridge", + 13 + ], + [ + "unfold the cloth from top right to bottom left", + 13 + ], + [ + "fold the cloth from top left to bottom right", + 13 + ] + ], + "stage1_or_stage2_gradient_updates": 0, + "exact_saved_feature_roundtrip": true +} diff --git a/releases/bridge-native-v3/memory/static_bank_3000/manifest.json b/releases/bridge-native-v3/memory/static_bank_3000/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..03999887e5a815f0fb29c7da037d442694b0ecb2 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/manifest.json @@ -0,0 +1,192 @@ +{ + "format": "bridge_per_trajectory_static_bank_v1", + "fingerprint": "80b06645732acd6f1ac1396439c1094ce58081916ddd9a76f9deacd35a1c6869", + "completed_at": "2026-09-25T08:18:41.706077+00:00", + "artifact_sha256": { + "static_bank.pt": "bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb", + "selection.json": "f69d59d66a2143a63cd40a388618472994af39fbb0adc3f8269f9a832e9c0d24", + "partitions.json": "2a85230ec96b3fb463d1c0bf3435b8123a429cbc5495e9af170aebacb96d3547", + "contract.json": "77d44020486169a3d8c71c7bbdecc6b253bc2a6ada294ca02b180a66277c1611", + "diagnostics.json": "4d8945d8fa85f08826cc846884bdc53e26cf168c2d4a0b6a1e21f8af607b9612", + "shards/part_000000.pt": "687f0f703de49225386a7342f1bbee5e66da31c5cf9906f4a6e50ec5374f6698", + "shards/part_000050.pt": "ee07951c28c6101fe6d14fb9854e551e49d8457593c1f0f7b16550d3b955f7a7", + "shards/part_000100.pt": "a5001b163ae8c9bb33b8bce45a9b27db5b26d0277f8c435a64cd3b4e13206f57", + "shards/part_000150.pt": "4a381f47c85508208b298762eb25fb9e537fd181b5626db21224f1c20d888156", + "shards/part_000200.pt": "0cfc3f5f4ff7a027f4801b107ee8fad21c2ab2ca9e9732dc2e85f42244d7deac", + "shards/part_000250.pt": "aafdfb041bd3845ad4b9785fd0cfa2ab2ac55ae687d22b75ae1f5ff6e38d4162", + "shards/part_000300.pt": "7bcccf92e8dea201d90aecfe3f124bd3f5c8fced0ae7fa3183eb33f07f861863", + "shards/part_000350.pt": "249b7bf225f538b6ee5d17c5e22d0076243a1cdb9528b4f285fb88c0c515d7b3", + "shards/part_000400.pt": "5d3975d1e7c388bc6a91d1d86d84dbe5d872b9a4ba8231e48195c4c9e709100d", + "shards/part_000450.pt": "ed97fe5178f959a1eeaad943b391592ca4983161190775f7d27bbeb59a2c84b0", + "shards/part_000500.pt": "43ad9db1685e08dc3a76767dcbb1a6a07982adb89ab57f54e4d72013bd68c6ab", + "shards/part_000550.pt": "a674b01436293b3643c6e3a0024cc28dbf4dacdad620816174f491f87745e4a5", + "shards/part_000600.pt": "e8e6b2bbce6526e7c6f05ed9751ea683ac5f6b252980161ede8c7fd67cab3281", + "shards/part_000650.pt": "66c2444152facc486535e267cbbfe8fba81f8f196c3d0ae046e0e1a439b92421", + "shards/part_000700.pt": "36d86f7c1db1a86ffbd5c92ce4b23b3efa2faeb094f8b66840bb186732583f29", + "shards/part_000750.pt": "b96b9af83ca1e0815d18e8761127066785ac893350ed0888bf8f94a8ad095dbe", + "shards/part_000800.pt": "bc0b8199dab94980f54f4c487eca8df16e73ebba942ae1bf86039e798b92f70e", + "shards/part_000850.pt": "debf9423acf800b44ad1d8eb691c6ed756d7e7fa4eb9d0f0adca6265c408fdc4", + "shards/part_000900.pt": "f35a1eba5a1980ab19cf570ff386c6519d9b64ec5fa988560bb8d9aef0e4055a", + "shards/part_000950.pt": "0f854bf56fdd8636470cf7a7040246caea57921fea33c3ea0c995cfa20c17e3d", + "shards/part_001000.pt": "6901357cbaeafb645bff1d170468d1f4a632f1782a7550a9d2c29515128b34c9", + "shards/part_001050.pt": "3162df69773a3eb928a24bb62f516e296d0d100a92691e953b4cbc6e7ea0b8fe", + "shards/part_001100.pt": "2eaf96a023be389c31f8470df8230e3df7e5245d67af17ca17113389d2703b1f", + "shards/part_001150.pt": "9fcf41048f3b11dc5ec4647feeb5309fd6f9d9f873ba0e0feef30453d7dfc6ba", + "shards/part_001200.pt": "5b32e74d3fd3cb5147eb7957b39b37214c9a47f38d078de86ed70fcd4958408b", + "shards/part_001250.pt": "4f47c223981f62374e562606b6b0c7442fd0ac8faf7f32787ae118548ba1cf16", + "shards/part_001300.pt": "38319a01cb0fcdcd4c400e1f05fea3702b8dae39f55b07c8959639e24b648423", + "shards/part_001350.pt": "e9f772c37695df35a4ce77c370d9c3e101daa60551bd20f0d55460f42c468c6b", + "shards/part_001400.pt": "3e0081b97e04a3f3e3060f2947ba257043777ddbc891aae25dcf71ac3bb848ba", + "shards/part_001450.pt": "b4f0e9d46bcbeda12fd16029d1dc5af7741ebbecfdc82805ec8197a84f044ef4", + "shards/part_001500.pt": "082eca4121c95e9867c04502c8b0b5be4cba77ab0436cb15988ae57a4e1ea559", + "shards/part_001550.pt": "b4302769aab26c3ad44e877f213b5b565958cf9620590616136e2a92a06e8e32", + "shards/part_001600.pt": "ac473f6484fd1c08f50afc317f76aee9f5e469dabfa6298bddaab61c659e129c", + "shards/part_001650.pt": "5b0c17109a6772d9015c9b240581347ac7ee9197abe4366902ee5bce9be6dc8a", + "shards/part_001700.pt": "170e99833fa50abadddfa59b04cc5e9c0df8b1c43a69a7d2cb15e7331567fa64", + "shards/part_001750.pt": "68b08663cf35280603d3053ca66ab1740a9a5dacf645998792e0a0c4d8cfd984", + "shards/part_001800.pt": "68c02663c4d4de4f263a88b7257769b8e6f465811e96a52196580279787c4884", + "shards/part_001850.pt": "9050b76ca81d8f7295382ebefa72cc11229b333919f947c9442f6f5b521c93c0", + "shards/part_001900.pt": "32581354a76de4c9dd835ae408bd21ef3011af6eec5775b1623f66ff2e8831ec", + "shards/part_001950.pt": "0aa856841af0cedbbff3d18b697302eb7b82c20adbad86e6af2bbe342c098837", + "shards/part_002000.pt": "ef4ed15000f7505c367881e7dda7f08e1ec1b613444f1c356f30b071cf131e90", + "shards/part_002050.pt": "11dbf5ce3a51a17314384f9f0869fb1c8bfe6b47f6331cb6b114e962c6327dc5", + "shards/part_002100.pt": "09116752289e27ebfc43c9ccaf0ccc7525a61726ebd3654bc88a82d702d59b33", + "shards/part_002150.pt": "4a923ca0be5ede6fde4bd66fe9ae747e0a66d79ce29544aaca982c5fab8b3bd6", + "shards/part_002200.pt": "e82e4acedfd5e726d89ba6b6b76afc0d6740a7c4e9ae11216d64e77294a1ca67", + "shards/part_002250.pt": "d5c1d6ce4a49195a9d220103fbd4644445f78ee77e83bd124e18318f3cb33c15", + "shards/part_002300.pt": "3027f36fbd35995b08caa0ca4b96a7b05a66610ca93437a22b072934142a485a", + "shards/part_002350.pt": "3b1ced0c140023ae88974c5db04fa143cc1d74b8eb9884aa13daac113c6805d0", + "shards/part_002400.pt": "ebc866ba989c9b04814720b6fe561d1e03d0ccf67bc86890ad6405dc1110d008", + "shards/part_002450.pt": "c7d28fafecefd9617a42cf4e9112f091194216ca8c424b2f4cc4f0c30cc07960", + "shards/part_002500.pt": "2568074c7adcb383b624e0462ac52db80ea9cd3b4cf43ca9253eb3f4d4cae2e4", + "shards/part_002550.pt": "59036fab565492c7c96bc169eebd2a3c02564e08e6ce961f4af6446a1c91bcc8", + "shards/part_002600.pt": "8d9a94dcd820ec432522c8c3d0bccfb4725a0c7aaabe6a46f3df2a610fa149ee", + "shards/part_002650.pt": "877cafcbe56d11d55de7fc32d58bc71c39412021aab000d95942d9e4e8967e43", + "shards/part_002700.pt": "1b1236d196d3ac9ad19161352260ced85cfdce4b1c2c83db84293969b7019d59", + "shards/part_002750.pt": "79f9bcaeaea610b3abaaffda4140d3da1782e001319d25507e2d5e5d8e0bd6c4", + "shards/part_002800.pt": "50212355947ff3864108921574ff730eebd55dc9c4f6397c7ab31667356675d3", + "shards/part_002850.pt": "dcd64ba27ef20a89e2ca840cd9520dcb61b4faf004fc08d5dc40c8ad6956aa78", + "shards/part_002900.pt": "a1874723b4a8bddbc63a7868b22d2994f9195432ffa1d7e6251e0130f86ce666", + "shards/part_002950.pt": "a1c43c707273527fa9021a9c35f5cd6cc7aaa664675b782186c4dca8824bcc60" + }, + "bank_bytes": 7557265, + "stage1_frozen": true, + "vae_frozen": true, + "gradient_updates": 0, + "gpu": 7, + "gpu_uuid": "GPU-fcfa274e-1fd5-2745-b1e8-6398f63f4c4a", + "gpu_name": "NVIDIA H100 80GB HBM3", + "elapsed_this_run_seconds": 103.70192765200045, + "resumed_entries": 0, + "diagnostics": { + "passed": true, + "entries": 3000, + "distinct_canonical_instructions": 1932, + "raw_frames": 103585, + "encoded_boundaries": 27073, + "completed_effect_windows": 4922, + "raw_length_min": 17, + "raw_length_median": 33.0, + "raw_length_max": 96, + "key_shape": [ + 3000, + 128 + ], + "value_shape": [ + 3000, + 256 + ], + "key_norm_max_abs_error": 1.1920928955078125e-07, + "centered_key_effective_rank": 30.88991355895996, + "raw_feature_tensor_bytes": 4608000, + "support_validation_overlap": 0, + "support_existing_pilot_overlap": 0, + "support_query_overlap": 0, + "retrieval_operator_test": "Synthetic Q / top-5 cosine + softmax operator only; NOT learned retrieval accuracy", + "top_instructions": [ + [ + "sweep into pile", + 84 + ], + [ + "close the drawer", + 44 + ], + [ + "open the drawer", + 42 + ], + [ + "turn lever vertical to front", + 32 + ], + [ + "put carrot on plate", + 25 + ], + [ + "close microwave", + 24 + ], + [ + "take carrot off plate", + 22 + ], + [ + "take broccoli out of pan", + 22 + ], + [ + "flip pot upright in sink", + 19 + ], + [ + "put pear in bowl", + 16 + ], + [ + "fold the cloth from bottom left to top right", + 16 + ], + [ + "open fridge", + 16 + ], + [ + "topple metal pot cardboard fence", + 15 + ], + [ + "open microwave", + 15 + ], + [ + "put lid on pot or pan", + 15 + ], + [ + "lever vertical to front", + 15 + ], + [ + "put knife on cutting board", + 14 + ], + [ + "close fridge", + 13 + ], + [ + "unfold the cloth from top right to bottom left", + 13 + ], + [ + "fold the cloth from top left to bottom right", + 13 + ] + ], + "stage1_or_stage2_gradient_updates": 0, + "exact_saved_feature_roundtrip": true + }, + "consumer_status": "Not wired into existing pilot; new Bridge Q head or explicitly labelled train-only selector required" +} diff --git a/releases/bridge-native-v3/memory/static_bank_3000/partitions.json b/releases/bridge-native-v3/memory/static_bank_3000/partitions.json new file mode 100644 index 0000000000000000000000000000000000000000..a128a8d747847ba29ef65db75e7cfc29c368971f --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/partitions.json @@ -0,0 +1,53203 @@ +{ + "version": "bridge_static_support_query_partition_v1", + "support_episode_ids": [ + 3, + 26, + 34, + 35, + 36, + 60, + 114, + 131, + 150, + 157, + 242, + 252, + 268, + 276, + 277, + 284, + 286, + 313, + 346, + 365, + 423, + 431, + 438, + 440, + 449, + 460, + 489, + 499, + 503, + 561, + 593, + 614, + 620, + 631, + 633, + 639, + 651, + 671, + 677, + 717, + 721, + 770, + 778, + 797, + 798, + 801, + 862, + 869, + 882, + 907, + 918, + 984, + 1014, + 1072, + 1104, + 1115, + 1132, + 1135, + 1164, + 1169, + 1191, + 1201, + 1239, + 1267, + 1278, + 1286, + 1311, + 1323, + 1326, + 1337, + 1342, + 1370, + 1389, + 1398, + 1400, + 1401, + 1423, + 1437, + 1451, + 1458, + 1506, + 1547, + 1596, + 1597, + 1627, + 1670, + 1688, + 1709, + 1719, + 1736, + 1747, + 1783, + 1822, + 1864, + 1871, + 1893, + 1899, + 1905, + 1916, + 1937, + 1983, + 1991, + 2013, + 2045, + 2093, + 2124, + 2143, + 2151, + 2162, + 2184, + 2209, + 2211, + 2212, + 2244, + 2251, + 2283, + 2286, + 2293, + 2303, + 2307, + 2397, + 2411, + 2427, + 2429, + 2462, + 2466, + 2499, + 2503, + 2510, + 2520, + 2522, + 2528, + 2545, + 2548, + 2550, + 2577, + 2589, + 2593, + 2600, + 2601, + 2611, + 2612, + 2658, + 2675, + 2681, + 2689, + 2706, + 2729, + 2734, + 2742, + 2816, + 2830, + 2922, + 2923, + 2944, + 2958, + 2959, + 2980, + 2982, + 2988, + 3005, + 3021, + 3030, + 3051, + 3072, + 3097, + 3134, + 3170, + 3215, + 3247, + 3256, + 3285, + 3311, + 3348, + 3357, + 3376, + 3421, + 3433, + 3434, + 3435, + 3437, + 3471, + 3518, + 3549, + 3563, + 3566, + 3578, + 3583, + 3585, + 3586, + 3617, + 3644, + 3651, + 3662, + 3673, + 3676, + 3691, + 3772, + 3774, + 3786, + 3814, + 3816, + 3819, + 3833, + 3845, + 3869, + 3889, + 3940, + 3996, + 4019, + 4024, + 4028, + 4039, + 4066, + 4128, + 4136, + 4139, + 4141, + 4157, + 4170, + 4171, + 4174, + 4180, + 4189, + 4190, + 4196, + 4198, + 4212, + 4246, + 4254, + 4263, + 4269, + 4307, + 4323, + 4324, + 4327, + 4330, + 4334, + 4412, + 4427, + 4454, + 4457, + 4459, + 4493, + 4495, + 4510, + 4517, + 4544, + 4548, + 4565, + 4570, + 4599, + 4603, + 4610, + 4628, + 4633, + 4745, + 4763, + 4832, + 4835, + 4894, + 4898, + 4900, + 4951, + 4966, + 4972, + 5025, + 5034, + 5036, + 5047, + 5061, + 5067, + 5081, + 5093, + 5114, + 5126, + 5129, + 5144, + 5156, + 5168, + 5212, + 5214, + 5236, + 5261, + 5287, + 5294, + 5301, + 5313, + 5315, + 5320, + 5334, + 5352, + 5357, + 5361, + 5364, + 5369, + 5375, + 5386, + 5418, + 5420, + 5424, + 5475, + 5478, + 5483, + 5513, + 5596, + 5616, + 5641, + 5654, + 5656, + 5657, + 5666, + 5687, + 5713, + 5715, + 5727, + 5761, + 5766, + 5769, + 5789, + 5805, + 5813, + 5830, + 5837, + 5860, + 5866, + 5887, + 5896, + 5930, + 5941, + 5943, + 5958, + 5991, + 6021, + 6026, + 6046, + 6053, + 6072, + 6079, + 6089, + 6113, + 6134, + 6147, + 6155, + 6168, + 6187, + 6191, + 6208, + 6217, + 6220, + 6230, + 6251, + 6273, + 6276, + 6296, + 6298, + 6305, + 6327, + 6335, + 6346, + 6360, + 6376, + 6379, + 6398, + 6400, + 6418, + 6445, + 6452, + 6468, + 6502, + 6527, + 6531, + 6552, + 6560, + 6612, + 6636, + 6647, + 6680, + 6684, + 6688, + 6703, + 6704, + 6705, + 6732, + 6742, + 6772, + 6798, + 6861, + 6873, + 6885, + 6895, + 6897, + 6901, + 6910, + 6913, + 6922, + 6926, + 6955, + 6959, + 6960, + 6963, + 7030, + 7055, + 7071, + 7081, + 7091, + 7106, + 7121, + 7123, + 7189, + 7209, + 7231, + 7247, + 7300, + 7352, + 7356, + 7390, + 7482, + 7483, + 7520, + 7549, + 7555, + 7560, + 7588, + 7616, + 7627, + 7630, + 7633, + 7680, + 7693, + 7702, + 7721, + 7722, + 7780, + 7804, + 7842, + 7889, + 7897, + 7920, + 7935, + 7945, + 7960, + 7963, + 7971, + 8027, + 8028, + 8037, + 8041, + 8045, + 8092, + 8139, + 8153, + 8154, + 8241, + 8246, + 8254, + 8259, + 8261, + 8280, + 8297, + 8299, + 8324, + 8328, + 8334, + 8352, + 8364, + 8374, + 8390, + 8392, + 8401, + 8445, + 8461, + 8492, + 8493, + 8526, + 8528, + 8598, + 8623, + 8715, + 8724, + 8809, + 8865, + 8877, + 8889, + 8900, + 8916, + 8922, + 8928, + 8930, + 8952, + 8964, + 9053, + 9073, + 9079, + 9099, + 9102, + 9105, + 9109, + 9140, + 9150, + 9159, + 9161, + 9165, + 9176, + 9184, + 9196, + 9203, + 9232, + 9235, + 9250, + 9268, + 9271, + 9280, + 9291, + 9310, + 9316, + 9317, + 9342, + 9351, + 9365, + 9376, + 9428, + 9451, + 9461, + 9488, + 9498, + 9518, + 9523, + 9534, + 9539, + 9550, + 9590, + 9651, + 9669, + 9708, + 9790, + 9792, + 9797, + 9802, + 9805, + 9809, + 9828, + 9865, + 9871, + 9908, + 9915, + 9921, + 9972, + 9978, + 10006, + 10036, + 10076, + 10096, + 10114, + 10117, + 10131, + 10133, + 10157, + 10168, + 10197, + 10202, + 10211, + 10256, + 10261, + 10288, + 10317, + 10352, + 10367, + 10389, + 10414, + 10466, + 10485, + 10488, + 10525, + 10529, + 10532, + 10558, + 10595, + 10603, + 10618, + 10624, + 10644, + 10672, + 10708, + 10723, + 10725, + 10757, + 10760, + 10766, + 10770, + 10804, + 10816, + 10830, + 10837, + 10859, + 10877, + 10942, + 10977, + 10980, + 10994, + 11006, + 11014, + 11042, + 11079, + 11085, + 11134, + 11189, + 11192, + 11213, + 11214, + 11226, + 11245, + 11276, + 11284, + 11350, + 11354, + 11383, + 11384, + 11390, + 11398, + 11408, + 11448, + 11481, + 11515, + 11546, + 11548, + 11576, + 11591, + 11614, + 11631, + 11676, + 11681, + 11813, + 11848, + 11873, + 11937, + 11957, + 11969, + 11971, + 12003, + 12009, + 12024, + 12037, + 12046, + 12048, + 12049, + 12052, + 12056, + 12074, + 12085, + 12119, + 12121, + 12126, + 12154, + 12180, + 12183, + 12198, + 12219, + 12239, + 12277, + 12308, + 12340, + 12355, + 12402, + 12409, + 12420, + 12437, + 12447, + 12448, + 12471, + 12478, + 12491, + 12521, + 12589, + 12596, + 12600, + 12609, + 12630, + 12634, + 12635, + 12641, + 12648, + 12657, + 12675, + 12735, + 12739, + 12740, + 12763, + 12781, + 12804, + 12844, + 12865, + 12876, + 12880, + 12885, + 12887, + 12912, + 12914, + 12945, + 12954, + 12957, + 12958, + 12964, + 12967, + 12982, + 12984, + 13003, + 13032, + 13083, + 13089, + 13109, + 13132, + 13141, + 13143, + 13151, + 13210, + 13212, + 13223, + 13225, + 13230, + 13261, + 13292, + 13353, + 13393, + 13400, + 13412, + 13466, + 13508, + 13519, + 13567, + 13579, + 13591, + 13603, + 13648, + 13654, + 13700, + 13720, + 13758, + 13759, + 13819, + 13827, + 13871, + 13886, + 13895, + 13897, + 13917, + 13967, + 14005, + 14012, + 14042, + 14082, + 14084, + 14085, + 14087, + 14095, + 14143, + 14152, + 14154, + 14167, + 14181, + 14223, + 14236, + 14255, + 14263, + 14267, + 14309, + 14325, + 14330, + 14339, + 14344, + 14346, + 14375, + 14392, + 14399, + 14406, + 14409, + 14414, + 14499, + 14503, + 14505, + 14512, + 14559, + 14568, + 14602, + 14605, + 14606, + 14608, + 14632, + 14642, + 14648, + 14653, + 14654, + 14659, + 14661, + 14664, + 14689, + 14690, + 14699, + 14700, + 14702, + 14773, + 14781, + 14782, + 14806, + 14810, + 14813, + 14825, + 14828, + 14844, + 14849, + 14872, + 14875, + 14922, + 14927, + 14939, + 14959, + 14964, + 14974, + 15010, + 15049, + 15080, + 15100, + 15136, + 15164, + 15171, + 15174, + 15183, + 15219, + 15228, + 15240, + 15270, + 15288, + 15289, + 15303, + 15317, + 15320, + 15332, + 15350, + 15392, + 15415, + 15423, + 15455, + 15507, + 15558, + 15575, + 15577, + 15583, + 15586, + 15648, + 15661, + 15678, + 15724, + 15758, + 15760, + 15763, + 15770, + 15771, + 15782, + 15786, + 15787, + 15790, + 15792, + 15819, + 15820, + 15846, + 15895, + 15910, + 15932, + 15934, + 15939, + 15940, + 15942, + 15955, + 15985, + 15995, + 16010, + 16020, + 16032, + 16066, + 16074, + 16086, + 16095, + 16129, + 16146, + 16148, + 16188, + 16198, + 16202, + 16226, + 16270, + 16273, + 16330, + 16333, + 16336, + 16350, + 16386, + 16391, + 16394, + 16395, + 16420, + 16432, + 16435, + 16482, + 16527, + 16540, + 16548, + 16574, + 16579, + 16580, + 16586, + 16594, + 16600, + 16608, + 16612, + 16633, + 16634, + 16657, + 16662, + 16700, + 16725, + 16774, + 16794, + 16808, + 16818, + 16845, + 16888, + 16890, + 16894, + 16906, + 16941, + 16945, + 16964, + 16997, + 17007, + 17012, + 17047, + 17053, + 17072, + 17102, + 17104, + 17133, + 17175, + 17182, + 17189, + 17205, + 17214, + 17217, + 17245, + 17279, + 17301, + 17308, + 17323, + 17338, + 17346, + 17362, + 17371, + 17380, + 17381, + 17390, + 17410, + 17413, + 17414, + 17465, + 17509, + 17525, + 17531, + 17537, + 17547, + 17562, + 17609, + 17625, + 17629, + 17630, + 17649, + 17670, + 17681, + 17694, + 17695, + 17736, + 17785, + 17788, + 17790, + 17823, + 17834, + 17840, + 17850, + 17859, + 17895, + 17903, + 17907, + 17938, + 17948, + 17957, + 17967, + 18001, + 18003, + 18027, + 18048, + 18050, + 18062, + 18073, + 18081, + 18089, + 18112, + 18113, + 18127, + 18164, + 18207, + 18226, + 18231, + 18241, + 18257, + 18266, + 18303, + 18317, + 18336, + 18366, + 18398, + 18400, + 18404, + 18405, + 18413, + 18432, + 18439, + 18452, + 18467, + 18472, + 18473, + 18536, + 18539, + 18585, + 18599, + 18617, + 18623, + 18638, + 18646, + 18652, + 18679, + 18686, + 18697, + 18740, + 18741, + 18775, + 18848, + 18911, + 18912, + 18915, + 18917, + 18927, + 18935, + 18940, + 18960, + 18962, + 18964, + 18966, + 18967, + 18969, + 18973, + 19011, + 19029, + 19038, + 19039, + 19054, + 19082, + 19100, + 19104, + 19106, + 19107, + 19129, + 19147, + 19165, + 19187, + 19196, + 19207, + 19216, + 19227, + 19241, + 19287, + 19307, + 19340, + 19349, + 19350, + 19352, + 19378, + 19400, + 19414, + 19427, + 19454, + 19459, + 19465, + 19488, + 19509, + 19519, + 19546, + 19549, + 19556, + 19604, + 19637, + 19673, + 19690, + 19700, + 19720, + 19757, + 19784, + 19793, + 19817, + 19836, + 19845, + 19860, + 19880, + 19890, + 19910, + 19946, + 19953, + 19960, + 19973, + 19982, + 19987, + 20014, + 20039, + 20091, + 20092, + 20101, + 20112, + 20126, + 20130, + 20141, + 20145, + 20163, + 20201, + 20229, + 20235, + 20251, + 20266, + 20278, + 20279, + 20294, + 20307, + 20351, + 20360, + 20378, + 20391, + 20436, + 20474, + 20493, + 20496, + 20498, + 20513, + 20517, + 20538, + 20560, + 20563, + 20564, + 20566, + 20574, + 20593, + 20596, + 20604, + 20609, + 20617, + 20623, + 20636, + 20644, + 20660, + 20662, + 20665, + 20704, + 20705, + 20730, + 20743, + 20751, + 20758, + 20783, + 20814, + 20823, + 20896, + 20927, + 20948, + 20960, + 20962, + 20978, + 20982, + 20983, + 21007, + 21011, + 21015, + 21025, + 21027, + 21034, + 21041, + 21051, + 21052, + 21114, + 21119, + 21121, + 21134, + 21144, + 21169, + 21174, + 21182, + 21189, + 21202, + 21210, + 21269, + 21278, + 21286, + 21290, + 21299, + 21307, + 21332, + 21333, + 21336, + 21350, + 21367, + 21371, + 21378, + 21383, + 21386, + 21422, + 21435, + 21448, + 21460, + 21479, + 21499, + 21525, + 21552, + 21562, + 21565, + 21570, + 21589, + 21591, + 21596, + 21600, + 21601, + 21626, + 21640, + 21696, + 21718, + 21719, + 21731, + 21733, + 21739, + 21753, + 21765, + 21769, + 21773, + 21780, + 21781, + 21805, + 21815, + 21868, + 21870, + 21873, + 21878, + 21894, + 21931, + 21934, + 21971, + 21975, + 22004, + 22005, + 22011, + 22019, + 22020, + 22029, + 22040, + 22099, + 22154, + 22161, + 22188, + 22190, + 22205, + 22225, + 22235, + 22252, + 22259, + 22277, + 22285, + 22289, + 22290, + 22292, + 22339, + 22356, + 22357, + 22361, + 22363, + 22371, + 22481, + 22498, + 22500, + 22572, + 22575, + 22617, + 22620, + 22663, + 22675, + 22683, + 22720, + 22757, + 22791, + 22819, + 22857, + 22861, + 22873, + 22885, + 22889, + 22900, + 22941, + 22952, + 22975, + 22995, + 23007, + 23020, + 23024, + 23034, + 23073, + 23122, + 23128, + 23221, + 23235, + 23243, + 23247, + 23253, + 23289, + 23290, + 23295, + 23297, + 23315, + 23352, + 23353, + 23379, + 23397, + 23422, + 23446, + 23450, + 23453, + 23464, + 23466, + 23521, + 23533, + 23543, + 23549, + 23565, + 23571, + 23577, + 23585, + 23655, + 23666, + 23676, + 23677, + 23691, + 23706, + 23731, + 23743, + 23744, + 23778, + 23780, + 23799, + 23801, + 23822, + 23845, + 23849, + 23860, + 23866, + 23869, + 23871, + 23889, + 23910, + 23912, + 23925, + 23953, + 23966, + 23969, + 23977, + 23985, + 24018, + 24025, + 24030, + 24074, + 24124, + 24127, + 24129, + 24138, + 24139, + 24140, + 24159, + 24198, + 24206, + 24229, + 24247, + 24248, + 24263, + 24269, + 24280, + 24309, + 24316, + 24330, + 24350, + 24352, + 24355, + 24369, + 24393, + 24400, + 24401, + 24428, + 24433, + 24458, + 24509, + 24540, + 24544, + 24568, + 24572, + 24594, + 24603, + 24607, + 24667, + 24676, + 24681, + 24687, + 24712, + 24755, + 24817, + 24844, + 24857, + 24858, + 24867, + 24878, + 24880, + 24881, + 24888, + 24894, + 24908, + 24920, + 24961, + 24968, + 24982, + 25001, + 25012, + 25038, + 25043, + 25056, + 25108, + 25109, + 25116, + 25130, + 25137, + 25145, + 25174, + 25199, + 25205, + 25262, + 25272, + 25276, + 25277, + 25279, + 25297, + 25361, + 25364, + 25365, + 25396, + 25400, + 25421, + 25435, + 25453, + 25483, + 25486, + 25491, + 25498, + 25517, + 25556, + 25599, + 25604, + 25615, + 25674, + 25679, + 25699, + 25711, + 25730, + 25748, + 25760, + 25788, + 25828, + 25854, + 25855, + 25893, + 25977, + 25980, + 25993, + 26007, + 26026, + 26104, + 26112, + 26132, + 26138, + 26149, + 26160, + 26180, + 26189, + 26195, + 26197, + 26214, + 26218, + 26222, + 26234, + 26235, + 26246, + 26253, + 26269, + 26289, + 26294, + 26312, + 26326, + 26331, + 26347, + 26372, + 26373, + 26384, + 26390, + 26395, + 26397, + 26405, + 26408, + 26445, + 26465, + 26481, + 26493, + 26519, + 26523, + 26589, + 26591, + 26615, + 26618, + 26623, + 26635, + 26642, + 26645, + 26754, + 26805, + 26824, + 26836, + 26837, + 26843, + 26861, + 26872, + 26931, + 26939, + 26990, + 27017, + 27045, + 27069, + 27071, + 27131, + 27139, + 27158, + 27162, + 27173, + 27195, + 27224, + 27233, + 27253, + 27328, + 27359, + 27373, + 27415, + 27442, + 27457, + 27458, + 27473, + 27502, + 27531, + 27533, + 27543, + 27554, + 27586, + 27594, + 27614, + 27646, + 27647, + 27659, + 27670, + 27676, + 27698, + 27718, + 27746, + 27769, + 27771, + 27777, + 27779, + 27805, + 27806, + 27858, + 27861, + 27879, + 27904, + 27923, + 27931, + 28040, + 28047, + 28059, + 28066, + 28072, + 28083, + 28085, + 28102, + 28125, + 28128, + 28134, + 28186, + 28195, + 28205, + 28212, + 28237, + 28256, + 28263, + 28298, + 28299, + 28311, + 28319, + 28327, + 28362, + 28455, + 28476, + 28547, + 28553, + 28572, + 28579, + 28599, + 28609, + 28610, + 28637, + 28650, + 28667, + 28681, + 28685, + 28729, + 28733, + 28743, + 28750, + 28763, + 28783, + 28787, + 28799, + 28806, + 28826, + 28859, + 28862, + 28864, + 28877, + 28880, + 28883, + 28884, + 28892, + 28898, + 28916, + 28925, + 28927, + 28936, + 28942, + 28948, + 28952, + 28985, + 29012, + 29035, + 29039, + 29054, + 29069, + 29070, + 29114, + 29139, + 29149, + 29195, + 29205, + 29234, + 29235, + 29267, + 29276, + 29284, + 29300, + 29336, + 29347, + 29349, + 29358, + 29439, + 29450, + 29451, + 29514, + 29544, + 29553, + 29616, + 29667, + 29683, + 29726, + 29728, + 29741, + 29760, + 29765, + 29766, + 29801, + 29803, + 29824, + 29835, + 29842, + 29846, + 29876, + 29889, + 29918, + 29968, + 29971, + 29984, + 30022, + 30038, + 30075, + 30081, + 30152, + 30162, + 30201, + 30212, + 30217, + 30225, + 30236, + 30241, + 30275, + 30278, + 30284, + 30338, + 30366, + 30375, + 30381, + 30385, + 30389, + 30410, + 30434, + 30444, + 30466, + 30472, + 30475, + 30505, + 30520, + 30525, + 30533, + 30567, + 30623, + 30624, + 30649, + 30650, + 30663, + 30678, + 30687, + 30702, + 30710, + 30729, + 30730, + 30735, + 30754, + 30757, + 30802, + 30805, + 30834, + 30839, + 30840, + 30856, + 30865, + 30881, + 30885, + 30957, + 30965, + 31023, + 31043, + 31063, + 31094, + 31106, + 31121, + 31152, + 31159, + 31177, + 31188, + 31194, + 31212, + 31216, + 31246, + 31256, + 31264, + 31293, + 31295, + 31312, + 31359, + 31400, + 31402, + 31408, + 31444, + 31468, + 31486, + 31490, + 31498, + 31508, + 31542, + 31543, + 31609, + 31613, + 31654, + 31660, + 31690, + 31695, + 31697, + 31739, + 31750, + 31758, + 31760, + 31766, + 31778, + 31807, + 31808, + 31841, + 31853, + 31857, + 31876, + 31900, + 31901, + 31910, + 31940, + 31970, + 31974, + 31982, + 32048, + 32062, + 32111, + 32115, + 32119, + 32135, + 32145, + 32150, + 32187, + 32210, + 32253, + 32265, + 32331, + 32332, + 32333, + 32347, + 32369, + 32374, + 32385, + 32389, + 32401, + 32413, + 32506, + 32538, + 32574, + 32597, + 32603, + 32622, + 32630, + 32633, + 32651, + 32668, + 32719, + 32731, + 32734, + 32774, + 32792, + 32800, + 32806, + 32820, + 32823, + 32837, + 32880, + 32924, + 32947, + 32959, + 32987, + 32988, + 32992, + 33035, + 33055, + 33066, + 33087, + 33111, + 33130, + 33132, + 33135, + 33137, + 33172, + 33194, + 33203, + 33220, + 33222, + 33233, + 33263, + 33280, + 33302, + 33320, + 33335, + 33345, + 33349, + 33383, + 33386, + 33436, + 33444, + 33470, + 33473, + 33484, + 33523, + 33530, + 33608, + 33637, + 33643, + 33652, + 33655, + 33674, + 33685, + 33699, + 33715, + 33720, + 33735, + 33753, + 33763, + 33772, + 33796, + 33800, + 33826, + 33840, + 33863, + 33876, + 33905, + 33941, + 33967, + 33976, + 33988, + 34022, + 34025, + 34032, + 34051, + 34057, + 34058, + 34084, + 34086, + 34089, + 34101, + 34104, + 34110, + 34120, + 34139, + 34142, + 34147, + 34166, + 34225, + 34245, + 34261, + 34281, + 34314, + 34327, + 34336, + 34337, + 34357, + 34360, + 34419, + 34445, + 34511, + 34515, + 34559, + 34563, + 34581, + 34588, + 34614, + 34625, + 34626, + 34673, + 34674, + 34681, + 34705, + 34716, + 34725, + 34733, + 34741, + 34744, + 34748, + 34763, + 34794, + 34796, + 34825, + 34832, + 34887, + 34920, + 34928, + 34956, + 34957, + 35008, + 35016, + 35054, + 35061, + 35063, + 35072, + 35075, + 35077, + 35091, + 35103, + 35114, + 35123, + 35202, + 35203, + 35236, + 35252, + 35262, + 35281, + 35300, + 35329, + 35335, + 35345, + 35407, + 35414, + 35418, + 35423, + 35480, + 35490, + 35503, + 35513, + 35531, + 35536, + 35551, + 35569, + 35577, + 35594, + 35641, + 35671, + 35677, + 35728, + 35744, + 35751, + 35772, + 35773, + 35787, + 35800, + 35824, + 35829, + 35858, + 35869, + 35880, + 35883, + 35920, + 35929, + 35934, + 35974, + 35995, + 36002, + 36024, + 36044, + 36086, + 36150, + 36151, + 36175, + 36205, + 36225, + 36237, + 36251, + 36258, + 36308, + 36314, + 36321, + 36322, + 36325, + 36395, + 36396, + 36420, + 36441, + 36447, + 36480, + 36520, + 36524, + 36550, + 36572, + 36594, + 36599, + 36609, + 36621, + 36625, + 36642, + 36648, + 36710, + 36734, + 36741, + 36776, + 36779, + 36794, + 36795, + 36797, + 36810, + 36812, + 36817, + 36818, + 36826, + 36893, + 36906, + 36915, + 36968, + 36971, + 36978, + 36984, + 37008, + 37023, + 37037, + 37045, + 37085, + 37090, + 37118, + 37149, + 37151, + 37171, + 37177, + 37197, + 37200, + 37209, + 37216, + 37224, + 37249, + 37275, + 37327, + 37337, + 37387, + 37414, + 37415, + 37423, + 37424, + 37445, + 37468, + 37472, + 37481, + 37500, + 37502, + 37543, + 37550, + 37568, + 37569, + 37579, + 37599, + 37622, + 37636, + 37657, + 37672, + 37682, + 37695, + 37744, + 37749, + 37762, + 37802, + 37816, + 37860, + 37863, + 37879, + 37886, + 37902, + 37972, + 37979, + 37980, + 38112, + 38132, + 38193, + 38211, + 38217, + 38221, + 38224, + 38228, + 38277, + 38320, + 38325, + 38349, + 38352, + 38374, + 38415, + 38448, + 38465, + 38505, + 38529, + 38617, + 38629, + 38658, + 38717, + 38723, + 38751, + 38778, + 38783, + 38792, + 38797, + 38837, + 38857, + 38859, + 38865, + 38866, + 38884, + 38887, + 38888, + 38889, + 38890, + 38892, + 38898, + 38906, + 38912, + 38943, + 38969, + 38973, + 38978, + 39014, + 39031, + 39043, + 39051, + 39093, + 39094, + 39126, + 39128, + 39160, + 39225, + 39235, + 39246, + 39285, + 39325, + 39334, + 39338, + 39344, + 39366, + 39383, + 39385, + 39438, + 39440, + 39476, + 39479, + 39532, + 39571, + 39579, + 39602, + 39628, + 39631, + 39688, + 39692, + 39697, + 39728, + 39729, + 39734, + 39750, + 39765, + 39771, + 39811, + 39818, + 39832, + 39838, + 39900, + 39911, + 39913, + 39914, + 39916, + 39923, + 39932, + 39976, + 39984, + 39990, + 40003, + 40011, + 40048, + 40055, + 40071, + 40106, + 40112, + 40132, + 40156, + 40157, + 40191, + 40305, + 40342, + 40370, + 40376, + 40393, + 40431, + 40463, + 40469, + 40515, + 40536, + 40542, + 40556, + 40599, + 40605, + 40611, + 40639, + 40646, + 40707, + 40718, + 40751, + 40765, + 40772, + 40774, + 40781, + 40785, + 40803, + 40806, + 40807, + 40883, + 40922, + 40939, + 41008, + 41034, + 41037, + 41071, + 41077, + 41086, + 41092, + 41110, + 41146, + 41150, + 41169, + 41180, + 41206, + 41223, + 41240, + 41269, + 41291, + 41300, + 41372, + 41376, + 41401, + 41416, + 41424, + 41446, + 41516, + 41534, + 41545, + 41579, + 41594, + 41601, + 41611, + 41680, + 41690, + 41693, + 41696, + 41700, + 41758, + 41772, + 41775, + 41792, + 41795, + 41820, + 41834, + 41842, + 41848, + 41851, + 41864, + 41872, + 41908, + 41909, + 41924, + 41949, + 41954, + 41973, + 41975, + 41980, + 41993, + 42052, + 42059, + 42083, + 42098, + 42109, + 42146, + 42171, + 42185, + 42195, + 42263, + 42272, + 42284, + 42291, + 42299, + 42376, + 42383, + 42391, + 42400, + 42425, + 42434, + 42443, + 42450, + 42491, + 42531, + 42538, + 42581, + 42583, + 42608, + 42656, + 42671, + 42702, + 42726, + 42758, + 42782, + 42787, + 42788, + 42828, + 42858, + 42876, + 42878, + 42880, + 42893, + 42922, + 42940, + 42964, + 42984, + 43014, + 43042, + 43044, + 43046, + 43075, + 43102, + 43121, + 43131, + 43150, + 43175, + 43183, + 43186, + 43188, + 43218, + 43227, + 43239, + 43240, + 43284, + 43293, + 43315, + 43353, + 43412, + 43439, + 43456, + 43460, + 43463, + 43473, + 43509, + 43523, + 43547, + 43566, + 43577, + 43578, + 43579, + 43604, + 43613, + 43634, + 43637, + 43643, + 43657, + 43666, + 43688, + 43705, + 43715, + 43762, + 43801, + 43835, + 43858, + 43866, + 43888, + 43889, + 43897, + 43926, + 43955, + 43968, + 43973, + 43987, + 44006, + 44030, + 44040, + 44042, + 44061, + 44100, + 44106, + 44122, + 44124, + 44138, + 44176, + 44192, + 44204, + 44222, + 44283, + 44326, + 44354, + 44365, + 44394, + 44414, + 44430, + 44471, + 44472, + 44496, + 44510, + 44520, + 44527, + 44555, + 44563, + 44567, + 44569, + 44602, + 44614, + 44616, + 44622, + 44633, + 44646, + 44666, + 44667, + 44676, + 44705, + 44719, + 44727, + 44730, + 44732, + 44798, + 44814, + 44844, + 44873, + 44898, + 44904, + 44924, + 44927, + 44931, + 44945, + 44951, + 44953, + 44955, + 44962, + 44973, + 44975, + 44999, + 45014, + 45028, + 45030, + 45038, + 45076, + 45078, + 45103, + 45109, + 45113, + 45114, + 45142, + 45147, + 45163, + 45164, + 45193, + 45216, + 45218, + 45244, + 45283, + 45335, + 45363, + 45400, + 45487, + 45494, + 45503, + 45526, + 45540, + 45548, + 45555, + 45570, + 45589, + 45605, + 45636, + 45663, + 45664, + 45703, + 45711, + 45727, + 45733, + 45738, + 45759, + 45769, + 45789, + 45822, + 45841, + 45903, + 45915, + 45923, + 45960, + 45975, + 45989, + 46000, + 46020, + 46027, + 46034, + 46038, + 46045, + 46049, + 46067, + 46076, + 46092, + 46096, + 46099, + 46107, + 46118, + 46126, + 46133, + 46224, + 46228, + 46233, + 46236, + 46237, + 46258, + 46264, + 46279, + 46291, + 46347, + 46357, + 46365, + 46381, + 46384, + 46397, + 46398, + 46431, + 46432, + 46442, + 46443, + 46462, + 46467, + 46480, + 46504, + 46551, + 46596, + 46603, + 46637, + 46643, + 46645, + 46647, + 46650, + 46660, + 46663, + 46665, + 46667, + 46672, + 46715, + 46720, + 46753, + 46757, + 46758, + 46761, + 46780, + 46784, + 46798, + 46805, + 46808, + 46884, + 46900, + 46905, + 46914, + 46919, + 46923, + 46928, + 46935, + 46940, + 46949, + 46952, + 46968, + 47010, + 47056, + 47113, + 47115, + 47168, + 47170, + 47177, + 47178, + 47187, + 47198, + 47206, + 47213, + 47219, + 47235, + 47250, + 47251, + 47265, + 47290, + 47304, + 47328, + 47350, + 47385, + 47388, + 47410, + 47416, + 47428, + 47441, + 47449, + 47450, + 47454, + 47456, + 47467, + 47468, + 47482, + 47516, + 47526, + 47533, + 47534, + 47598, + 47600, + 47605, + 47619, + 47624, + 47625, + 47636, + 47640, + 47649, + 47658, + 47660, + 47669, + 47670, + 47685, + 47703, + 47731, + 47740, + 47780, + 47802, + 47809, + 47812, + 47836, + 47844, + 47853, + 47860, + 47874, + 47898, + 47906, + 47910, + 47911, + 47914, + 47952, + 47954, + 47959, + 47974, + 47976, + 47999, + 48020, + 48059, + 48071, + 48108, + 48113, + 48123, + 48150, + 48159, + 48170, + 48171, + 48180, + 48188, + 48191, + 48200, + 48209, + 48225, + 48244, + 48261, + 48269, + 48283, + 48300, + 48308, + 48312, + 48340, + 48398, + 48410, + 48433, + 48437, + 48441, + 48447, + 48452, + 48472, + 48485, + 48533, + 48548, + 48555, + 48563, + 48580, + 48628, + 48649, + 48682, + 48733, + 48754, + 48755, + 48762, + 48768, + 48774, + 48779, + 48818, + 48821, + 48865, + 48866, + 48901, + 48914, + 48917, + 48933, + 48948, + 48953, + 48963, + 49031, + 49064, + 49090, + 49104, + 49107, + 49140, + 49145, + 49167, + 49179, + 49181, + 49190, + 49214, + 49252, + 49261, + 49304, + 49313, + 49374, + 49386, + 49398, + 49399, + 49419, + 49445, + 49473, + 49476, + 49486, + 49538, + 49554, + 49607, + 49621, + 49624, + 49636, + 49640, + 49656, + 49674, + 49688, + 49705, + 49722, + 49750, + 49770, + 49773, + 49784, + 49788, + 49810, + 49866, + 49870, + 49895, + 49901, + 49913, + 49916, + 49949, + 49998, + 50013, + 50014, + 50022, + 50046, + 50051, + 50058, + 50069, + 50072, + 50074, + 50086, + 50103, + 50142, + 50145, + 50186, + 50210, + 50214, + 50216, + 50225, + 50265, + 50282, + 50289, + 50384, + 50407, + 50421, + 50430, + 50484, + 50492, + 50513, + 50518, + 50522, + 50547, + 50616, + 50636, + 50646, + 50655, + 50658, + 50660, + 50673, + 50682, + 50761, + 50780, + 50791, + 50809, + 50818, + 50874, + 50884, + 50903, + 50908, + 50925, + 50936, + 50938, + 50939, + 50949, + 50956, + 50984, + 51029, + 51069, + 51117, + 51125, + 51142, + 51176, + 51179, + 51188, + 51202, + 51235, + 51238, + 51239, + 51245, + 51263, + 51274, + 51285, + 51297, + 51299, + 51308, + 51348, + 51367, + 51384, + 51393, + 51405, + 51406, + 51486, + 51499, + 51500, + 51534, + 51544, + 51569, + 51580, + 51601, + 51602, + 51606, + 51666, + 51676, + 51681, + 51694, + 51710, + 51728, + 51755, + 51773, + 51790, + 51839, + 51840, + 51870, + 51875, + 51891, + 51904, + 51907, + 51937, + 51986, + 51990, + 52023, + 52026, + 52056, + 52070, + 52107, + 52112, + 52116, + 52138, + 52151, + 52221, + 52229, + 52264, + 52270, + 52295, + 52318, + 52329, + 52330, + 52338, + 52350, + 52352, + 52422, + 52423, + 52449, + 52470, + 52492, + 52494, + 52536, + 52544, + 52595, + 52598, + 52617, + 52640, + 52643, + 52685, + 52701, + 52739, + 52759, + 52801, + 52837, + 52840, + 52849, + 52856, + 52868, + 52885, + 52894, + 52941, + 52961, + 53005, + 53012, + 53029, + 53043, + 53047, + 53083, + 53088, + 53091, + 53093, + 53100, + 53123, + 53131, + 53168, + 53169, + 53182 + ], + "train_query_candidate_episode_ids": [ + 0, + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 125, + 126, + 127, + 128, + 129, + 130, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 151, + 152, + 153, + 154, + 155, + 156, + 158, + 159, + 160, + 161, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 269, + 270, + 271, + 272, + 273, + 274, + 278, + 279, + 280, + 281, + 282, + 283, + 285, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 363, + 364, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 432, + 433, + 434, + 435, + 436, + 437, + 439, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 500, + 501, + 502, + 504, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 555, + 556, + 557, + 558, + 559, + 560, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 594, + 595, + 596, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 615, + 616, + 617, + 619, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 632, + 634, + 635, + 636, + 637, + 638, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 648, + 649, + 650, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 670, + 672, + 673, + 674, + 675, + 676, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 718, + 719, + 720, + 722, + 723, + 724, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 792, + 793, + 794, + 795, + 796, + 799, + 800, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 863, + 864, + 865, + 866, + 867, + 868, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 908, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1041, + 1042, + 1043, + 1044, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1103, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1133, + 1134, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1165, + 1167, + 1168, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1258, + 1259, + 1261, + 1263, + 1264, + 1265, + 1266, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1324, + 1325, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1338, + 1339, + 1340, + 1341, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1399, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1421, + 1422, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1438, + 1439, + 1440, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1548, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1626, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1861, + 1862, + 1863, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1894, + 1895, + 1896, + 1897, + 1898, + 1900, + 1901, + 1902, + 1903, + 1904, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2094, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2152, + 2153, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2210, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2239, + 2240, + 2241, + 2242, + 2243, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2284, + 2285, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2304, + 2305, + 2306, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2392, + 2393, + 2394, + 2395, + 2396, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2413, + 2414, + 2415, + 2416, + 2417, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2428, + 2430, + 2431, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2463, + 2464, + 2465, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2500, + 2501, + 2502, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2521, + 2523, + 2524, + 2525, + 2526, + 2527, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2546, + 2547, + 2549, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2590, + 2591, + 2592, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2676, + 2677, + 2678, + 2679, + 2680, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2730, + 2731, + 2732, + 2733, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 2858, + 2859, + 2860, + 2861, + 2862, + 2863, + 2864, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2981, + 2983, + 2984, + 2985, + 2986, + 2987, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 3045, + 3046, + 3047, + 3048, + 3049, + 3050, + 3052, + 3053, + 3054, + 3055, + 3056, + 3057, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 3066, + 3067, + 3068, + 3069, + 3070, + 3071, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3082, + 3083, + 3084, + 3085, + 3086, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 3142, + 3143, + 3144, + 3145, + 3146, + 3147, + 3148, + 3149, + 3150, + 3151, + 3152, + 3153, + 3154, + 3155, + 3156, + 3157, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 3164, + 3165, + 3166, + 3167, + 3168, + 3169, + 3171, + 3173, + 3174, + 3175, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 3365, + 3366, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417, + 3418, + 3419, + 3420, + 3422, + 3423, + 3424, + 3425, + 3426, + 3427, + 3428, + 3429, + 3430, + 3431, + 3432, + 3436, + 3438, + 3439, + 3440, + 3441, + 3442, + 3443, + 3444, + 3445, + 3446, + 3447, + 3448, + 3449, + 3450, + 3452, + 3453, + 3454, + 3455, + 3456, + 3457, + 3458, + 3459, + 3460, + 3461, + 3462, + 3463, + 3464, + 3465, + 3466, + 3467, + 3468, + 3469, + 3470, + 3472, + 3473, + 3474, + 3475, + 3476, + 3477, + 3478, + 3479, + 3480, + 3481, + 3482, + 3483, + 3484, + 3485, + 3486, + 3487, + 3488, + 3489, + 3490, + 3491, + 3492, + 3493, + 3494, + 3495, + 3496, + 3497, + 3498, + 3499, + 3500, + 3501, + 3502, + 3503, + 3504, + 3505, + 3506, + 3507, + 3508, + 3509, + 3510, + 3511, + 3512, + 3513, + 3514, + 3515, + 3516, + 3517, + 3519, + 3520, + 3521, + 3522, + 3523, + 3524, + 3525, + 3526, + 3527, + 3528, + 3529, + 3530, + 3531, + 3532, + 3533, + 3534, + 3535, + 3536, + 3537, + 3538, + 3539, + 3540, + 3541, + 3542, + 3543, + 3544, + 3545, + 3546, + 3547, + 3548, + 3550, + 3551, + 3552, + 3553, + 3554, + 3555, + 3556, + 3557, + 3558, + 3559, + 3560, + 3561, + 3562, + 3564, + 3565, + 3567, + 3568, + 3569, + 3570, + 3571, + 3572, + 3573, + 3574, + 3575, + 3576, + 3577, + 3579, + 3580, + 3581, + 3582, + 3584, + 3587, + 3588, + 3589, + 3590, + 3591, + 3592, + 3593, + 3594, + 3595, + 3596, + 3597, + 3598, + 3600, + 3601, + 3602, + 3603, + 3604, + 3605, + 3606, + 3607, + 3608, + 3609, + 3610, + 3612, + 3613, + 3615, + 3616, + 3618, + 3619, + 3620, + 3621, + 3622, + 3623, + 3624, + 3625, + 3626, + 3627, + 3628, + 3629, + 3630, + 3631, + 3632, + 3633, + 3634, + 3635, + 3636, + 3637, + 3638, + 3639, + 3640, + 3641, + 3642, + 3643, + 3645, + 3646, + 3647, + 3648, + 3649, + 3650, + 3652, + 3653, + 3654, + 3655, + 3656, + 3657, + 3658, + 3659, + 3661, + 3663, + 3664, + 3665, + 3666, + 3667, + 3668, + 3669, + 3670, + 3671, + 3672, + 3674, + 3675, + 3677, + 3678, + 3679, + 3680, + 3681, + 3682, + 3683, + 3684, + 3685, + 3686, + 3687, + 3688, + 3689, + 3690, + 3692, + 3693, + 3694, + 3695, + 3696, + 3697, + 3698, + 3699, + 3700, + 3701, + 3702, + 3703, + 3704, + 3705, + 3706, + 3707, + 3708, + 3709, + 3710, + 3711, + 3712, + 3713, + 3714, + 3715, + 3716, + 3717, + 3718, + 3719, + 3720, + 3721, + 3722, + 3723, + 3724, + 3725, + 3726, + 3727, + 3728, + 3729, + 3730, + 3731, + 3732, + 3733, + 3734, + 3735, + 3736, + 3737, + 3738, + 3739, + 3740, + 3741, + 3742, + 3743, + 3744, + 3745, + 3746, + 3747, + 3748, + 3749, + 3750, + 3751, + 3752, + 3753, + 3754, + 3755, + 3756, + 3757, + 3759, + 3760, + 3761, + 3762, + 3763, + 3764, + 3765, + 3766, + 3767, + 3768, + 3769, + 3770, + 3771, + 3773, + 3775, + 3776, + 3777, + 3778, + 3779, + 3780, + 3781, + 3782, + 3783, + 3784, + 3785, + 3787, + 3788, + 3789, + 3790, + 3791, + 3792, + 3793, + 3794, + 3795, + 3796, + 3797, + 3798, + 3799, + 3801, + 3802, + 3803, + 3804, + 3805, + 3806, + 3807, + 3808, + 3809, + 3810, + 3811, + 3812, + 3813, + 3815, + 3817, + 3818, + 3820, + 3821, + 3822, + 3823, + 3824, + 3825, + 3827, + 3828, + 3829, + 3830, + 3831, + 3832, + 3834, + 3835, + 3836, + 3837, + 3838, + 3839, + 3840, + 3841, + 3842, + 3843, + 3844, + 3846, + 3847, + 3848, + 3849, + 3850, + 3851, + 3852, + 3853, + 3854, + 3855, + 3856, + 3857, + 3858, + 3859, + 3860, + 3861, + 3862, + 3863, + 3864, + 3865, + 3866, + 3867, + 3868, + 3870, + 3871, + 3872, + 3874, + 3875, + 3876, + 3877, + 3878, + 3879, + 3880, + 3881, + 3882, + 3883, + 3884, + 3885, + 3886, + 3887, + 3888, + 3890, + 3891, + 3892, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3899, + 3900, + 3901, + 3902, + 3903, + 3904, + 3905, + 3906, + 3907, + 3908, + 3909, + 3910, + 3911, + 3912, + 3913, + 3914, + 3915, + 3916, + 3917, + 3918, + 3919, + 3920, + 3922, + 3923, + 3924, + 3925, + 3926, + 3927, + 3928, + 3929, + 3930, + 3931, + 3932, + 3933, + 3934, + 3935, + 3936, + 3937, + 3938, + 3939, + 3941, + 3942, + 3943, + 3944, + 3945, + 3946, + 3947, + 3948, + 3949, + 3950, + 3951, + 3952, + 3953, + 3954, + 3955, + 3956, + 3957, + 3958, + 3960, + 3961, + 3962, + 3963, + 3964, + 3965, + 3966, + 3967, + 3968, + 3969, + 3970, + 3971, + 3972, + 3973, + 3974, + 3975, + 3976, + 3977, + 3978, + 3979, + 3980, + 3981, + 3982, + 3983, + 3984, + 3985, + 3986, + 3988, + 3989, + 3990, + 3991, + 3992, + 3993, + 3994, + 3995, + 3997, + 3998, + 3999, + 4000, + 4001, + 4002, + 4003, + 4004, + 4005, + 4006, + 4007, + 4008, + 4009, + 4010, + 4011, + 4012, + 4013, + 4014, + 4015, + 4016, + 4017, + 4018, + 4020, + 4021, + 4022, + 4023, + 4025, + 4026, + 4027, + 4029, + 4030, + 4031, + 4032, + 4033, + 4034, + 4035, + 4036, + 4037, + 4038, + 4040, + 4041, + 4043, + 4044, + 4045, + 4046, + 4047, + 4048, + 4049, + 4050, + 4051, + 4052, + 4053, + 4054, + 4055, + 4056, + 4057, + 4058, + 4059, + 4060, + 4061, + 4062, + 4063, + 4064, + 4065, + 4067, + 4068, + 4069, + 4070, + 4071, + 4072, + 4073, + 4074, + 4075, + 4076, + 4077, + 4078, + 4079, + 4080, + 4081, + 4082, + 4083, + 4084, + 4085, + 4086, + 4087, + 4088, + 4089, + 4090, + 4091, + 4092, + 4093, + 4094, + 4095, + 4096, + 4097, + 4098, + 4099, + 4100, + 4101, + 4102, + 4103, + 4104, + 4105, + 4106, + 4107, + 4108, + 4109, + 4110, + 4111, + 4112, + 4113, + 4114, + 4115, + 4116, + 4117, + 4118, + 4119, + 4120, + 4121, + 4122, + 4123, + 4124, + 4125, + 4126, + 4127, + 4129, + 4130, + 4131, + 4132, + 4133, + 4134, + 4135, + 4137, + 4138, + 4140, + 4142, + 4143, + 4144, + 4145, + 4146, + 4147, + 4148, + 4149, + 4150, + 4151, + 4152, + 4153, + 4154, + 4155, + 4156, + 4158, + 4159, + 4160, + 4161, + 4162, + 4163, + 4164, + 4165, + 4166, + 4167, + 4168, + 4169, + 4172, + 4173, + 4175, + 4176, + 4177, + 4178, + 4179, + 4181, + 4182, + 4183, + 4184, + 4185, + 4186, + 4187, + 4188, + 4191, + 4192, + 4193, + 4194, + 4195, + 4197, + 4199, + 4200, + 4201, + 4202, + 4203, + 4204, + 4205, + 4206, + 4207, + 4208, + 4209, + 4210, + 4211, + 4213, + 4214, + 4215, + 4216, + 4217, + 4218, + 4219, + 4220, + 4221, + 4222, + 4223, + 4224, + 4225, + 4226, + 4227, + 4228, + 4229, + 4230, + 4231, + 4232, + 4233, + 4234, + 4235, + 4236, + 4237, + 4238, + 4239, + 4240, + 4241, + 4242, + 4243, + 4244, + 4245, + 4247, + 4248, + 4249, + 4250, + 4251, + 4252, + 4253, + 4255, + 4256, + 4257, + 4258, + 4259, + 4260, + 4261, + 4262, + 4265, + 4266, + 4267, + 4268, + 4270, + 4271, + 4272, + 4273, + 4274, + 4275, + 4276, + 4277, + 4278, + 4279, + 4280, + 4281, + 4282, + 4283, + 4284, + 4285, + 4286, + 4287, + 4288, + 4289, + 4290, + 4291, + 4292, + 4293, + 4294, + 4295, + 4296, + 4297, + 4298, + 4300, + 4301, + 4302, + 4303, + 4304, + 4305, + 4306, + 4308, + 4309, + 4310, + 4311, + 4312, + 4313, + 4315, + 4316, + 4317, + 4318, + 4319, + 4320, + 4321, + 4322, + 4325, + 4326, + 4328, + 4329, + 4331, + 4332, + 4333, + 4335, + 4336, + 4337, + 4338, + 4339, + 4340, + 4341, + 4342, + 4343, + 4344, + 4345, + 4346, + 4347, + 4348, + 4349, + 4350, + 4351, + 4352, + 4353, + 4354, + 4355, + 4356, + 4357, + 4358, + 4359, + 4360, + 4361, + 4362, + 4363, + 4364, + 4365, + 4366, + 4367, + 4368, + 4369, + 4370, + 4371, + 4372, + 4373, + 4374, + 4375, + 4376, + 4377, + 4378, + 4379, + 4380, + 4381, + 4382, + 4383, + 4384, + 4385, + 4386, + 4387, + 4388, + 4389, + 4390, + 4391, + 4392, + 4393, + 4394, + 4395, + 4396, + 4397, + 4398, + 4400, + 4401, + 4402, + 4403, + 4404, + 4405, + 4406, + 4407, + 4408, + 4409, + 4410, + 4411, + 4413, + 4414, + 4415, + 4416, + 4417, + 4418, + 4419, + 4420, + 4421, + 4422, + 4423, + 4424, + 4425, + 4426, + 4428, + 4429, + 4430, + 4431, + 4432, + 4433, + 4434, + 4435, + 4436, + 4437, + 4438, + 4439, + 4440, + 4441, + 4442, + 4443, + 4444, + 4445, + 4446, + 4447, + 4448, + 4449, + 4450, + 4451, + 4452, + 4453, + 4455, + 4456, + 4458, + 4460, + 4461, + 4462, + 4463, + 4464, + 4465, + 4466, + 4467, + 4468, + 4469, + 4470, + 4471, + 4472, + 4473, + 4474, + 4475, + 4476, + 4477, + 4478, + 4479, + 4480, + 4481, + 4482, + 4483, + 4484, + 4485, + 4486, + 4487, + 4488, + 4489, + 4490, + 4491, + 4492, + 4494, + 4496, + 4497, + 4498, + 4499, + 4500, + 4501, + 4502, + 4503, + 4504, + 4505, + 4506, + 4507, + 4508, + 4509, + 4511, + 4512, + 4513, + 4514, + 4515, + 4516, + 4518, + 4519, + 4520, + 4521, + 4522, + 4523, + 4524, + 4525, + 4526, + 4527, + 4528, + 4529, + 4530, + 4531, + 4532, + 4533, + 4534, + 4535, + 4536, + 4537, + 4538, + 4539, + 4540, + 4541, + 4542, + 4543, + 4545, + 4546, + 4547, + 4549, + 4550, + 4551, + 4552, + 4553, + 4554, + 4555, + 4556, + 4557, + 4558, + 4559, + 4560, + 4561, + 4562, + 4563, + 4564, + 4566, + 4567, + 4568, + 4569, + 4571, + 4572, + 4573, + 4574, + 4575, + 4576, + 4577, + 4578, + 4579, + 4580, + 4581, + 4583, + 4584, + 4585, + 4586, + 4587, + 4588, + 4589, + 4590, + 4591, + 4592, + 4593, + 4594, + 4595, + 4596, + 4597, + 4598, + 4600, + 4601, + 4602, + 4605, + 4606, + 4607, + 4608, + 4609, + 4611, + 4612, + 4613, + 4614, + 4615, + 4616, + 4617, + 4618, + 4619, + 4620, + 4621, + 4622, + 4623, + 4624, + 4625, + 4626, + 4627, + 4629, + 4630, + 4631, + 4632, + 4634, + 4635, + 4636, + 4637, + 4638, + 4639, + 4640, + 4641, + 4642, + 4643, + 4644, + 4645, + 4646, + 4647, + 4648, + 4649, + 4650, + 4651, + 4652, + 4653, + 4654, + 4655, + 4656, + 4657, + 4658, + 4660, + 4661, + 4662, + 4663, + 4664, + 4665, + 4666, + 4667, + 4668, + 4669, + 4670, + 4671, + 4672, + 4673, + 4674, + 4675, + 4676, + 4678, + 4679, + 4680, + 4682, + 4683, + 4684, + 4685, + 4686, + 4687, + 4688, + 4689, + 4690, + 4691, + 4692, + 4693, + 4694, + 4695, + 4696, + 4697, + 4698, + 4700, + 4701, + 4702, + 4703, + 4704, + 4705, + 4707, + 4708, + 4709, + 4710, + 4711, + 4712, + 4713, + 4714, + 4716, + 4717, + 4718, + 4719, + 4720, + 4721, + 4722, + 4723, + 4724, + 4725, + 4726, + 4727, + 4728, + 4729, + 4730, + 4732, + 4733, + 4734, + 4735, + 4736, + 4737, + 4738, + 4739, + 4740, + 4741, + 4742, + 4743, + 4746, + 4747, + 4748, + 4749, + 4750, + 4751, + 4752, + 4753, + 4754, + 4755, + 4756, + 4757, + 4758, + 4759, + 4760, + 4761, + 4762, + 4764, + 4765, + 4766, + 4767, + 4768, + 4769, + 4770, + 4771, + 4772, + 4773, + 4774, + 4775, + 4776, + 4777, + 4778, + 4779, + 4780, + 4781, + 4782, + 4783, + 4784, + 4785, + 4786, + 4787, + 4788, + 4789, + 4790, + 4791, + 4792, + 4793, + 4794, + 4795, + 4796, + 4797, + 4798, + 4799, + 4800, + 4801, + 4802, + 4803, + 4804, + 4805, + 4806, + 4807, + 4808, + 4809, + 4810, + 4811, + 4812, + 4813, + 4814, + 4815, + 4816, + 4817, + 4818, + 4819, + 4820, + 4821, + 4822, + 4823, + 4824, + 4825, + 4826, + 4827, + 4828, + 4829, + 4830, + 4831, + 4833, + 4834, + 4836, + 4837, + 4838, + 4839, + 4840, + 4841, + 4842, + 4843, + 4844, + 4845, + 4846, + 4847, + 4848, + 4849, + 4850, + 4851, + 4852, + 4853, + 4854, + 4855, + 4856, + 4857, + 4858, + 4859, + 4860, + 4861, + 4862, + 4863, + 4864, + 4865, + 4866, + 4867, + 4868, + 4869, + 4870, + 4871, + 4872, + 4873, + 4874, + 4876, + 4877, + 4878, + 4879, + 4880, + 4881, + 4882, + 4883, + 4884, + 4885, + 4886, + 4887, + 4888, + 4889, + 4890, + 4891, + 4892, + 4893, + 4895, + 4896, + 4897, + 4899, + 4901, + 4902, + 4903, + 4904, + 4905, + 4906, + 4907, + 4908, + 4909, + 4910, + 4911, + 4912, + 4913, + 4914, + 4915, + 4916, + 4917, + 4918, + 4919, + 4920, + 4921, + 4922, + 4923, + 4924, + 4925, + 4926, + 4927, + 4928, + 4929, + 4930, + 4931, + 4932, + 4933, + 4934, + 4935, + 4936, + 4937, + 4938, + 4939, + 4940, + 4941, + 4942, + 4943, + 4945, + 4946, + 4947, + 4948, + 4949, + 4950, + 4952, + 4953, + 4954, + 4955, + 4956, + 4957, + 4958, + 4959, + 4960, + 4961, + 4962, + 4963, + 4964, + 4965, + 4967, + 4968, + 4969, + 4970, + 4971, + 4973, + 4974, + 4975, + 4976, + 4977, + 4978, + 4979, + 4980, + 4981, + 4982, + 4983, + 4984, + 4985, + 4986, + 4987, + 4988, + 4989, + 4990, + 4991, + 4992, + 4993, + 4995, + 4996, + 4997, + 4998, + 4999, + 5000, + 5001, + 5002, + 5003, + 5004, + 5005, + 5006, + 5007, + 5008, + 5009, + 5010, + 5011, + 5012, + 5013, + 5014, + 5015, + 5016, + 5017, + 5018, + 5019, + 5020, + 5021, + 5022, + 5023, + 5024, + 5026, + 5027, + 5028, + 5029, + 5030, + 5031, + 5032, + 5033, + 5035, + 5037, + 5038, + 5039, + 5040, + 5041, + 5042, + 5043, + 5044, + 5045, + 5046, + 5048, + 5049, + 5050, + 5051, + 5052, + 5053, + 5054, + 5055, + 5056, + 5057, + 5058, + 5059, + 5060, + 5062, + 5063, + 5064, + 5065, + 5066, + 5068, + 5069, + 5070, + 5071, + 5072, + 5073, + 5074, + 5075, + 5076, + 5077, + 5078, + 5079, + 5080, + 5082, + 5083, + 5084, + 5085, + 5086, + 5087, + 5088, + 5089, + 5090, + 5091, + 5092, + 5094, + 5095, + 5096, + 5097, + 5098, + 5099, + 5100, + 5101, + 5102, + 5103, + 5104, + 5105, + 5106, + 5107, + 5108, + 5109, + 5110, + 5111, + 5112, + 5113, + 5115, + 5116, + 5117, + 5118, + 5119, + 5120, + 5121, + 5122, + 5123, + 5124, + 5125, + 5127, + 5128, + 5130, + 5131, + 5132, + 5133, + 5134, + 5135, + 5136, + 5137, + 5139, + 5140, + 5142, + 5143, + 5145, + 5146, + 5147, + 5148, + 5149, + 5150, + 5151, + 5152, + 5153, + 5154, + 5155, + 5158, + 5159, + 5160, + 5161, + 5162, + 5163, + 5164, + 5165, + 5166, + 5167, + 5169, + 5170, + 5171, + 5172, + 5173, + 5174, + 5175, + 5176, + 5177, + 5178, + 5179, + 5180, + 5181, + 5182, + 5183, + 5184, + 5185, + 5186, + 5187, + 5188, + 5189, + 5190, + 5191, + 5192, + 5193, + 5194, + 5195, + 5196, + 5197, + 5198, + 5199, + 5200, + 5201, + 5202, + 5203, + 5204, + 5205, + 5206, + 5207, + 5208, + 5209, + 5210, + 5211, + 5213, + 5215, + 5216, + 5217, + 5218, + 5219, + 5220, + 5221, + 5222, + 5223, + 5224, + 5225, + 5226, + 5227, + 5228, + 5229, + 5230, + 5231, + 5232, + 5233, + 5234, + 5235, + 5237, + 5238, + 5239, + 5240, + 5241, + 5242, + 5243, + 5244, + 5245, + 5246, + 5247, + 5248, + 5250, + 5251, + 5252, + 5253, + 5254, + 5255, + 5256, + 5257, + 5258, + 5259, + 5260, + 5262, + 5263, + 5264, + 5265, + 5266, + 5267, + 5268, + 5269, + 5270, + 5271, + 5272, + 5273, + 5274, + 5275, + 5276, + 5277, + 5278, + 5279, + 5280, + 5281, + 5282, + 5283, + 5284, + 5285, + 5286, + 5288, + 5289, + 5290, + 5291, + 5292, + 5293, + 5295, + 5296, + 5297, + 5298, + 5299, + 5300, + 5302, + 5303, + 5304, + 5305, + 5306, + 5307, + 5308, + 5309, + 5310, + 5311, + 5312, + 5314, + 5316, + 5317, + 5318, + 5319, + 5321, + 5322, + 5323, + 5324, + 5325, + 5326, + 5327, + 5328, + 5329, + 5330, + 5331, + 5332, + 5333, + 5335, + 5336, + 5337, + 5338, + 5339, + 5340, + 5341, + 5342, + 5343, + 5344, + 5345, + 5346, + 5347, + 5348, + 5349, + 5350, + 5351, + 5353, + 5354, + 5355, + 5356, + 5358, + 5359, + 5360, + 5362, + 5363, + 5365, + 5366, + 5367, + 5368, + 5370, + 5372, + 5373, + 5374, + 5376, + 5377, + 5378, + 5379, + 5380, + 5381, + 5382, + 5383, + 5384, + 5385, + 5387, + 5388, + 5389, + 5390, + 5391, + 5392, + 5393, + 5394, + 5395, + 5396, + 5397, + 5398, + 5399, + 5400, + 5401, + 5402, + 5403, + 5404, + 5405, + 5406, + 5407, + 5408, + 5409, + 5410, + 5411, + 5412, + 5413, + 5414, + 5415, + 5416, + 5417, + 5419, + 5421, + 5422, + 5423, + 5425, + 5426, + 5427, + 5428, + 5429, + 5430, + 5431, + 5432, + 5433, + 5434, + 5435, + 5436, + 5437, + 5438, + 5439, + 5440, + 5441, + 5442, + 5443, + 5444, + 5445, + 5446, + 5447, + 5448, + 5450, + 5451, + 5452, + 5453, + 5454, + 5455, + 5457, + 5458, + 5459, + 5460, + 5461, + 5462, + 5463, + 5464, + 5465, + 5466, + 5467, + 5468, + 5469, + 5470, + 5471, + 5472, + 5473, + 5474, + 5476, + 5477, + 5479, + 5480, + 5481, + 5482, + 5484, + 5485, + 5486, + 5487, + 5488, + 5489, + 5490, + 5491, + 5492, + 5493, + 5494, + 5495, + 5496, + 5497, + 5498, + 5499, + 5500, + 5501, + 5502, + 5503, + 5504, + 5505, + 5506, + 5507, + 5508, + 5509, + 5510, + 5511, + 5512, + 5514, + 5515, + 5516, + 5517, + 5518, + 5519, + 5520, + 5521, + 5522, + 5523, + 5524, + 5525, + 5526, + 5527, + 5528, + 5529, + 5530, + 5531, + 5532, + 5533, + 5534, + 5535, + 5536, + 5537, + 5538, + 5539, + 5540, + 5541, + 5542, + 5543, + 5544, + 5545, + 5546, + 5547, + 5548, + 5549, + 5550, + 5551, + 5552, + 5553, + 5554, + 5555, + 5556, + 5557, + 5558, + 5559, + 5560, + 5561, + 5562, + 5563, + 5564, + 5565, + 5566, + 5567, + 5568, + 5569, + 5570, + 5571, + 5572, + 5573, + 5574, + 5575, + 5576, + 5577, + 5578, + 5579, + 5580, + 5581, + 5582, + 5584, + 5585, + 5586, + 5587, + 5588, + 5590, + 5591, + 5592, + 5593, + 5594, + 5597, + 5598, + 5599, + 5600, + 5601, + 5602, + 5603, + 5604, + 5605, + 5606, + 5608, + 5610, + 5611, + 5612, + 5613, + 5614, + 5615, + 5617, + 5618, + 5619, + 5620, + 5621, + 5622, + 5623, + 5624, + 5625, + 5626, + 5627, + 5628, + 5629, + 5630, + 5631, + 5632, + 5633, + 5634, + 5635, + 5636, + 5637, + 5638, + 5639, + 5640, + 5642, + 5643, + 5644, + 5645, + 5646, + 5647, + 5648, + 5649, + 5650, + 5651, + 5652, + 5653, + 5655, + 5658, + 5659, + 5660, + 5661, + 5662, + 5663, + 5665, + 5667, + 5668, + 5669, + 5670, + 5671, + 5672, + 5673, + 5674, + 5675, + 5676, + 5677, + 5678, + 5679, + 5680, + 5681, + 5682, + 5683, + 5684, + 5685, + 5686, + 5688, + 5689, + 5691, + 5692, + 5693, + 5694, + 5695, + 5696, + 5697, + 5698, + 5699, + 5700, + 5701, + 5702, + 5703, + 5704, + 5705, + 5706, + 5707, + 5708, + 5709, + 5710, + 5711, + 5712, + 5714, + 5716, + 5717, + 5718, + 5719, + 5720, + 5721, + 5722, + 5723, + 5724, + 5725, + 5726, + 5728, + 5729, + 5731, + 5732, + 5733, + 5734, + 5735, + 5736, + 5737, + 5738, + 5739, + 5740, + 5741, + 5742, + 5743, + 5744, + 5745, + 5746, + 5747, + 5748, + 5749, + 5750, + 5751, + 5752, + 5753, + 5754, + 5755, + 5756, + 5757, + 5758, + 5759, + 5760, + 5762, + 5763, + 5764, + 5765, + 5767, + 5768, + 5770, + 5771, + 5772, + 5773, + 5774, + 5775, + 5776, + 5777, + 5778, + 5779, + 5780, + 5781, + 5782, + 5783, + 5784, + 5785, + 5786, + 5787, + 5788, + 5790, + 5791, + 5792, + 5793, + 5794, + 5795, + 5796, + 5797, + 5798, + 5799, + 5800, + 5801, + 5802, + 5803, + 5804, + 5806, + 5807, + 5808, + 5809, + 5810, + 5811, + 5812, + 5814, + 5815, + 5816, + 5817, + 5818, + 5819, + 5820, + 5821, + 5822, + 5823, + 5824, + 5825, + 5826, + 5827, + 5828, + 5829, + 5831, + 5832, + 5833, + 5834, + 5835, + 5836, + 5838, + 5839, + 5840, + 5841, + 5842, + 5843, + 5844, + 5845, + 5846, + 5847, + 5848, + 5849, + 5850, + 5851, + 5852, + 5853, + 5854, + 5855, + 5856, + 5857, + 5858, + 5859, + 5861, + 5862, + 5863, + 5864, + 5865, + 5867, + 5868, + 5869, + 5870, + 5871, + 5872, + 5873, + 5874, + 5876, + 5877, + 5878, + 5879, + 5880, + 5881, + 5882, + 5883, + 5884, + 5885, + 5886, + 5888, + 5889, + 5890, + 5891, + 5892, + 5893, + 5894, + 5895, + 5897, + 5898, + 5899, + 5900, + 5901, + 5902, + 5903, + 5904, + 5905, + 5906, + 5907, + 5908, + 5909, + 5910, + 5911, + 5912, + 5913, + 5914, + 5915, + 5916, + 5917, + 5918, + 5920, + 5921, + 5922, + 5923, + 5924, + 5925, + 5926, + 5927, + 5928, + 5929, + 5931, + 5932, + 5933, + 5934, + 5935, + 5936, + 5937, + 5938, + 5939, + 5940, + 5942, + 5944, + 5945, + 5946, + 5947, + 5948, + 5949, + 5950, + 5951, + 5952, + 5953, + 5954, + 5955, + 5956, + 5957, + 5959, + 5960, + 5961, + 5962, + 5963, + 5964, + 5965, + 5966, + 5967, + 5968, + 5969, + 5970, + 5971, + 5972, + 5973, + 5974, + 5975, + 5976, + 5977, + 5978, + 5979, + 5980, + 5981, + 5982, + 5983, + 5984, + 5985, + 5986, + 5987, + 5988, + 5989, + 5992, + 5993, + 5994, + 5995, + 5996, + 5997, + 5998, + 5999, + 6000, + 6001, + 6002, + 6003, + 6004, + 6006, + 6007, + 6008, + 6009, + 6010, + 6011, + 6012, + 6013, + 6014, + 6015, + 6016, + 6017, + 6018, + 6019, + 6020, + 6022, + 6023, + 6024, + 6025, + 6027, + 6028, + 6029, + 6030, + 6031, + 6032, + 6033, + 6034, + 6035, + 6036, + 6037, + 6038, + 6040, + 6041, + 6042, + 6043, + 6044, + 6045, + 6047, + 6048, + 6049, + 6050, + 6051, + 6052, + 6054, + 6055, + 6056, + 6057, + 6058, + 6059, + 6060, + 6061, + 6062, + 6063, + 6064, + 6065, + 6066, + 6067, + 6068, + 6069, + 6070, + 6071, + 6073, + 6074, + 6075, + 6076, + 6077, + 6078, + 6080, + 6081, + 6082, + 6083, + 6084, + 6085, + 6086, + 6087, + 6088, + 6090, + 6091, + 6092, + 6093, + 6094, + 6095, + 6096, + 6097, + 6098, + 6099, + 6100, + 6101, + 6102, + 6103, + 6104, + 6105, + 6106, + 6107, + 6108, + 6109, + 6110, + 6111, + 6112, + 6114, + 6115, + 6116, + 6117, + 6118, + 6119, + 6120, + 6121, + 6122, + 6123, + 6124, + 6125, + 6126, + 6127, + 6128, + 6129, + 6130, + 6131, + 6132, + 6133, + 6135, + 6136, + 6137, + 6138, + 6139, + 6140, + 6141, + 6142, + 6143, + 6144, + 6145, + 6146, + 6148, + 6149, + 6150, + 6151, + 6152, + 6153, + 6154, + 6156, + 6157, + 6158, + 6159, + 6160, + 6161, + 6162, + 6163, + 6164, + 6165, + 6166, + 6167, + 6169, + 6170, + 6171, + 6172, + 6173, + 6174, + 6175, + 6176, + 6177, + 6178, + 6179, + 6180, + 6181, + 6182, + 6183, + 6184, + 6185, + 6186, + 6188, + 6189, + 6190, + 6192, + 6193, + 6194, + 6195, + 6196, + 6198, + 6199, + 6200, + 6201, + 6202, + 6203, + 6204, + 6205, + 6206, + 6207, + 6209, + 6210, + 6211, + 6212, + 6213, + 6214, + 6215, + 6216, + 6218, + 6219, + 6221, + 6222, + 6223, + 6224, + 6225, + 6226, + 6227, + 6228, + 6229, + 6231, + 6232, + 6233, + 6234, + 6235, + 6236, + 6237, + 6238, + 6239, + 6240, + 6241, + 6242, + 6243, + 6244, + 6246, + 6247, + 6248, + 6249, + 6250, + 6252, + 6253, + 6254, + 6255, + 6256, + 6257, + 6258, + 6259, + 6260, + 6261, + 6262, + 6263, + 6264, + 6265, + 6266, + 6267, + 6268, + 6269, + 6270, + 6271, + 6272, + 6274, + 6275, + 6277, + 6278, + 6279, + 6280, + 6281, + 6282, + 6283, + 6284, + 6285, + 6286, + 6287, + 6288, + 6289, + 6290, + 6291, + 6292, + 6293, + 6294, + 6295, + 6297, + 6299, + 6300, + 6301, + 6302, + 6303, + 6304, + 6306, + 6307, + 6308, + 6309, + 6310, + 6311, + 6312, + 6313, + 6314, + 6315, + 6316, + 6317, + 6318, + 6319, + 6320, + 6321, + 6322, + 6323, + 6324, + 6325, + 6326, + 6328, + 6329, + 6330, + 6331, + 6332, + 6333, + 6334, + 6336, + 6337, + 6338, + 6339, + 6340, + 6341, + 6342, + 6343, + 6344, + 6345, + 6347, + 6348, + 6349, + 6350, + 6351, + 6352, + 6353, + 6354, + 6355, + 6356, + 6358, + 6359, + 6361, + 6362, + 6363, + 6364, + 6365, + 6366, + 6367, + 6368, + 6369, + 6370, + 6371, + 6372, + 6373, + 6374, + 6375, + 6377, + 6378, + 6380, + 6381, + 6382, + 6384, + 6385, + 6386, + 6387, + 6388, + 6389, + 6390, + 6391, + 6392, + 6393, + 6394, + 6395, + 6396, + 6397, + 6399, + 6401, + 6402, + 6403, + 6404, + 6405, + 6406, + 6407, + 6408, + 6409, + 6410, + 6412, + 6413, + 6414, + 6415, + 6416, + 6417, + 6419, + 6420, + 6421, + 6422, + 6423, + 6424, + 6425, + 6426, + 6427, + 6428, + 6429, + 6430, + 6431, + 6432, + 6434, + 6435, + 6436, + 6437, + 6438, + 6439, + 6440, + 6441, + 6442, + 6443, + 6444, + 6446, + 6447, + 6448, + 6449, + 6450, + 6451, + 6453, + 6454, + 6455, + 6456, + 6457, + 6459, + 6460, + 6461, + 6462, + 6463, + 6464, + 6465, + 6466, + 6467, + 6469, + 6470, + 6471, + 6472, + 6473, + 6474, + 6475, + 6476, + 6477, + 6478, + 6479, + 6480, + 6481, + 6482, + 6483, + 6484, + 6485, + 6486, + 6487, + 6488, + 6489, + 6490, + 6491, + 6492, + 6493, + 6494, + 6495, + 6496, + 6497, + 6498, + 6499, + 6500, + 6501, + 6503, + 6504, + 6505, + 6506, + 6507, + 6508, + 6509, + 6510, + 6511, + 6512, + 6513, + 6514, + 6515, + 6516, + 6517, + 6518, + 6519, + 6520, + 6521, + 6522, + 6523, + 6525, + 6526, + 6528, + 6529, + 6530, + 6532, + 6533, + 6534, + 6535, + 6536, + 6537, + 6538, + 6539, + 6540, + 6542, + 6543, + 6544, + 6546, + 6547, + 6548, + 6549, + 6550, + 6551, + 6553, + 6554, + 6555, + 6556, + 6557, + 6558, + 6559, + 6561, + 6562, + 6563, + 6564, + 6565, + 6567, + 6568, + 6569, + 6570, + 6571, + 6572, + 6573, + 6574, + 6575, + 6576, + 6577, + 6578, + 6579, + 6580, + 6581, + 6582, + 6583, + 6584, + 6585, + 6586, + 6587, + 6588, + 6589, + 6590, + 6591, + 6592, + 6593, + 6594, + 6595, + 6596, + 6597, + 6598, + 6599, + 6600, + 6601, + 6602, + 6603, + 6604, + 6605, + 6606, + 6607, + 6608, + 6609, + 6610, + 6611, + 6613, + 6614, + 6615, + 6616, + 6617, + 6618, + 6619, + 6620, + 6621, + 6622, + 6623, + 6624, + 6625, + 6626, + 6627, + 6628, + 6629, + 6630, + 6631, + 6632, + 6633, + 6634, + 6635, + 6637, + 6638, + 6639, + 6640, + 6641, + 6642, + 6643, + 6644, + 6645, + 6646, + 6648, + 6649, + 6650, + 6651, + 6652, + 6653, + 6654, + 6655, + 6656, + 6657, + 6658, + 6659, + 6660, + 6661, + 6662, + 6663, + 6664, + 6665, + 6666, + 6667, + 6668, + 6669, + 6670, + 6671, + 6672, + 6673, + 6674, + 6675, + 6676, + 6677, + 6678, + 6679, + 6681, + 6682, + 6683, + 6685, + 6686, + 6687, + 6689, + 6690, + 6691, + 6692, + 6694, + 6695, + 6696, + 6697, + 6698, + 6699, + 6700, + 6701, + 6702, + 6706, + 6707, + 6708, + 6709, + 6710, + 6711, + 6712, + 6713, + 6714, + 6715, + 6717, + 6718, + 6719, + 6720, + 6721, + 6722, + 6723, + 6724, + 6725, + 6726, + 6727, + 6728, + 6729, + 6730, + 6731, + 6733, + 6734, + 6735, + 6736, + 6737, + 6738, + 6739, + 6740, + 6741, + 6743, + 6744, + 6745, + 6746, + 6747, + 6748, + 6749, + 6750, + 6751, + 6752, + 6753, + 6754, + 6755, + 6756, + 6757, + 6758, + 6759, + 6760, + 6761, + 6762, + 6763, + 6764, + 6765, + 6766, + 6767, + 6768, + 6769, + 6770, + 6771, + 6773, + 6774, + 6775, + 6776, + 6777, + 6778, + 6779, + 6780, + 6781, + 6782, + 6783, + 6784, + 6785, + 6786, + 6787, + 6788, + 6789, + 6790, + 6791, + 6792, + 6793, + 6794, + 6795, + 6796, + 6797, + 6799, + 6800, + 6801, + 6802, + 6803, + 6804, + 6805, + 6806, + 6807, + 6808, + 6809, + 6810, + 6811, + 6812, + 6813, + 6814, + 6815, + 6816, + 6817, + 6818, + 6819, + 6820, + 6821, + 6822, + 6823, + 6825, + 6826, + 6827, + 6828, + 6829, + 6830, + 6831, + 6832, + 6833, + 6834, + 6835, + 6836, + 6837, + 6838, + 6839, + 6840, + 6841, + 6842, + 6843, + 6844, + 6845, + 6846, + 6847, + 6848, + 6849, + 6850, + 6851, + 6852, + 6853, + 6854, + 6855, + 6856, + 6857, + 6858, + 6859, + 6860, + 6862, + 6863, + 6864, + 6865, + 6866, + 6867, + 6868, + 6869, + 6870, + 6871, + 6872, + 6874, + 6875, + 6876, + 6877, + 6878, + 6879, + 6880, + 6881, + 6882, + 6883, + 6884, + 6886, + 6887, + 6888, + 6889, + 6890, + 6891, + 6892, + 6893, + 6894, + 6896, + 6898, + 6899, + 6900, + 6902, + 6903, + 6904, + 6905, + 6906, + 6907, + 6908, + 6909, + 6911, + 6914, + 6915, + 6916, + 6917, + 6918, + 6919, + 6920, + 6921, + 6923, + 6924, + 6925, + 6927, + 6928, + 6929, + 6930, + 6931, + 6933, + 6934, + 6935, + 6936, + 6937, + 6938, + 6939, + 6940, + 6941, + 6942, + 6943, + 6944, + 6945, + 6946, + 6947, + 6948, + 6949, + 6950, + 6951, + 6952, + 6953, + 6954, + 6956, + 6957, + 6958, + 6961, + 6962, + 6964, + 6965, + 6966, + 6967, + 6968, + 6969, + 6970, + 6971, + 6972, + 6973, + 6974, + 6975, + 6976, + 6977, + 6978, + 6979, + 6980, + 6981, + 6982, + 6983, + 6984, + 6985, + 6986, + 6987, + 6988, + 6989, + 6990, + 6991, + 6992, + 6993, + 6994, + 6995, + 6996, + 6997, + 6998, + 6999, + 7000, + 7001, + 7002, + 7003, + 7004, + 7005, + 7006, + 7007, + 7008, + 7009, + 7010, + 7012, + 7013, + 7014, + 7015, + 7016, + 7017, + 7018, + 7019, + 7020, + 7021, + 7022, + 7024, + 7025, + 7026, + 7027, + 7028, + 7029, + 7031, + 7032, + 7033, + 7034, + 7035, + 7036, + 7037, + 7038, + 7039, + 7040, + 7041, + 7042, + 7043, + 7044, + 7045, + 7046, + 7047, + 7048, + 7049, + 7050, + 7051, + 7052, + 7053, + 7054, + 7056, + 7057, + 7058, + 7059, + 7060, + 7061, + 7062, + 7063, + 7064, + 7065, + 7066, + 7067, + 7068, + 7069, + 7070, + 7072, + 7073, + 7074, + 7075, + 7076, + 7077, + 7079, + 7080, + 7082, + 7083, + 7084, + 7085, + 7086, + 7087, + 7088, + 7089, + 7090, + 7092, + 7093, + 7094, + 7095, + 7096, + 7097, + 7098, + 7099, + 7100, + 7101, + 7102, + 7103, + 7104, + 7105, + 7107, + 7108, + 7109, + 7110, + 7112, + 7113, + 7114, + 7115, + 7116, + 7117, + 7118, + 7119, + 7120, + 7122, + 7124, + 7125, + 7126, + 7127, + 7128, + 7129, + 7130, + 7131, + 7132, + 7133, + 7134, + 7135, + 7136, + 7137, + 7138, + 7139, + 7140, + 7141, + 7142, + 7143, + 7144, + 7145, + 7146, + 7147, + 7148, + 7149, + 7150, + 7151, + 7152, + 7153, + 7154, + 7155, + 7157, + 7158, + 7159, + 7160, + 7161, + 7162, + 7163, + 7164, + 7165, + 7166, + 7167, + 7168, + 7169, + 7170, + 7171, + 7172, + 7173, + 7174, + 7175, + 7176, + 7177, + 7178, + 7179, + 7180, + 7181, + 7182, + 7183, + 7184, + 7186, + 7187, + 7188, + 7190, + 7191, + 7192, + 7193, + 7194, + 7195, + 7196, + 7197, + 7198, + 7199, + 7200, + 7201, + 7202, + 7203, + 7204, + 7205, + 7206, + 7207, + 7208, + 7210, + 7211, + 7212, + 7213, + 7214, + 7215, + 7216, + 7217, + 7218, + 7219, + 7220, + 7221, + 7222, + 7223, + 7224, + 7225, + 7226, + 7227, + 7228, + 7229, + 7230, + 7232, + 7233, + 7234, + 7235, + 7236, + 7237, + 7238, + 7239, + 7240, + 7241, + 7242, + 7243, + 7244, + 7245, + 7246, + 7248, + 7249, + 7250, + 7251, + 7252, + 7253, + 7254, + 7255, + 7256, + 7257, + 7258, + 7259, + 7260, + 7261, + 7262, + 7263, + 7264, + 7265, + 7267, + 7268, + 7269, + 7270, + 7271, + 7272, + 7273, + 7274, + 7275, + 7276, + 7277, + 7278, + 7279, + 7280, + 7281, + 7282, + 7283, + 7284, + 7285, + 7286, + 7287, + 7288, + 7289, + 7290, + 7291, + 7292, + 7293, + 7294, + 7295, + 7296, + 7297, + 7298, + 7299, + 7301, + 7302, + 7303, + 7304, + 7305, + 7306, + 7307, + 7308, + 7309, + 7311, + 7312, + 7313, + 7314, + 7315, + 7316, + 7317, + 7318, + 7319, + 7320, + 7321, + 7322, + 7323, + 7324, + 7325, + 7326, + 7327, + 7328, + 7329, + 7330, + 7331, + 7332, + 7333, + 7334, + 7335, + 7336, + 7337, + 7338, + 7339, + 7340, + 7341, + 7342, + 7343, + 7344, + 7345, + 7346, + 7347, + 7348, + 7349, + 7350, + 7351, + 7353, + 7354, + 7355, + 7357, + 7358, + 7359, + 7360, + 7361, + 7362, + 7363, + 7364, + 7365, + 7366, + 7367, + 7368, + 7369, + 7370, + 7371, + 7372, + 7373, + 7374, + 7375, + 7376, + 7377, + 7378, + 7379, + 7380, + 7382, + 7383, + 7384, + 7385, + 7386, + 7387, + 7388, + 7389, + 7391, + 7392, + 7393, + 7394, + 7395, + 7396, + 7397, + 7398, + 7399, + 7400, + 7401, + 7402, + 7403, + 7404, + 7405, + 7406, + 7407, + 7408, + 7409, + 7410, + 7411, + 7412, + 7413, + 7414, + 7415, + 7416, + 7417, + 7418, + 7419, + 7420, + 7421, + 7422, + 7423, + 7424, + 7425, + 7426, + 7427, + 7428, + 7429, + 7430, + 7431, + 7432, + 7433, + 7434, + 7435, + 7436, + 7437, + 7438, + 7439, + 7440, + 7441, + 7442, + 7443, + 7444, + 7445, + 7446, + 7447, + 7448, + 7449, + 7450, + 7451, + 7452, + 7453, + 7454, + 7455, + 7456, + 7457, + 7458, + 7459, + 7460, + 7461, + 7462, + 7463, + 7464, + 7465, + 7466, + 7467, + 7468, + 7469, + 7470, + 7471, + 7472, + 7473, + 7474, + 7475, + 7476, + 7477, + 7478, + 7479, + 7480, + 7481, + 7484, + 7485, + 7486, + 7487, + 7488, + 7489, + 7490, + 7491, + 7492, + 7493, + 7494, + 7495, + 7496, + 7497, + 7498, + 7499, + 7500, + 7501, + 7503, + 7504, + 7505, + 7506, + 7507, + 7508, + 7509, + 7510, + 7511, + 7512, + 7513, + 7514, + 7515, + 7516, + 7517, + 7518, + 7519, + 7521, + 7522, + 7523, + 7524, + 7525, + 7526, + 7527, + 7528, + 7529, + 7530, + 7531, + 7532, + 7533, + 7534, + 7535, + 7536, + 7537, + 7538, + 7539, + 7540, + 7541, + 7542, + 7543, + 7544, + 7545, + 7546, + 7547, + 7548, + 7550, + 7551, + 7552, + 7553, + 7554, + 7556, + 7557, + 7558, + 7559, + 7561, + 7562, + 7563, + 7564, + 7565, + 7566, + 7567, + 7568, + 7569, + 7570, + 7571, + 7572, + 7573, + 7574, + 7575, + 7576, + 7577, + 7578, + 7579, + 7580, + 7581, + 7582, + 7583, + 7584, + 7585, + 7586, + 7587, + 7589, + 7590, + 7591, + 7592, + 7593, + 7594, + 7595, + 7596, + 7597, + 7598, + 7599, + 7600, + 7601, + 7602, + 7603, + 7604, + 7605, + 7606, + 7607, + 7608, + 7609, + 7610, + 7611, + 7612, + 7613, + 7614, + 7615, + 7617, + 7618, + 7619, + 7620, + 7621, + 7622, + 7623, + 7624, + 7625, + 7626, + 7628, + 7629, + 7631, + 7632, + 7634, + 7635, + 7636, + 7637, + 7638, + 7639, + 7640, + 7641, + 7642, + 7643, + 7644, + 7645, + 7646, + 7647, + 7648, + 7649, + 7650, + 7651, + 7652, + 7653, + 7654, + 7655, + 7656, + 7657, + 7658, + 7659, + 7660, + 7661, + 7662, + 7663, + 7664, + 7665, + 7666, + 7667, + 7668, + 7669, + 7670, + 7671, + 7672, + 7673, + 7675, + 7676, + 7677, + 7678, + 7679, + 7681, + 7682, + 7683, + 7684, + 7685, + 7686, + 7687, + 7688, + 7689, + 7690, + 7691, + 7692, + 7694, + 7695, + 7696, + 7697, + 7698, + 7699, + 7700, + 7701, + 7703, + 7704, + 7705, + 7706, + 7707, + 7708, + 7709, + 7710, + 7711, + 7712, + 7713, + 7714, + 7715, + 7716, + 7717, + 7718, + 7719, + 7720, + 7723, + 7724, + 7725, + 7726, + 7727, + 7728, + 7729, + 7730, + 7731, + 7732, + 7733, + 7734, + 7736, + 7737, + 7738, + 7739, + 7740, + 7741, + 7742, + 7743, + 7744, + 7745, + 7746, + 7747, + 7748, + 7749, + 7750, + 7751, + 7752, + 7753, + 7754, + 7755, + 7756, + 7757, + 7758, + 7759, + 7760, + 7762, + 7763, + 7764, + 7765, + 7766, + 7767, + 7768, + 7769, + 7770, + 7771, + 7772, + 7773, + 7774, + 7775, + 7776, + 7777, + 7778, + 7779, + 7781, + 7782, + 7783, + 7784, + 7785, + 7786, + 7787, + 7788, + 7789, + 7790, + 7791, + 7792, + 7793, + 7794, + 7795, + 7796, + 7797, + 7798, + 7799, + 7800, + 7801, + 7802, + 7803, + 7805, + 7807, + 7808, + 7809, + 7810, + 7811, + 7812, + 7813, + 7816, + 7817, + 7818, + 7819, + 7821, + 7822, + 7823, + 7824, + 7825, + 7826, + 7827, + 7828, + 7829, + 7830, + 7831, + 7832, + 7833, + 7834, + 7835, + 7836, + 7837, + 7838, + 7840, + 7841, + 7843, + 7844, + 7845, + 7846, + 7847, + 7848, + 7849, + 7850, + 7851, + 7852, + 7853, + 7854, + 7855, + 7856, + 7857, + 7858, + 7859, + 7860, + 7861, + 7862, + 7863, + 7864, + 7865, + 7866, + 7867, + 7868, + 7869, + 7870, + 7871, + 7872, + 7873, + 7874, + 7875, + 7876, + 7877, + 7878, + 7879, + 7880, + 7881, + 7882, + 7883, + 7884, + 7885, + 7886, + 7887, + 7888, + 7890, + 7891, + 7892, + 7893, + 7894, + 7895, + 7896, + 7898, + 7899, + 7900, + 7901, + 7902, + 7903, + 7904, + 7905, + 7906, + 7907, + 7908, + 7909, + 7910, + 7911, + 7912, + 7913, + 7914, + 7915, + 7916, + 7917, + 7918, + 7919, + 7921, + 7922, + 7923, + 7924, + 7925, + 7926, + 7927, + 7928, + 7929, + 7930, + 7931, + 7932, + 7933, + 7934, + 7936, + 7937, + 7938, + 7939, + 7940, + 7941, + 7943, + 7944, + 7946, + 7947, + 7948, + 7949, + 7950, + 7951, + 7952, + 7953, + 7954, + 7955, + 7956, + 7957, + 7958, + 7959, + 7961, + 7964, + 7965, + 7966, + 7967, + 7968, + 7969, + 7970, + 7972, + 7973, + 7974, + 7975, + 7976, + 7977, + 7978, + 7979, + 7980, + 7981, + 7982, + 7983, + 7984, + 7985, + 7986, + 7987, + 7988, + 7989, + 7990, + 7991, + 7992, + 7993, + 7994, + 7995, + 7996, + 7997, + 7998, + 7999, + 8000, + 8001, + 8002, + 8003, + 8004, + 8005, + 8006, + 8007, + 8008, + 8009, + 8010, + 8011, + 8012, + 8013, + 8015, + 8016, + 8017, + 8018, + 8019, + 8020, + 8021, + 8022, + 8023, + 8024, + 8025, + 8026, + 8029, + 8030, + 8031, + 8032, + 8033, + 8034, + 8035, + 8036, + 8038, + 8039, + 8040, + 8042, + 8043, + 8044, + 8046, + 8047, + 8048, + 8049, + 8050, + 8051, + 8052, + 8053, + 8054, + 8055, + 8056, + 8057, + 8058, + 8059, + 8060, + 8061, + 8062, + 8063, + 8064, + 8065, + 8066, + 8067, + 8068, + 8069, + 8070, + 8071, + 8072, + 8073, + 8074, + 8075, + 8076, + 8077, + 8078, + 8079, + 8080, + 8081, + 8082, + 8083, + 8084, + 8085, + 8086, + 8087, + 8088, + 8089, + 8090, + 8091, + 8093, + 8095, + 8096, + 8097, + 8098, + 8099, + 8100, + 8101, + 8102, + 8103, + 8104, + 8105, + 8106, + 8107, + 8108, + 8109, + 8110, + 8111, + 8112, + 8113, + 8114, + 8115, + 8116, + 8117, + 8118, + 8119, + 8120, + 8121, + 8122, + 8123, + 8124, + 8125, + 8126, + 8127, + 8128, + 8129, + 8130, + 8131, + 8132, + 8133, + 8134, + 8135, + 8136, + 8137, + 8138, + 8140, + 8141, + 8142, + 8143, + 8144, + 8145, + 8146, + 8147, + 8148, + 8149, + 8150, + 8151, + 8152, + 8155, + 8156, + 8158, + 8159, + 8160, + 8161, + 8162, + 8163, + 8164, + 8165, + 8166, + 8167, + 8168, + 8169, + 8170, + 8171, + 8172, + 8173, + 8174, + 8175, + 8176, + 8177, + 8178, + 8179, + 8180, + 8181, + 8182, + 8183, + 8184, + 8185, + 8186, + 8187, + 8188, + 8189, + 8190, + 8191, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8202, + 8203, + 8204, + 8205, + 8206, + 8207, + 8208, + 8209, + 8210, + 8211, + 8212, + 8213, + 8214, + 8215, + 8216, + 8217, + 8218, + 8219, + 8220, + 8221, + 8222, + 8223, + 8224, + 8225, + 8226, + 8227, + 8228, + 8229, + 8230, + 8231, + 8232, + 8233, + 8234, + 8235, + 8236, + 8237, + 8238, + 8239, + 8240, + 8242, + 8243, + 8244, + 8245, + 8247, + 8248, + 8249, + 8251, + 8252, + 8253, + 8255, + 8256, + 8257, + 8258, + 8260, + 8262, + 8263, + 8264, + 8265, + 8266, + 8267, + 8268, + 8269, + 8270, + 8271, + 8272, + 8273, + 8274, + 8275, + 8276, + 8277, + 8278, + 8279, + 8281, + 8282, + 8283, + 8284, + 8285, + 8286, + 8287, + 8288, + 8289, + 8290, + 8291, + 8292, + 8293, + 8294, + 8295, + 8296, + 8298, + 8300, + 8301, + 8302, + 8303, + 8304, + 8305, + 8306, + 8307, + 8308, + 8309, + 8310, + 8311, + 8312, + 8313, + 8314, + 8315, + 8316, + 8317, + 8318, + 8319, + 8320, + 8321, + 8322, + 8323, + 8325, + 8326, + 8327, + 8329, + 8330, + 8331, + 8332, + 8333, + 8335, + 8336, + 8337, + 8338, + 8339, + 8340, + 8342, + 8343, + 8344, + 8345, + 8346, + 8347, + 8348, + 8349, + 8350, + 8351, + 8353, + 8354, + 8355, + 8356, + 8357, + 8358, + 8359, + 8360, + 8361, + 8362, + 8363, + 8365, + 8366, + 8367, + 8368, + 8369, + 8370, + 8371, + 8372, + 8373, + 8375, + 8376, + 8377, + 8378, + 8379, + 8380, + 8381, + 8382, + 8383, + 8384, + 8385, + 8386, + 8387, + 8388, + 8389, + 8391, + 8393, + 8394, + 8395, + 8397, + 8398, + 8399, + 8400, + 8402, + 8403, + 8404, + 8405, + 8406, + 8407, + 8408, + 8409, + 8410, + 8411, + 8412, + 8413, + 8414, + 8415, + 8416, + 8417, + 8418, + 8419, + 8420, + 8421, + 8422, + 8423, + 8424, + 8425, + 8426, + 8427, + 8428, + 8429, + 8430, + 8431, + 8432, + 8433, + 8434, + 8435, + 8436, + 8437, + 8438, + 8439, + 8440, + 8441, + 8442, + 8443, + 8444, + 8446, + 8447, + 8448, + 8449, + 8450, + 8451, + 8452, + 8453, + 8454, + 8455, + 8456, + 8457, + 8458, + 8459, + 8460, + 8462, + 8463, + 8464, + 8465, + 8466, + 8467, + 8468, + 8469, + 8470, + 8471, + 8472, + 8473, + 8474, + 8475, + 8476, + 8477, + 8478, + 8479, + 8480, + 8481, + 8482, + 8483, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8491, + 8494, + 8495, + 8496, + 8497, + 8499, + 8500, + 8501, + 8502, + 8503, + 8504, + 8505, + 8506, + 8507, + 8508, + 8509, + 8510, + 8511, + 8512, + 8513, + 8514, + 8515, + 8516, + 8517, + 8518, + 8519, + 8520, + 8521, + 8522, + 8523, + 8524, + 8525, + 8527, + 8529, + 8530, + 8531, + 8532, + 8533, + 8534, + 8535, + 8536, + 8537, + 8538, + 8539, + 8540, + 8541, + 8542, + 8543, + 8544, + 8545, + 8546, + 8547, + 8548, + 8549, + 8550, + 8552, + 8553, + 8554, + 8555, + 8556, + 8557, + 8558, + 8559, + 8561, + 8562, + 8563, + 8564, + 8565, + 8566, + 8567, + 8568, + 8569, + 8570, + 8571, + 8572, + 8573, + 8574, + 8575, + 8576, + 8577, + 8578, + 8579, + 8580, + 8581, + 8582, + 8583, + 8584, + 8585, + 8586, + 8587, + 8588, + 8589, + 8590, + 8591, + 8592, + 8593, + 8594, + 8595, + 8596, + 8597, + 8599, + 8600, + 8601, + 8602, + 8603, + 8604, + 8605, + 8606, + 8607, + 8608, + 8609, + 8610, + 8611, + 8612, + 8613, + 8614, + 8615, + 8617, + 8618, + 8619, + 8620, + 8621, + 8622, + 8624, + 8625, + 8626, + 8628, + 8629, + 8630, + 8631, + 8632, + 8633, + 8634, + 8635, + 8636, + 8637, + 8638, + 8639, + 8640, + 8641, + 8642, + 8643, + 8644, + 8645, + 8646, + 8647, + 8648, + 8649, + 8650, + 8651, + 8652, + 8653, + 8654, + 8655, + 8656, + 8657, + 8658, + 8659, + 8660, + 8661, + 8662, + 8663, + 8664, + 8665, + 8666, + 8667, + 8668, + 8669, + 8670, + 8671, + 8672, + 8673, + 8674, + 8675, + 8676, + 8677, + 8678, + 8680, + 8681, + 8682, + 8683, + 8684, + 8685, + 8686, + 8687, + 8688, + 8689, + 8690, + 8691, + 8692, + 8693, + 8694, + 8695, + 8696, + 8697, + 8698, + 8699, + 8700, + 8701, + 8702, + 8703, + 8704, + 8705, + 8706, + 8707, + 8708, + 8709, + 8710, + 8711, + 8712, + 8713, + 8714, + 8716, + 8718, + 8719, + 8720, + 8721, + 8722, + 8723, + 8725, + 8726, + 8727, + 8728, + 8730, + 8731, + 8732, + 8733, + 8734, + 8735, + 8736, + 8737, + 8738, + 8739, + 8740, + 8741, + 8742, + 8743, + 8744, + 8745, + 8746, + 8747, + 8748, + 8749, + 8750, + 8751, + 8752, + 8753, + 8754, + 8755, + 8756, + 8757, + 8758, + 8759, + 8760, + 8761, + 8762, + 8763, + 8765, + 8766, + 8767, + 8768, + 8769, + 8770, + 8771, + 8772, + 8773, + 8774, + 8775, + 8776, + 8777, + 8778, + 8779, + 8780, + 8781, + 8782, + 8784, + 8785, + 8786, + 8787, + 8788, + 8789, + 8790, + 8791, + 8792, + 8793, + 8794, + 8795, + 8796, + 8797, + 8798, + 8799, + 8800, + 8801, + 8802, + 8803, + 8804, + 8805, + 8806, + 8807, + 8808, + 8810, + 8811, + 8812, + 8813, + 8814, + 8815, + 8816, + 8817, + 8818, + 8819, + 8820, + 8821, + 8822, + 8823, + 8824, + 8825, + 8826, + 8827, + 8828, + 8829, + 8830, + 8831, + 8832, + 8833, + 8834, + 8835, + 8836, + 8837, + 8838, + 8839, + 8840, + 8841, + 8842, + 8843, + 8844, + 8845, + 8846, + 8847, + 8848, + 8849, + 8850, + 8851, + 8852, + 8853, + 8854, + 8855, + 8856, + 8857, + 8858, + 8859, + 8860, + 8861, + 8862, + 8863, + 8864, + 8866, + 8867, + 8868, + 8869, + 8870, + 8871, + 8872, + 8873, + 8874, + 8875, + 8876, + 8878, + 8879, + 8880, + 8881, + 8882, + 8883, + 8884, + 8886, + 8887, + 8888, + 8890, + 8891, + 8892, + 8893, + 8894, + 8895, + 8896, + 8897, + 8898, + 8899, + 8901, + 8902, + 8903, + 8904, + 8905, + 8906, + 8907, + 8908, + 8909, + 8910, + 8911, + 8912, + 8913, + 8914, + 8915, + 8917, + 8918, + 8919, + 8920, + 8921, + 8923, + 8924, + 8925, + 8926, + 8927, + 8929, + 8931, + 8932, + 8933, + 8934, + 8935, + 8936, + 8937, + 8938, + 8939, + 8940, + 8941, + 8942, + 8943, + 8944, + 8945, + 8946, + 8947, + 8948, + 8949, + 8950, + 8951, + 8953, + 8954, + 8955, + 8956, + 8957, + 8958, + 8959, + 8960, + 8961, + 8962, + 8963, + 8965, + 8966, + 8967, + 8968, + 8969, + 8970, + 8971, + 8972, + 8973, + 8974, + 8975, + 8976, + 8977, + 8978, + 8979, + 8980, + 8981, + 8982, + 8984, + 8985, + 8986, + 8987, + 8988, + 8989, + 8990, + 8991, + 8992, + 8993, + 8994, + 8995, + 8996, + 8997, + 8998, + 8999, + 9000, + 9001, + 9002, + 9003, + 9005, + 9006, + 9007, + 9008, + 9009, + 9010, + 9011, + 9012, + 9013, + 9014, + 9015, + 9016, + 9017, + 9018, + 9019, + 9020, + 9021, + 9022, + 9023, + 9024, + 9025, + 9026, + 9027, + 9028, + 9029, + 9030, + 9031, + 9032, + 9033, + 9034, + 9035, + 9036, + 9037, + 9038, + 9039, + 9040, + 9041, + 9042, + 9043, + 9044, + 9045, + 9046, + 9047, + 9048, + 9049, + 9050, + 9051, + 9052, + 9054, + 9055, + 9056, + 9057, + 9058, + 9059, + 9060, + 9061, + 9062, + 9063, + 9064, + 9065, + 9066, + 9067, + 9068, + 9069, + 9070, + 9071, + 9072, + 9074, + 9075, + 9076, + 9077, + 9078, + 9080, + 9081, + 9082, + 9083, + 9084, + 9085, + 9086, + 9087, + 9088, + 9089, + 9090, + 9091, + 9092, + 9093, + 9094, + 9095, + 9096, + 9097, + 9098, + 9100, + 9101, + 9103, + 9104, + 9106, + 9107, + 9108, + 9110, + 9111, + 9112, + 9113, + 9114, + 9115, + 9116, + 9117, + 9118, + 9119, + 9120, + 9121, + 9122, + 9123, + 9124, + 9125, + 9126, + 9127, + 9128, + 9129, + 9130, + 9131, + 9132, + 9133, + 9134, + 9135, + 9136, + 9137, + 9138, + 9139, + 9141, + 9142, + 9143, + 9144, + 9145, + 9146, + 9147, + 9148, + 9149, + 9151, + 9152, + 9153, + 9155, + 9156, + 9157, + 9158, + 9160, + 9162, + 9163, + 9164, + 9166, + 9167, + 9168, + 9169, + 9170, + 9171, + 9172, + 9173, + 9174, + 9175, + 9177, + 9178, + 9179, + 9180, + 9181, + 9182, + 9183, + 9185, + 9186, + 9187, + 9188, + 9189, + 9190, + 9191, + 9192, + 9193, + 9194, + 9195, + 9197, + 9198, + 9199, + 9200, + 9201, + 9202, + 9204, + 9205, + 9206, + 9207, + 9208, + 9209, + 9210, + 9211, + 9212, + 9213, + 9214, + 9215, + 9216, + 9217, + 9218, + 9219, + 9220, + 9221, + 9222, + 9223, + 9224, + 9225, + 9226, + 9227, + 9228, + 9229, + 9230, + 9231, + 9233, + 9234, + 9236, + 9237, + 9238, + 9239, + 9240, + 9241, + 9242, + 9243, + 9244, + 9245, + 9246, + 9247, + 9248, + 9249, + 9251, + 9252, + 9253, + 9254, + 9255, + 9256, + 9257, + 9258, + 9259, + 9260, + 9261, + 9262, + 9263, + 9264, + 9265, + 9266, + 9267, + 9269, + 9270, + 9272, + 9273, + 9274, + 9275, + 9276, + 9277, + 9278, + 9279, + 9281, + 9282, + 9283, + 9284, + 9285, + 9286, + 9287, + 9288, + 9289, + 9290, + 9292, + 9293, + 9294, + 9295, + 9296, + 9297, + 9298, + 9299, + 9300, + 9301, + 9302, + 9303, + 9304, + 9305, + 9306, + 9307, + 9308, + 9309, + 9311, + 9312, + 9313, + 9314, + 9315, + 9318, + 9319, + 9320, + 9321, + 9322, + 9323, + 9324, + 9325, + 9326, + 9327, + 9328, + 9329, + 9330, + 9331, + 9332, + 9333, + 9334, + 9335, + 9336, + 9337, + 9338, + 9339, + 9340, + 9341, + 9343, + 9344, + 9345, + 9346, + 9347, + 9348, + 9349, + 9350, + 9352, + 9353, + 9354, + 9355, + 9356, + 9357, + 9358, + 9359, + 9360, + 9361, + 9362, + 9363, + 9364, + 9366, + 9367, + 9368, + 9369, + 9370, + 9371, + 9372, + 9373, + 9374, + 9375, + 9377, + 9378, + 9379, + 9380, + 9381, + 9382, + 9383, + 9384, + 9385, + 9386, + 9387, + 9388, + 9389, + 9390, + 9391, + 9392, + 9393, + 9394, + 9395, + 9396, + 9397, + 9398, + 9399, + 9400, + 9401, + 9402, + 9403, + 9404, + 9405, + 9406, + 9407, + 9408, + 9409, + 9410, + 9411, + 9412, + 9413, + 9414, + 9415, + 9416, + 9418, + 9419, + 9420, + 9421, + 9422, + 9423, + 9424, + 9425, + 9426, + 9427, + 9429, + 9430, + 9431, + 9432, + 9433, + 9434, + 9435, + 9436, + 9437, + 9438, + 9439, + 9440, + 9441, + 9442, + 9443, + 9444, + 9445, + 9446, + 9447, + 9448, + 9449, + 9450, + 9452, + 9453, + 9454, + 9455, + 9456, + 9457, + 9458, + 9459, + 9460, + 9462, + 9463, + 9464, + 9465, + 9466, + 9467, + 9468, + 9469, + 9470, + 9471, + 9472, + 9473, + 9474, + 9475, + 9476, + 9477, + 9478, + 9479, + 9480, + 9481, + 9482, + 9483, + 9484, + 9485, + 9486, + 9487, + 9489, + 9490, + 9491, + 9492, + 9493, + 9494, + 9495, + 9496, + 9497, + 9499, + 9500, + 9501, + 9502, + 9503, + 9504, + 9505, + 9506, + 9507, + 9508, + 9509, + 9510, + 9511, + 9512, + 9513, + 9514, + 9515, + 9516, + 9517, + 9519, + 9520, + 9521, + 9522, + 9524, + 9525, + 9526, + 9527, + 9528, + 9530, + 9531, + 9532, + 9533, + 9535, + 9536, + 9537, + 9538, + 9540, + 9542, + 9544, + 9545, + 9546, + 9547, + 9548, + 9549, + 9551, + 9552, + 9553, + 9554, + 9555, + 9556, + 9557, + 9558, + 9559, + 9560, + 9561, + 9562, + 9563, + 9564, + 9565, + 9566, + 9567, + 9568, + 9569, + 9570, + 9571, + 9572, + 9573, + 9574, + 9575, + 9576, + 9577, + 9578, + 9579, + 9580, + 9581, + 9583, + 9584, + 9585, + 9586, + 9587, + 9588, + 9589, + 9591, + 9592, + 9593, + 9594, + 9595, + 9596, + 9597, + 9598, + 9599, + 9600, + 9601, + 9602, + 9603, + 9604, + 9605, + 9606, + 9607, + 9608, + 9609, + 9610, + 9611, + 9612, + 9613, + 9614, + 9616, + 9617, + 9618, + 9619, + 9620, + 9621, + 9622, + 9623, + 9624, + 9625, + 9626, + 9627, + 9628, + 9630, + 9631, + 9632, + 9633, + 9634, + 9635, + 9636, + 9637, + 9638, + 9639, + 9640, + 9641, + 9642, + 9643, + 9644, + 9645, + 9646, + 9647, + 9648, + 9649, + 9650, + 9652, + 9653, + 9654, + 9655, + 9656, + 9657, + 9658, + 9659, + 9660, + 9661, + 9662, + 9663, + 9664, + 9665, + 9666, + 9668, + 9670, + 9671, + 9672, + 9674, + 9675, + 9676, + 9677, + 9678, + 9679, + 9680, + 9681, + 9682, + 9683, + 9684, + 9685, + 9686, + 9687, + 9688, + 9689, + 9690, + 9691, + 9692, + 9693, + 9694, + 9695, + 9696, + 9697, + 9698, + 9699, + 9700, + 9701, + 9702, + 9703, + 9704, + 9705, + 9706, + 9710, + 9711, + 9712, + 9714, + 9716, + 9717, + 9718, + 9719, + 9720, + 9721, + 9722, + 9723, + 9724, + 9725, + 9726, + 9727, + 9728, + 9729, + 9731, + 9732, + 9733, + 9734, + 9735, + 9736, + 9737, + 9738, + 9739, + 9740, + 9741, + 9742, + 9743, + 9744, + 9745, + 9746, + 9747, + 9748, + 9749, + 9750, + 9752, + 9753, + 9754, + 9755, + 9756, + 9757, + 9758, + 9759, + 9760, + 9761, + 9762, + 9763, + 9764, + 9765, + 9766, + 9767, + 9768, + 9769, + 9770, + 9771, + 9772, + 9773, + 9774, + 9775, + 9776, + 9777, + 9778, + 9779, + 9780, + 9781, + 9782, + 9783, + 9784, + 9785, + 9786, + 9787, + 9788, + 9789, + 9791, + 9793, + 9794, + 9795, + 9796, + 9798, + 9799, + 9800, + 9801, + 9803, + 9804, + 9806, + 9807, + 9808, + 9810, + 9811, + 9812, + 9813, + 9814, + 9815, + 9816, + 9817, + 9818, + 9819, + 9820, + 9821, + 9822, + 9823, + 9824, + 9825, + 9826, + 9827, + 9829, + 9830, + 9831, + 9832, + 9833, + 9834, + 9835, + 9836, + 9837, + 9838, + 9839, + 9840, + 9841, + 9842, + 9843, + 9844, + 9845, + 9846, + 9847, + 9848, + 9849, + 9850, + 9851, + 9852, + 9853, + 9854, + 9855, + 9856, + 9857, + 9858, + 9859, + 9860, + 9861, + 9862, + 9863, + 9864, + 9866, + 9867, + 9868, + 9869, + 9870, + 9872, + 9873, + 9874, + 9875, + 9876, + 9878, + 9879, + 9880, + 9881, + 9882, + 9883, + 9885, + 9886, + 9887, + 9888, + 9889, + 9890, + 9891, + 9892, + 9893, + 9894, + 9895, + 9896, + 9897, + 9898, + 9899, + 9900, + 9901, + 9902, + 9903, + 9904, + 9905, + 9906, + 9907, + 9909, + 9910, + 9911, + 9912, + 9913, + 9914, + 9916, + 9917, + 9918, + 9919, + 9920, + 9922, + 9923, + 9924, + 9925, + 9926, + 9927, + 9928, + 9929, + 9930, + 9931, + 9932, + 9933, + 9934, + 9935, + 9936, + 9937, + 9938, + 9939, + 9940, + 9941, + 9942, + 9943, + 9944, + 9945, + 9946, + 9947, + 9948, + 9949, + 9950, + 9951, + 9952, + 9953, + 9954, + 9955, + 9956, + 9957, + 9958, + 9959, + 9960, + 9961, + 9962, + 9963, + 9964, + 9965, + 9966, + 9967, + 9968, + 9969, + 9970, + 9971, + 9973, + 9974, + 9975, + 9976, + 9977, + 9979, + 9980, + 9981, + 9982, + 9983, + 9984, + 9985, + 9986, + 9987, + 9989, + 9990, + 9991, + 9992, + 9993, + 9994, + 9995, + 9996, + 9997, + 9998, + 9999, + 10000, + 10001, + 10002, + 10003, + 10004, + 10005, + 10007, + 10008, + 10009, + 10010, + 10011, + 10012, + 10013, + 10016, + 10017, + 10018, + 10019, + 10020, + 10021, + 10022, + 10023, + 10025, + 10027, + 10028, + 10029, + 10030, + 10031, + 10032, + 10033, + 10034, + 10035, + 10037, + 10038, + 10039, + 10040, + 10041, + 10042, + 10043, + 10044, + 10045, + 10046, + 10047, + 10048, + 10049, + 10050, + 10051, + 10052, + 10053, + 10054, + 10055, + 10056, + 10057, + 10058, + 10059, + 10060, + 10061, + 10062, + 10063, + 10065, + 10066, + 10067, + 10068, + 10069, + 10070, + 10071, + 10072, + 10073, + 10074, + 10075, + 10077, + 10078, + 10079, + 10080, + 10081, + 10082, + 10084, + 10085, + 10086, + 10087, + 10088, + 10089, + 10090, + 10091, + 10092, + 10093, + 10094, + 10095, + 10097, + 10098, + 10099, + 10100, + 10101, + 10102, + 10103, + 10104, + 10105, + 10106, + 10107, + 10108, + 10109, + 10110, + 10111, + 10112, + 10113, + 10115, + 10116, + 10118, + 10120, + 10121, + 10122, + 10123, + 10124, + 10125, + 10126, + 10127, + 10128, + 10129, + 10130, + 10132, + 10134, + 10135, + 10136, + 10137, + 10138, + 10139, + 10140, + 10141, + 10142, + 10143, + 10144, + 10145, + 10146, + 10147, + 10148, + 10149, + 10150, + 10151, + 10152, + 10153, + 10154, + 10156, + 10158, + 10159, + 10160, + 10161, + 10162, + 10163, + 10164, + 10165, + 10166, + 10167, + 10169, + 10170, + 10171, + 10172, + 10173, + 10174, + 10175, + 10176, + 10177, + 10178, + 10179, + 10180, + 10181, + 10182, + 10183, + 10184, + 10185, + 10186, + 10187, + 10188, + 10189, + 10190, + 10191, + 10192, + 10193, + 10194, + 10195, + 10196, + 10198, + 10199, + 10201, + 10203, + 10204, + 10205, + 10206, + 10207, + 10208, + 10209, + 10210, + 10212, + 10213, + 10214, + 10215, + 10216, + 10217, + 10218, + 10219, + 10220, + 10221, + 10222, + 10223, + 10224, + 10225, + 10226, + 10227, + 10228, + 10229, + 10230, + 10231, + 10232, + 10233, + 10234, + 10235, + 10236, + 10237, + 10238, + 10239, + 10240, + 10241, + 10242, + 10243, + 10244, + 10245, + 10246, + 10247, + 10248, + 10249, + 10250, + 10251, + 10252, + 10253, + 10254, + 10255, + 10257, + 10258, + 10259, + 10260, + 10262, + 10263, + 10264, + 10265, + 10266, + 10267, + 10268, + 10269, + 10270, + 10271, + 10272, + 10273, + 10274, + 10275, + 10276, + 10277, + 10278, + 10279, + 10280, + 10281, + 10282, + 10283, + 10284, + 10285, + 10286, + 10287, + 10289, + 10290, + 10291, + 10292, + 10293, + 10294, + 10295, + 10296, + 10297, + 10298, + 10299, + 10300, + 10302, + 10303, + 10304, + 10305, + 10306, + 10307, + 10308, + 10309, + 10310, + 10311, + 10312, + 10313, + 10314, + 10315, + 10316, + 10318, + 10319, + 10320, + 10321, + 10322, + 10323, + 10324, + 10325, + 10326, + 10327, + 10328, + 10329, + 10330, + 10331, + 10332, + 10333, + 10334, + 10335, + 10336, + 10337, + 10338, + 10339, + 10340, + 10341, + 10342, + 10343, + 10344, + 10345, + 10346, + 10347, + 10348, + 10349, + 10350, + 10351, + 10353, + 10354, + 10355, + 10356, + 10357, + 10358, + 10359, + 10360, + 10361, + 10362, + 10363, + 10364, + 10365, + 10366, + 10368, + 10369, + 10370, + 10371, + 10372, + 10373, + 10374, + 10375, + 10376, + 10377, + 10379, + 10380, + 10381, + 10382, + 10383, + 10384, + 10385, + 10386, + 10387, + 10388, + 10390, + 10391, + 10392, + 10393, + 10394, + 10395, + 10396, + 10397, + 10398, + 10399, + 10400, + 10401, + 10402, + 10403, + 10404, + 10405, + 10406, + 10407, + 10408, + 10409, + 10410, + 10411, + 10412, + 10413, + 10415, + 10416, + 10417, + 10418, + 10419, + 10420, + 10421, + 10423, + 10424, + 10425, + 10426, + 10427, + 10428, + 10429, + 10430, + 10431, + 10432, + 10433, + 10434, + 10435, + 10436, + 10437, + 10438, + 10439, + 10440, + 10441, + 10442, + 10443, + 10444, + 10445, + 10446, + 10447, + 10448, + 10449, + 10450, + 10451, + 10452, + 10453, + 10454, + 10455, + 10456, + 10457, + 10458, + 10459, + 10460, + 10461, + 10462, + 10463, + 10464, + 10465, + 10467, + 10468, + 10470, + 10471, + 10472, + 10473, + 10474, + 10475, + 10476, + 10477, + 10478, + 10479, + 10480, + 10481, + 10482, + 10483, + 10484, + 10486, + 10487, + 10489, + 10490, + 10491, + 10492, + 10493, + 10494, + 10495, + 10496, + 10497, + 10498, + 10499, + 10500, + 10501, + 10502, + 10503, + 10504, + 10505, + 10506, + 10507, + 10508, + 10509, + 10510, + 10511, + 10512, + 10513, + 10514, + 10515, + 10516, + 10517, + 10519, + 10520, + 10521, + 10522, + 10523, + 10524, + 10526, + 10527, + 10528, + 10530, + 10531, + 10533, + 10534, + 10535, + 10536, + 10537, + 10538, + 10539, + 10540, + 10541, + 10542, + 10543, + 10544, + 10545, + 10546, + 10547, + 10548, + 10549, + 10550, + 10551, + 10552, + 10553, + 10554, + 10555, + 10556, + 10559, + 10560, + 10561, + 10562, + 10563, + 10564, + 10565, + 10566, + 10567, + 10568, + 10569, + 10570, + 10571, + 10572, + 10573, + 10574, + 10575, + 10576, + 10577, + 10578, + 10579, + 10580, + 10581, + 10582, + 10583, + 10584, + 10585, + 10586, + 10587, + 10588, + 10589, + 10590, + 10591, + 10592, + 10593, + 10594, + 10596, + 10597, + 10598, + 10599, + 10600, + 10601, + 10602, + 10604, + 10605, + 10606, + 10607, + 10608, + 10609, + 10610, + 10611, + 10612, + 10613, + 10615, + 10616, + 10617, + 10619, + 10620, + 10621, + 10622, + 10623, + 10625, + 10626, + 10627, + 10628, + 10629, + 10630, + 10631, + 10632, + 10634, + 10635, + 10636, + 10637, + 10639, + 10640, + 10641, + 10642, + 10643, + 10645, + 10646, + 10647, + 10648, + 10649, + 10650, + 10651, + 10652, + 10653, + 10654, + 10655, + 10656, + 10657, + 10658, + 10659, + 10660, + 10661, + 10662, + 10663, + 10664, + 10666, + 10667, + 10668, + 10669, + 10670, + 10671, + 10673, + 10675, + 10676, + 10677, + 10678, + 10679, + 10680, + 10681, + 10682, + 10683, + 10684, + 10685, + 10686, + 10687, + 10688, + 10689, + 10690, + 10691, + 10692, + 10693, + 10694, + 10695, + 10696, + 10697, + 10698, + 10699, + 10700, + 10701, + 10702, + 10703, + 10704, + 10705, + 10706, + 10707, + 10709, + 10710, + 10711, + 10712, + 10713, + 10714, + 10715, + 10716, + 10717, + 10718, + 10719, + 10720, + 10721, + 10722, + 10724, + 10726, + 10727, + 10728, + 10729, + 10730, + 10731, + 10732, + 10733, + 10734, + 10735, + 10736, + 10737, + 10738, + 10739, + 10740, + 10741, + 10742, + 10743, + 10744, + 10745, + 10746, + 10747, + 10748, + 10749, + 10750, + 10751, + 10752, + 10753, + 10754, + 10755, + 10756, + 10758, + 10759, + 10761, + 10762, + 10763, + 10764, + 10765, + 10767, + 10768, + 10769, + 10771, + 10772, + 10773, + 10774, + 10775, + 10776, + 10777, + 10778, + 10779, + 10780, + 10781, + 10782, + 10783, + 10784, + 10785, + 10786, + 10787, + 10788, + 10789, + 10790, + 10791, + 10792, + 10793, + 10794, + 10795, + 10796, + 10797, + 10798, + 10799, + 10800, + 10801, + 10802, + 10803, + 10805, + 10806, + 10807, + 10808, + 10809, + 10810, + 10811, + 10812, + 10813, + 10814, + 10815, + 10818, + 10819, + 10820, + 10821, + 10822, + 10823, + 10824, + 10825, + 10826, + 10827, + 10828, + 10829, + 10831, + 10832, + 10833, + 10834, + 10835, + 10836, + 10838, + 10839, + 10840, + 10841, + 10842, + 10843, + 10844, + 10845, + 10846, + 10847, + 10848, + 10849, + 10850, + 10851, + 10852, + 10853, + 10854, + 10855, + 10856, + 10857, + 10858, + 10860, + 10861, + 10862, + 10863, + 10864, + 10865, + 10866, + 10867, + 10868, + 10869, + 10870, + 10871, + 10872, + 10873, + 10874, + 10875, + 10876, + 10878, + 10879, + 10880, + 10881, + 10882, + 10883, + 10884, + 10885, + 10886, + 10887, + 10888, + 10889, + 10890, + 10891, + 10892, + 10893, + 10894, + 10895, + 10896, + 10897, + 10898, + 10899, + 10900, + 10901, + 10902, + 10903, + 10904, + 10905, + 10906, + 10907, + 10908, + 10909, + 10910, + 10911, + 10912, + 10913, + 10914, + 10915, + 10916, + 10917, + 10918, + 10919, + 10920, + 10921, + 10922, + 10923, + 10924, + 10925, + 10926, + 10927, + 10928, + 10929, + 10930, + 10931, + 10932, + 10933, + 10934, + 10935, + 10936, + 10937, + 10938, + 10939, + 10940, + 10941, + 10943, + 10944, + 10945, + 10947, + 10948, + 10949, + 10950, + 10951, + 10952, + 10953, + 10954, + 10955, + 10956, + 10957, + 10958, + 10959, + 10960, + 10961, + 10962, + 10963, + 10964, + 10965, + 10967, + 10968, + 10969, + 10970, + 10971, + 10972, + 10973, + 10974, + 10975, + 10976, + 10978, + 10979, + 10981, + 10982, + 10983, + 10984, + 10985, + 10986, + 10987, + 10988, + 10989, + 10990, + 10991, + 10992, + 10993, + 10995, + 10996, + 10997, + 10998, + 10999, + 11000, + 11001, + 11002, + 11003, + 11004, + 11005, + 11007, + 11008, + 11009, + 11010, + 11011, + 11012, + 11013, + 11015, + 11016, + 11017, + 11018, + 11019, + 11020, + 11021, + 11022, + 11023, + 11024, + 11025, + 11026, + 11027, + 11028, + 11029, + 11030, + 11031, + 11032, + 11033, + 11034, + 11035, + 11036, + 11037, + 11038, + 11039, + 11040, + 11041, + 11043, + 11044, + 11045, + 11046, + 11047, + 11048, + 11049, + 11050, + 11051, + 11052, + 11053, + 11054, + 11055, + 11056, + 11057, + 11058, + 11059, + 11060, + 11061, + 11062, + 11063, + 11064, + 11065, + 11066, + 11067, + 11068, + 11069, + 11070, + 11071, + 11072, + 11073, + 11074, + 11075, + 11076, + 11077, + 11078, + 11080, + 11081, + 11082, + 11083, + 11084, + 11086, + 11087, + 11088, + 11089, + 11090, + 11091, + 11092, + 11093, + 11094, + 11095, + 11096, + 11097, + 11098, + 11099, + 11100, + 11101, + 11102, + 11103, + 11104, + 11105, + 11106, + 11107, + 11108, + 11109, + 11110, + 11111, + 11112, + 11113, + 11114, + 11115, + 11116, + 11117, + 11118, + 11119, + 11120, + 11121, + 11122, + 11123, + 11124, + 11125, + 11126, + 11127, + 11128, + 11129, + 11130, + 11131, + 11132, + 11133, + 11135, + 11136, + 11137, + 11138, + 11139, + 11140, + 11141, + 11142, + 11143, + 11144, + 11145, + 11146, + 11147, + 11148, + 11149, + 11150, + 11151, + 11152, + 11153, + 11154, + 11155, + 11156, + 11157, + 11158, + 11160, + 11161, + 11162, + 11163, + 11164, + 11165, + 11167, + 11168, + 11169, + 11170, + 11171, + 11172, + 11173, + 11174, + 11175, + 11176, + 11177, + 11178, + 11179, + 11180, + 11181, + 11182, + 11183, + 11184, + 11185, + 11186, + 11187, + 11188, + 11190, + 11191, + 11193, + 11194, + 11195, + 11196, + 11197, + 11198, + 11199, + 11200, + 11201, + 11202, + 11203, + 11204, + 11205, + 11206, + 11207, + 11208, + 11209, + 11210, + 11211, + 11212, + 11215, + 11216, + 11217, + 11218, + 11219, + 11220, + 11221, + 11222, + 11223, + 11224, + 11225, + 11227, + 11228, + 11229, + 11230, + 11231, + 11232, + 11233, + 11234, + 11235, + 11236, + 11237, + 11238, + 11239, + 11240, + 11241, + 11242, + 11243, + 11244, + 11246, + 11247, + 11248, + 11249, + 11250, + 11252, + 11253, + 11254, + 11255, + 11256, + 11257, + 11258, + 11259, + 11260, + 11261, + 11262, + 11263, + 11264, + 11265, + 11266, + 11267, + 11268, + 11269, + 11270, + 11271, + 11272, + 11273, + 11274, + 11275, + 11277, + 11278, + 11279, + 11280, + 11281, + 11282, + 11283, + 11285, + 11286, + 11287, + 11288, + 11289, + 11290, + 11291, + 11292, + 11293, + 11295, + 11296, + 11297, + 11298, + 11299, + 11300, + 11301, + 11302, + 11303, + 11304, + 11305, + 11306, + 11307, + 11308, + 11309, + 11310, + 11311, + 11312, + 11313, + 11314, + 11315, + 11316, + 11317, + 11318, + 11319, + 11320, + 11321, + 11322, + 11323, + 11324, + 11325, + 11326, + 11327, + 11328, + 11329, + 11330, + 11331, + 11332, + 11333, + 11334, + 11335, + 11336, + 11337, + 11338, + 11339, + 11340, + 11341, + 11342, + 11343, + 11344, + 11345, + 11346, + 11347, + 11348, + 11349, + 11351, + 11352, + 11353, + 11355, + 11356, + 11357, + 11358, + 11359, + 11360, + 11361, + 11362, + 11363, + 11364, + 11365, + 11366, + 11367, + 11368, + 11369, + 11370, + 11371, + 11372, + 11373, + 11374, + 11375, + 11376, + 11377, + 11378, + 11379, + 11380, + 11381, + 11382, + 11385, + 11386, + 11387, + 11388, + 11389, + 11391, + 11392, + 11393, + 11394, + 11395, + 11396, + 11397, + 11399, + 11400, + 11401, + 11402, + 11403, + 11404, + 11405, + 11406, + 11407, + 11409, + 11410, + 11411, + 11412, + 11413, + 11414, + 11415, + 11416, + 11417, + 11418, + 11419, + 11420, + 11421, + 11422, + 11423, + 11424, + 11425, + 11426, + 11427, + 11428, + 11429, + 11430, + 11431, + 11432, + 11434, + 11435, + 11436, + 11437, + 11438, + 11439, + 11441, + 11442, + 11443, + 11444, + 11445, + 11446, + 11447, + 11449, + 11450, + 11451, + 11452, + 11453, + 11454, + 11455, + 11456, + 11457, + 11458, + 11459, + 11460, + 11461, + 11462, + 11463, + 11464, + 11465, + 11466, + 11467, + 11468, + 11469, + 11470, + 11471, + 11472, + 11473, + 11475, + 11476, + 11477, + 11478, + 11479, + 11480, + 11482, + 11483, + 11484, + 11485, + 11486, + 11487, + 11488, + 11489, + 11490, + 11491, + 11492, + 11493, + 11494, + 11495, + 11496, + 11497, + 11498, + 11500, + 11501, + 11502, + 11504, + 11505, + 11506, + 11507, + 11508, + 11509, + 11510, + 11512, + 11513, + 11514, + 11516, + 11517, + 11518, + 11519, + 11520, + 11521, + 11522, + 11523, + 11524, + 11525, + 11526, + 11527, + 11528, + 11529, + 11531, + 11532, + 11533, + 11534, + 11535, + 11536, + 11537, + 11538, + 11539, + 11540, + 11541, + 11542, + 11543, + 11544, + 11545, + 11547, + 11549, + 11550, + 11551, + 11552, + 11553, + 11554, + 11555, + 11556, + 11557, + 11558, + 11559, + 11560, + 11561, + 11562, + 11563, + 11564, + 11565, + 11566, + 11567, + 11568, + 11569, + 11570, + 11571, + 11572, + 11573, + 11574, + 11575, + 11577, + 11578, + 11579, + 11581, + 11582, + 11583, + 11584, + 11585, + 11586, + 11587, + 11588, + 11589, + 11590, + 11592, + 11593, + 11594, + 11595, + 11596, + 11597, + 11598, + 11599, + 11600, + 11601, + 11602, + 11603, + 11604, + 11605, + 11606, + 11607, + 11608, + 11609, + 11610, + 11611, + 11612, + 11613, + 11615, + 11616, + 11617, + 11618, + 11619, + 11620, + 11621, + 11622, + 11623, + 11624, + 11625, + 11626, + 11627, + 11628, + 11629, + 11630, + 11632, + 11633, + 11634, + 11635, + 11636, + 11637, + 11638, + 11639, + 11640, + 11641, + 11642, + 11643, + 11644, + 11645, + 11646, + 11647, + 11648, + 11649, + 11650, + 11651, + 11652, + 11653, + 11654, + 11655, + 11656, + 11657, + 11658, + 11659, + 11660, + 11661, + 11662, + 11663, + 11664, + 11665, + 11666, + 11667, + 11668, + 11669, + 11670, + 11672, + 11673, + 11674, + 11675, + 11677, + 11679, + 11680, + 11682, + 11683, + 11684, + 11685, + 11686, + 11687, + 11688, + 11689, + 11690, + 11691, + 11692, + 11693, + 11694, + 11695, + 11696, + 11697, + 11698, + 11699, + 11700, + 11701, + 11702, + 11703, + 11704, + 11705, + 11706, + 11707, + 11708, + 11709, + 11710, + 11711, + 11712, + 11713, + 11714, + 11715, + 11716, + 11717, + 11718, + 11719, + 11720, + 11721, + 11722, + 11723, + 11724, + 11725, + 11726, + 11727, + 11728, + 11729, + 11730, + 11731, + 11732, + 11733, + 11734, + 11735, + 11736, + 11737, + 11738, + 11739, + 11740, + 11741, + 11742, + 11743, + 11744, + 11745, + 11746, + 11747, + 11748, + 11749, + 11750, + 11751, + 11752, + 11753, + 11754, + 11755, + 11756, + 11757, + 11758, + 11759, + 11761, + 11762, + 11763, + 11764, + 11765, + 11766, + 11767, + 11768, + 11769, + 11770, + 11771, + 11772, + 11773, + 11774, + 11775, + 11776, + 11777, + 11778, + 11779, + 11780, + 11781, + 11782, + 11783, + 11784, + 11785, + 11786, + 11787, + 11788, + 11789, + 11790, + 11791, + 11792, + 11793, + 11794, + 11795, + 11796, + 11797, + 11798, + 11799, + 11800, + 11801, + 11802, + 11803, + 11804, + 11805, + 11806, + 11807, + 11808, + 11809, + 11810, + 11811, + 11812, + 11814, + 11815, + 11816, + 11817, + 11818, + 11819, + 11820, + 11821, + 11822, + 11823, + 11824, + 11825, + 11826, + 11827, + 11828, + 11829, + 11830, + 11831, + 11832, + 11833, + 11834, + 11835, + 11836, + 11837, + 11838, + 11839, + 11840, + 11841, + 11842, + 11843, + 11844, + 11845, + 11846, + 11847, + 11849, + 11850, + 11851, + 11852, + 11853, + 11854, + 11855, + 11856, + 11857, + 11858, + 11859, + 11860, + 11861, + 11862, + 11863, + 11864, + 11866, + 11867, + 11868, + 11869, + 11870, + 11871, + 11872, + 11874, + 11875, + 11876, + 11877, + 11878, + 11879, + 11880, + 11881, + 11882, + 11883, + 11884, + 11885, + 11886, + 11887, + 11888, + 11889, + 11890, + 11891, + 11892, + 11893, + 11894, + 11895, + 11896, + 11897, + 11898, + 11899, + 11900, + 11901, + 11902, + 11903, + 11904, + 11905, + 11906, + 11907, + 11908, + 11909, + 11910, + 11911, + 11912, + 11913, + 11914, + 11915, + 11916, + 11917, + 11918, + 11919, + 11920, + 11921, + 11922, + 11923, + 11924, + 11925, + 11926, + 11927, + 11928, + 11929, + 11930, + 11931, + 11932, + 11933, + 11934, + 11935, + 11936, + 11938, + 11939, + 11940, + 11942, + 11943, + 11944, + 11945, + 11946, + 11947, + 11948, + 11949, + 11950, + 11951, + 11953, + 11954, + 11955, + 11956, + 11958, + 11959, + 11960, + 11961, + 11962, + 11963, + 11964, + 11965, + 11966, + 11967, + 11968, + 11970, + 11972, + 11973, + 11974, + 11975, + 11976, + 11977, + 11978, + 11979, + 11980, + 11981, + 11982, + 11983, + 11984, + 11985, + 11986, + 11987, + 11988, + 11989, + 11990, + 11991, + 11992, + 11993, + 11994, + 11995, + 11996, + 11997, + 11998, + 11999, + 12000, + 12001, + 12002, + 12004, + 12005, + 12006, + 12007, + 12008, + 12010, + 12011, + 12012, + 12013, + 12014, + 12015, + 12016, + 12017, + 12018, + 12019, + 12020, + 12021, + 12023, + 12025, + 12026, + 12027, + 12028, + 12029, + 12030, + 12031, + 12032, + 12033, + 12034, + 12035, + 12036, + 12038, + 12039, + 12040, + 12041, + 12042, + 12043, + 12044, + 12045, + 12047, + 12050, + 12051, + 12053, + 12054, + 12055, + 12057, + 12058, + 12059, + 12060, + 12061, + 12062, + 12063, + 12064, + 12065, + 12066, + 12067, + 12068, + 12069, + 12070, + 12071, + 12072, + 12073, + 12075, + 12076, + 12077, + 12078, + 12079, + 12080, + 12081, + 12082, + 12083, + 12084, + 12086, + 12087, + 12088, + 12089, + 12090, + 12091, + 12092, + 12093, + 12095, + 12096, + 12097, + 12099, + 12100, + 12101, + 12102, + 12103, + 12104, + 12105, + 12106, + 12107, + 12108, + 12109, + 12110, + 12111, + 12112, + 12113, + 12114, + 12115, + 12116, + 12117, + 12118, + 12120, + 12122, + 12123, + 12124, + 12125, + 12127, + 12128, + 12129, + 12130, + 12131, + 12132, + 12133, + 12134, + 12135, + 12136, + 12137, + 12138, + 12139, + 12140, + 12141, + 12142, + 12143, + 12144, + 12145, + 12146, + 12147, + 12148, + 12149, + 12150, + 12151, + 12152, + 12153, + 12155, + 12156, + 12157, + 12158, + 12159, + 12160, + 12161, + 12162, + 12163, + 12164, + 12165, + 12166, + 12167, + 12168, + 12169, + 12170, + 12171, + 12172, + 12173, + 12174, + 12175, + 12176, + 12177, + 12178, + 12179, + 12181, + 12182, + 12184, + 12185, + 12186, + 12187, + 12188, + 12189, + 12190, + 12191, + 12192, + 12193, + 12194, + 12195, + 12196, + 12197, + 12199, + 12200, + 12201, + 12202, + 12203, + 12204, + 12205, + 12206, + 12207, + 12208, + 12209, + 12210, + 12211, + 12212, + 12213, + 12214, + 12215, + 12216, + 12217, + 12218, + 12220, + 12221, + 12222, + 12224, + 12225, + 12226, + 12227, + 12228, + 12229, + 12230, + 12231, + 12232, + 12233, + 12234, + 12235, + 12236, + 12237, + 12238, + 12240, + 12241, + 12242, + 12243, + 12244, + 12245, + 12246, + 12247, + 12248, + 12249, + 12250, + 12251, + 12252, + 12253, + 12254, + 12255, + 12256, + 12257, + 12258, + 12259, + 12260, + 12261, + 12262, + 12263, + 12264, + 12265, + 12266, + 12267, + 12268, + 12269, + 12270, + 12271, + 12272, + 12273, + 12274, + 12275, + 12276, + 12278, + 12279, + 12280, + 12281, + 12282, + 12283, + 12284, + 12285, + 12286, + 12287, + 12288, + 12289, + 12290, + 12291, + 12292, + 12293, + 12294, + 12295, + 12296, + 12297, + 12298, + 12299, + 12300, + 12301, + 12302, + 12303, + 12304, + 12305, + 12306, + 12307, + 12309, + 12310, + 12311, + 12312, + 12313, + 12314, + 12315, + 12316, + 12317, + 12318, + 12319, + 12320, + 12321, + 12322, + 12323, + 12324, + 12325, + 12326, + 12327, + 12328, + 12329, + 12330, + 12331, + 12332, + 12333, + 12334, + 12335, + 12336, + 12337, + 12338, + 12339, + 12341, + 12342, + 12344, + 12345, + 12346, + 12347, + 12348, + 12349, + 12350, + 12351, + 12352, + 12353, + 12354, + 12356, + 12357, + 12358, + 12359, + 12360, + 12361, + 12362, + 12363, + 12364, + 12365, + 12366, + 12367, + 12368, + 12369, + 12370, + 12371, + 12372, + 12373, + 12374, + 12375, + 12376, + 12377, + 12378, + 12379, + 12380, + 12381, + 12382, + 12383, + 12384, + 12385, + 12387, + 12388, + 12389, + 12390, + 12391, + 12392, + 12393, + 12394, + 12395, + 12396, + 12397, + 12398, + 12399, + 12400, + 12401, + 12403, + 12404, + 12405, + 12406, + 12407, + 12408, + 12410, + 12411, + 12412, + 12413, + 12414, + 12415, + 12416, + 12417, + 12418, + 12419, + 12421, + 12422, + 12423, + 12424, + 12425, + 12427, + 12428, + 12429, + 12430, + 12431, + 12432, + 12433, + 12434, + 12435, + 12436, + 12438, + 12439, + 12440, + 12441, + 12442, + 12443, + 12444, + 12445, + 12446, + 12449, + 12450, + 12451, + 12452, + 12453, + 12454, + 12455, + 12456, + 12458, + 12459, + 12460, + 12461, + 12462, + 12463, + 12464, + 12465, + 12466, + 12467, + 12468, + 12469, + 12470, + 12472, + 12473, + 12474, + 12475, + 12476, + 12479, + 12480, + 12481, + 12482, + 12483, + 12485, + 12486, + 12487, + 12488, + 12489, + 12490, + 12492, + 12493, + 12494, + 12495, + 12496, + 12497, + 12498, + 12499, + 12500, + 12501, + 12502, + 12503, + 12504, + 12505, + 12506, + 12507, + 12508, + 12509, + 12510, + 12511, + 12512, + 12513, + 12514, + 12515, + 12516, + 12517, + 12518, + 12519, + 12520, + 12522, + 12523, + 12524, + 12525, + 12526, + 12528, + 12529, + 12530, + 12531, + 12532, + 12533, + 12534, + 12535, + 12536, + 12537, + 12538, + 12539, + 12540, + 12541, + 12542, + 12543, + 12544, + 12545, + 12546, + 12547, + 12548, + 12549, + 12550, + 12551, + 12552, + 12553, + 12554, + 12555, + 12556, + 12557, + 12558, + 12559, + 12560, + 12561, + 12562, + 12563, + 12564, + 12565, + 12566, + 12567, + 12568, + 12569, + 12570, + 12572, + 12573, + 12574, + 12575, + 12576, + 12577, + 12578, + 12579, + 12580, + 12581, + 12582, + 12583, + 12584, + 12585, + 12586, + 12587, + 12588, + 12590, + 12591, + 12592, + 12593, + 12597, + 12598, + 12599, + 12601, + 12602, + 12603, + 12604, + 12605, + 12606, + 12607, + 12608, + 12610, + 12611, + 12612, + 12613, + 12614, + 12615, + 12616, + 12617, + 12618, + 12619, + 12620, + 12621, + 12622, + 12623, + 12624, + 12625, + 12626, + 12627, + 12628, + 12629, + 12631, + 12632, + 12633, + 12636, + 12637, + 12638, + 12639, + 12640, + 12642, + 12643, + 12644, + 12645, + 12646, + 12647, + 12649, + 12650, + 12651, + 12652, + 12653, + 12654, + 12655, + 12656, + 12658, + 12659, + 12660, + 12661, + 12662, + 12663, + 12664, + 12665, + 12666, + 12667, + 12668, + 12669, + 12670, + 12671, + 12672, + 12673, + 12674, + 12677, + 12678, + 12679, + 12680, + 12681, + 12682, + 12683, + 12684, + 12685, + 12686, + 12687, + 12688, + 12689, + 12690, + 12691, + 12692, + 12693, + 12694, + 12695, + 12696, + 12697, + 12698, + 12699, + 12700, + 12701, + 12702, + 12703, + 12704, + 12705, + 12706, + 12707, + 12708, + 12709, + 12710, + 12711, + 12712, + 12713, + 12714, + 12715, + 12716, + 12717, + 12718, + 12719, + 12720, + 12721, + 12722, + 12723, + 12724, + 12725, + 12726, + 12727, + 12728, + 12729, + 12730, + 12731, + 12732, + 12733, + 12734, + 12736, + 12737, + 12738, + 12741, + 12742, + 12743, + 12744, + 12745, + 12746, + 12748, + 12749, + 12750, + 12751, + 12752, + 12753, + 12754, + 12755, + 12756, + 12757, + 12758, + 12759, + 12760, + 12761, + 12762, + 12764, + 12765, + 12766, + 12767, + 12768, + 12769, + 12770, + 12771, + 12772, + 12773, + 12774, + 12775, + 12776, + 12777, + 12778, + 12779, + 12780, + 12782, + 12783, + 12784, + 12785, + 12786, + 12787, + 12788, + 12789, + 12790, + 12791, + 12792, + 12793, + 12794, + 12795, + 12796, + 12797, + 12798, + 12800, + 12801, + 12802, + 12803, + 12805, + 12806, + 12807, + 12808, + 12809, + 12810, + 12811, + 12812, + 12813, + 12814, + 12815, + 12816, + 12817, + 12818, + 12819, + 12820, + 12821, + 12822, + 12823, + 12824, + 12825, + 12826, + 12827, + 12828, + 12829, + 12830, + 12831, + 12832, + 12833, + 12835, + 12836, + 12837, + 12838, + 12839, + 12840, + 12841, + 12842, + 12843, + 12845, + 12846, + 12847, + 12849, + 12850, + 12851, + 12852, + 12853, + 12854, + 12855, + 12856, + 12857, + 12858, + 12859, + 12860, + 12862, + 12863, + 12864, + 12866, + 12867, + 12868, + 12869, + 12870, + 12871, + 12872, + 12873, + 12874, + 12875, + 12877, + 12878, + 12879, + 12881, + 12882, + 12883, + 12884, + 12886, + 12888, + 12889, + 12890, + 12891, + 12892, + 12893, + 12894, + 12895, + 12896, + 12897, + 12898, + 12899, + 12900, + 12901, + 12902, + 12903, + 12904, + 12905, + 12906, + 12907, + 12908, + 12909, + 12910, + 12911, + 12913, + 12915, + 12916, + 12917, + 12918, + 12919, + 12920, + 12921, + 12922, + 12923, + 12924, + 12925, + 12926, + 12927, + 12928, + 12929, + 12930, + 12931, + 12933, + 12934, + 12935, + 12936, + 12937, + 12938, + 12939, + 12940, + 12941, + 12942, + 12943, + 12944, + 12946, + 12947, + 12948, + 12949, + 12950, + 12951, + 12952, + 12953, + 12955, + 12956, + 12959, + 12960, + 12961, + 12962, + 12963, + 12966, + 12968, + 12969, + 12970, + 12971, + 12972, + 12973, + 12974, + 12975, + 12976, + 12977, + 12978, + 12979, + 12980, + 12981, + 12983, + 12985, + 12986, + 12987, + 12988, + 12989, + 12990, + 12991, + 12992, + 12993, + 12994, + 12995, + 12996, + 12997, + 12998, + 12999, + 13000, + 13001, + 13002, + 13004, + 13005, + 13006, + 13007, + 13008, + 13009, + 13010, + 13011, + 13012, + 13014, + 13015, + 13016, + 13017, + 13018, + 13019, + 13020, + 13021, + 13022, + 13023, + 13024, + 13025, + 13026, + 13027, + 13028, + 13029, + 13030, + 13031, + 13033, + 13034, + 13035, + 13036, + 13037, + 13038, + 13039, + 13040, + 13041, + 13042, + 13043, + 13044, + 13045, + 13046, + 13047, + 13048, + 13049, + 13051, + 13052, + 13053, + 13054, + 13055, + 13056, + 13057, + 13058, + 13059, + 13060, + 13061, + 13062, + 13063, + 13064, + 13065, + 13066, + 13067, + 13068, + 13069, + 13070, + 13071, + 13072, + 13073, + 13074, + 13075, + 13076, + 13077, + 13078, + 13079, + 13080, + 13081, + 13082, + 13084, + 13085, + 13086, + 13087, + 13088, + 13090, + 13091, + 13092, + 13093, + 13094, + 13095, + 13096, + 13097, + 13098, + 13099, + 13100, + 13101, + 13102, + 13103, + 13104, + 13105, + 13106, + 13107, + 13108, + 13110, + 13111, + 13112, + 13113, + 13114, + 13115, + 13117, + 13118, + 13119, + 13120, + 13121, + 13122, + 13123, + 13124, + 13125, + 13126, + 13127, + 13128, + 13129, + 13130, + 13131, + 13133, + 13134, + 13135, + 13136, + 13137, + 13138, + 13139, + 13140, + 13142, + 13144, + 13145, + 13146, + 13147, + 13148, + 13149, + 13150, + 13152, + 13153, + 13154, + 13155, + 13156, + 13157, + 13158, + 13159, + 13160, + 13161, + 13162, + 13163, + 13164, + 13165, + 13166, + 13167, + 13168, + 13169, + 13170, + 13171, + 13172, + 13173, + 13174, + 13175, + 13176, + 13177, + 13178, + 13179, + 13180, + 13181, + 13182, + 13184, + 13185, + 13186, + 13187, + 13188, + 13189, + 13190, + 13191, + 13192, + 13193, + 13194, + 13195, + 13196, + 13197, + 13198, + 13199, + 13200, + 13201, + 13202, + 13203, + 13204, + 13205, + 13206, + 13207, + 13208, + 13209, + 13211, + 13213, + 13214, + 13215, + 13216, + 13217, + 13218, + 13219, + 13220, + 13221, + 13222, + 13224, + 13226, + 13227, + 13228, + 13229, + 13231, + 13232, + 13233, + 13234, + 13235, + 13236, + 13237, + 13238, + 13239, + 13240, + 13241, + 13242, + 13243, + 13244, + 13245, + 13246, + 13247, + 13248, + 13249, + 13250, + 13251, + 13252, + 13253, + 13254, + 13255, + 13256, + 13257, + 13258, + 13259, + 13260, + 13262, + 13263, + 13264, + 13265, + 13266, + 13267, + 13268, + 13269, + 13270, + 13271, + 13272, + 13273, + 13274, + 13275, + 13276, + 13277, + 13278, + 13279, + 13280, + 13281, + 13282, + 13283, + 13284, + 13285, + 13286, + 13287, + 13288, + 13289, + 13290, + 13291, + 13293, + 13294, + 13295, + 13296, + 13297, + 13298, + 13299, + 13300, + 13301, + 13302, + 13303, + 13304, + 13305, + 13306, + 13307, + 13308, + 13309, + 13310, + 13311, + 13312, + 13313, + 13315, + 13316, + 13317, + 13318, + 13319, + 13320, + 13321, + 13322, + 13323, + 13324, + 13325, + 13326, + 13327, + 13328, + 13329, + 13330, + 13331, + 13332, + 13333, + 13334, + 13335, + 13336, + 13337, + 13338, + 13339, + 13340, + 13341, + 13342, + 13343, + 13344, + 13345, + 13346, + 13347, + 13348, + 13349, + 13350, + 13351, + 13352, + 13354, + 13355, + 13356, + 13357, + 13358, + 13359, + 13360, + 13361, + 13362, + 13364, + 13365, + 13366, + 13367, + 13368, + 13369, + 13370, + 13371, + 13372, + 13373, + 13374, + 13375, + 13376, + 13377, + 13378, + 13379, + 13380, + 13381, + 13382, + 13383, + 13384, + 13385, + 13386, + 13387, + 13388, + 13389, + 13390, + 13391, + 13392, + 13394, + 13395, + 13396, + 13397, + 13398, + 13399, + 13401, + 13402, + 13403, + 13404, + 13405, + 13406, + 13407, + 13408, + 13409, + 13410, + 13411, + 13413, + 13414, + 13415, + 13416, + 13417, + 13418, + 13419, + 13420, + 13421, + 13422, + 13423, + 13424, + 13425, + 13426, + 13427, + 13428, + 13429, + 13430, + 13431, + 13432, + 13433, + 13434, + 13435, + 13436, + 13437, + 13438, + 13439, + 13440, + 13441, + 13442, + 13443, + 13444, + 13445, + 13446, + 13447, + 13448, + 13449, + 13450, + 13451, + 13452, + 13453, + 13454, + 13455, + 13456, + 13457, + 13458, + 13459, + 13460, + 13461, + 13462, + 13463, + 13464, + 13465, + 13467, + 13468, + 13469, + 13470, + 13471, + 13472, + 13473, + 13474, + 13475, + 13476, + 13477, + 13478, + 13479, + 13480, + 13481, + 13482, + 13483, + 13484, + 13485, + 13486, + 13487, + 13488, + 13489, + 13490, + 13491, + 13492, + 13493, + 13494, + 13495, + 13496, + 13497, + 13498, + 13499, + 13500, + 13501, + 13502, + 13503, + 13504, + 13505, + 13506, + 13507, + 13509, + 13510, + 13511, + 13512, + 13513, + 13514, + 13515, + 13516, + 13517, + 13518, + 13520, + 13521, + 13522, + 13523, + 13524, + 13525, + 13526, + 13528, + 13529, + 13530, + 13531, + 13532, + 13533, + 13534, + 13535, + 13536, + 13537, + 13538, + 13539, + 13540, + 13541, + 13542, + 13543, + 13544, + 13545, + 13546, + 13547, + 13548, + 13549, + 13550, + 13551, + 13552, + 13553, + 13554, + 13555, + 13556, + 13557, + 13558, + 13559, + 13560, + 13561, + 13562, + 13563, + 13564, + 13565, + 13566, + 13568, + 13569, + 13570, + 13571, + 13572, + 13573, + 13574, + 13575, + 13576, + 13577, + 13578, + 13580, + 13581, + 13582, + 13583, + 13584, + 13585, + 13586, + 13587, + 13588, + 13589, + 13590, + 13592, + 13593, + 13594, + 13595, + 13596, + 13597, + 13598, + 13599, + 13600, + 13601, + 13602, + 13604, + 13605, + 13606, + 13607, + 13608, + 13609, + 13610, + 13611, + 13612, + 13613, + 13614, + 13615, + 13617, + 13618, + 13619, + 13620, + 13621, + 13623, + 13624, + 13625, + 13626, + 13627, + 13628, + 13629, + 13630, + 13631, + 13632, + 13633, + 13634, + 13635, + 13636, + 13637, + 13638, + 13639, + 13640, + 13641, + 13642, + 13643, + 13644, + 13645, + 13646, + 13647, + 13650, + 13651, + 13652, + 13653, + 13655, + 13656, + 13657, + 13658, + 13659, + 13660, + 13661, + 13662, + 13663, + 13664, + 13665, + 13666, + 13667, + 13668, + 13669, + 13670, + 13671, + 13672, + 13673, + 13674, + 13675, + 13676, + 13677, + 13678, + 13679, + 13680, + 13681, + 13682, + 13683, + 13684, + 13685, + 13686, + 13687, + 13688, + 13689, + 13690, + 13691, + 13692, + 13693, + 13694, + 13695, + 13697, + 13698, + 13699, + 13701, + 13702, + 13703, + 13704, + 13705, + 13706, + 13707, + 13708, + 13709, + 13710, + 13711, + 13712, + 13713, + 13714, + 13715, + 13716, + 13717, + 13718, + 13719, + 13721, + 13722, + 13723, + 13724, + 13725, + 13726, + 13727, + 13728, + 13729, + 13730, + 13731, + 13732, + 13733, + 13734, + 13735, + 13736, + 13737, + 13738, + 13739, + 13740, + 13741, + 13742, + 13743, + 13745, + 13746, + 13747, + 13748, + 13749, + 13750, + 13751, + 13752, + 13753, + 13754, + 13755, + 13756, + 13757, + 13760, + 13761, + 13762, + 13763, + 13764, + 13765, + 13766, + 13767, + 13768, + 13769, + 13770, + 13771, + 13772, + 13773, + 13774, + 13775, + 13776, + 13777, + 13778, + 13779, + 13780, + 13782, + 13783, + 13784, + 13785, + 13786, + 13787, + 13788, + 13789, + 13790, + 13791, + 13792, + 13793, + 13794, + 13795, + 13796, + 13797, + 13798, + 13799, + 13800, + 13801, + 13802, + 13803, + 13804, + 13805, + 13806, + 13807, + 13808, + 13809, + 13810, + 13811, + 13812, + 13813, + 13814, + 13815, + 13817, + 13818, + 13820, + 13821, + 13822, + 13823, + 13824, + 13825, + 13826, + 13828, + 13829, + 13830, + 13831, + 13832, + 13833, + 13834, + 13835, + 13836, + 13837, + 13838, + 13839, + 13840, + 13841, + 13842, + 13843, + 13844, + 13845, + 13846, + 13847, + 13849, + 13850, + 13851, + 13852, + 13853, + 13854, + 13855, + 13856, + 13857, + 13858, + 13859, + 13860, + 13861, + 13862, + 13863, + 13864, + 13865, + 13866, + 13867, + 13868, + 13869, + 13870, + 13872, + 13873, + 13874, + 13875, + 13876, + 13877, + 13878, + 13879, + 13880, + 13881, + 13882, + 13883, + 13884, + 13885, + 13887, + 13888, + 13889, + 13890, + 13891, + 13892, + 13893, + 13894, + 13896, + 13898, + 13899, + 13900, + 13901, + 13902, + 13903, + 13904, + 13905, + 13906, + 13907, + 13908, + 13909, + 13910, + 13911, + 13912, + 13913, + 13914, + 13915, + 13916, + 13918, + 13919, + 13920, + 13921, + 13922, + 13923, + 13924, + 13925, + 13926, + 13927, + 13928, + 13929, + 13930, + 13931, + 13932, + 13933, + 13934, + 13935, + 13936, + 13937, + 13938, + 13939, + 13940, + 13941, + 13942, + 13943, + 13944, + 13945, + 13946, + 13947, + 13948, + 13949, + 13950, + 13951, + 13952, + 13953, + 13954, + 13955, + 13956, + 13957, + 13958, + 13959, + 13960, + 13961, + 13962, + 13963, + 13964, + 13965, + 13966, + 13968, + 13969, + 13970, + 13971, + 13972, + 13973, + 13974, + 13975, + 13976, + 13977, + 13978, + 13979, + 13980, + 13981, + 13982, + 13983, + 13984, + 13985, + 13986, + 13987, + 13988, + 13989, + 13990, + 13991, + 13992, + 13993, + 13994, + 13995, + 13996, + 13997, + 13999, + 14000, + 14001, + 14002, + 14003, + 14004, + 14006, + 14007, + 14008, + 14010, + 14011, + 14013, + 14014, + 14015, + 14016, + 14017, + 14019, + 14020, + 14021, + 14022, + 14023, + 14024, + 14025, + 14026, + 14027, + 14028, + 14029, + 14030, + 14031, + 14033, + 14034, + 14035, + 14036, + 14037, + 14038, + 14039, + 14040, + 14041, + 14043, + 14044, + 14045, + 14046, + 14047, + 14048, + 14049, + 14050, + 14051, + 14052, + 14053, + 14054, + 14055, + 14056, + 14057, + 14058, + 14059, + 14060, + 14061, + 14062, + 14063, + 14064, + 14065, + 14066, + 14067, + 14068, + 14069, + 14070, + 14071, + 14072, + 14073, + 14074, + 14075, + 14076, + 14077, + 14078, + 14079, + 14080, + 14081, + 14083, + 14086, + 14088, + 14089, + 14090, + 14091, + 14092, + 14093, + 14094, + 14096, + 14097, + 14098, + 14099, + 14100, + 14101, + 14102, + 14103, + 14104, + 14105, + 14106, + 14107, + 14108, + 14109, + 14110, + 14111, + 14112, + 14113, + 14114, + 14115, + 14116, + 14117, + 14118, + 14119, + 14120, + 14121, + 14122, + 14123, + 14124, + 14125, + 14126, + 14127, + 14128, + 14129, + 14130, + 14131, + 14132, + 14133, + 14134, + 14135, + 14136, + 14137, + 14138, + 14139, + 14140, + 14141, + 14142, + 14144, + 14145, + 14146, + 14147, + 14148, + 14149, + 14150, + 14151, + 14153, + 14155, + 14156, + 14157, + 14158, + 14159, + 14160, + 14161, + 14162, + 14163, + 14164, + 14165, + 14166, + 14168, + 14169, + 14170, + 14171, + 14172, + 14173, + 14174, + 14175, + 14176, + 14177, + 14178, + 14179, + 14180, + 14182, + 14183, + 14184, + 14185, + 14186, + 14187, + 14188, + 14189, + 14190, + 14191, + 14192, + 14193, + 14194, + 14195, + 14196, + 14197, + 14199, + 14200, + 14201, + 14202, + 14203, + 14204, + 14205, + 14206, + 14207, + 14208, + 14209, + 14210, + 14211, + 14212, + 14213, + 14214, + 14215, + 14216, + 14217, + 14218, + 14219, + 14220, + 14221, + 14222, + 14224, + 14225, + 14226, + 14227, + 14228, + 14229, + 14230, + 14231, + 14232, + 14233, + 14234, + 14235, + 14237, + 14238, + 14239, + 14240, + 14241, + 14242, + 14243, + 14244, + 14245, + 14246, + 14247, + 14249, + 14250, + 14251, + 14252, + 14253, + 14254, + 14256, + 14257, + 14258, + 14259, + 14260, + 14261, + 14262, + 14264, + 14265, + 14266, + 14268, + 14269, + 14270, + 14271, + 14272, + 14274, + 14275, + 14276, + 14277, + 14278, + 14279, + 14280, + 14281, + 14282, + 14284, + 14285, + 14286, + 14287, + 14288, + 14289, + 14290, + 14291, + 14292, + 14293, + 14294, + 14295, + 14296, + 14297, + 14298, + 14299, + 14300, + 14301, + 14302, + 14303, + 14304, + 14305, + 14306, + 14307, + 14308, + 14310, + 14311, + 14312, + 14313, + 14314, + 14316, + 14317, + 14318, + 14319, + 14320, + 14321, + 14322, + 14323, + 14324, + 14326, + 14327, + 14329, + 14331, + 14332, + 14333, + 14334, + 14335, + 14336, + 14337, + 14338, + 14340, + 14341, + 14342, + 14343, + 14345, + 14347, + 14348, + 14349, + 14350, + 14351, + 14352, + 14353, + 14354, + 14355, + 14356, + 14357, + 14358, + 14359, + 14360, + 14361, + 14362, + 14363, + 14364, + 14365, + 14366, + 14367, + 14368, + 14369, + 14370, + 14371, + 14372, + 14373, + 14374, + 14376, + 14377, + 14378, + 14379, + 14380, + 14381, + 14382, + 14383, + 14384, + 14385, + 14386, + 14387, + 14388, + 14389, + 14390, + 14391, + 14393, + 14394, + 14395, + 14396, + 14397, + 14398, + 14400, + 14401, + 14402, + 14403, + 14404, + 14407, + 14408, + 14410, + 14411, + 14412, + 14413, + 14415, + 14416, + 14417, + 14418, + 14419, + 14420, + 14421, + 14422, + 14423, + 14424, + 14425, + 14426, + 14427, + 14428, + 14429, + 14430, + 14431, + 14432, + 14433, + 14435, + 14436, + 14438, + 14439, + 14440, + 14441, + 14442, + 14443, + 14444, + 14445, + 14446, + 14447, + 14448, + 14449, + 14450, + 14451, + 14452, + 14453, + 14454, + 14455, + 14456, + 14457, + 14458, + 14459, + 14460, + 14461, + 14462, + 14463, + 14464, + 14465, + 14466, + 14467, + 14468, + 14469, + 14470, + 14471, + 14472, + 14473, + 14474, + 14475, + 14477, + 14478, + 14479, + 14480, + 14481, + 14482, + 14483, + 14484, + 14485, + 14486, + 14487, + 14488, + 14489, + 14490, + 14491, + 14492, + 14493, + 14494, + 14495, + 14497, + 14498, + 14500, + 14501, + 14502, + 14504, + 14506, + 14507, + 14508, + 14509, + 14510, + 14511, + 14513, + 14514, + 14515, + 14516, + 14517, + 14518, + 14519, + 14520, + 14521, + 14522, + 14523, + 14524, + 14525, + 14526, + 14527, + 14528, + 14529, + 14530, + 14531, + 14532, + 14533, + 14534, + 14535, + 14536, + 14537, + 14538, + 14539, + 14540, + 14541, + 14542, + 14543, + 14544, + 14545, + 14546, + 14547, + 14548, + 14549, + 14550, + 14551, + 14552, + 14553, + 14554, + 14555, + 14556, + 14557, + 14558, + 14560, + 14561, + 14562, + 14563, + 14564, + 14565, + 14566, + 14567, + 14569, + 14570, + 14571, + 14572, + 14573, + 14574, + 14575, + 14576, + 14577, + 14578, + 14579, + 14580, + 14581, + 14582, + 14584, + 14585, + 14586, + 14587, + 14588, + 14589, + 14590, + 14591, + 14592, + 14593, + 14594, + 14596, + 14597, + 14598, + 14599, + 14600, + 14601, + 14603, + 14604, + 14607, + 14609, + 14610, + 14611, + 14612, + 14613, + 14614, + 14615, + 14616, + 14617, + 14618, + 14619, + 14621, + 14622, + 14623, + 14624, + 14625, + 14626, + 14627, + 14628, + 14629, + 14630, + 14631, + 14633, + 14634, + 14635, + 14636, + 14637, + 14638, + 14639, + 14640, + 14641, + 14643, + 14644, + 14645, + 14646, + 14647, + 14649, + 14650, + 14651, + 14652, + 14655, + 14656, + 14658, + 14660, + 14662, + 14663, + 14665, + 14666, + 14667, + 14668, + 14669, + 14670, + 14671, + 14672, + 14673, + 14674, + 14675, + 14676, + 14677, + 14678, + 14679, + 14680, + 14681, + 14682, + 14683, + 14684, + 14685, + 14686, + 14687, + 14688, + 14691, + 14692, + 14693, + 14694, + 14695, + 14696, + 14697, + 14698, + 14701, + 14703, + 14705, + 14706, + 14707, + 14708, + 14709, + 14710, + 14711, + 14712, + 14713, + 14714, + 14715, + 14716, + 14717, + 14718, + 14719, + 14720, + 14721, + 14722, + 14723, + 14724, + 14725, + 14726, + 14727, + 14728, + 14729, + 14730, + 14731, + 14732, + 14733, + 14734, + 14735, + 14736, + 14737, + 14738, + 14739, + 14740, + 14741, + 14742, + 14744, + 14745, + 14746, + 14747, + 14748, + 14749, + 14750, + 14751, + 14752, + 14753, + 14754, + 14755, + 14756, + 14757, + 14758, + 14759, + 14760, + 14761, + 14762, + 14763, + 14764, + 14765, + 14766, + 14767, + 14768, + 14769, + 14770, + 14771, + 14772, + 14774, + 14775, + 14776, + 14777, + 14778, + 14779, + 14780, + 14783, + 14784, + 14785, + 14786, + 14787, + 14789, + 14790, + 14791, + 14793, + 14794, + 14795, + 14796, + 14797, + 14798, + 14799, + 14800, + 14801, + 14802, + 14803, + 14804, + 14805, + 14807, + 14808, + 14809, + 14811, + 14814, + 14815, + 14816, + 14817, + 14818, + 14819, + 14820, + 14821, + 14822, + 14823, + 14824, + 14826, + 14827, + 14829, + 14830, + 14831, + 14832, + 14833, + 14834, + 14835, + 14836, + 14837, + 14838, + 14839, + 14840, + 14841, + 14842, + 14843, + 14845, + 14846, + 14847, + 14848, + 14850, + 14851, + 14852, + 14853, + 14854, + 14855, + 14856, + 14857, + 14858, + 14859, + 14860, + 14861, + 14862, + 14863, + 14864, + 14866, + 14867, + 14868, + 14869, + 14870, + 14871, + 14873, + 14874, + 14876, + 14877, + 14878, + 14879, + 14880, + 14881, + 14882, + 14883, + 14884, + 14885, + 14886, + 14887, + 14888, + 14889, + 14890, + 14891, + 14892, + 14893, + 14894, + 14895, + 14896, + 14897, + 14898, + 14900, + 14901, + 14902, + 14903, + 14904, + 14905, + 14906, + 14908, + 14909, + 14910, + 14911, + 14912, + 14913, + 14914, + 14915, + 14916, + 14917, + 14918, + 14919, + 14920, + 14921, + 14923, + 14924, + 14925, + 14926, + 14928, + 14929, + 14930, + 14931, + 14932, + 14933, + 14934, + 14935, + 14936, + 14937, + 14938, + 14940, + 14941, + 14942, + 14943, + 14944, + 14946, + 14947, + 14948, + 14949, + 14950, + 14951, + 14952, + 14953, + 14954, + 14955, + 14956, + 14957, + 14958, + 14960, + 14961, + 14962, + 14963, + 14965, + 14966, + 14967, + 14968, + 14969, + 14970, + 14971, + 14972, + 14973, + 14975, + 14976, + 14977, + 14978, + 14979, + 14981, + 14982, + 14983, + 14984, + 14985, + 14986, + 14987, + 14988, + 14989, + 14990, + 14991, + 14992, + 14994, + 14995, + 14996, + 14997, + 14998, + 14999, + 15001, + 15002, + 15003, + 15004, + 15005, + 15006, + 15007, + 15008, + 15009, + 15011, + 15012, + 15013, + 15014, + 15015, + 15016, + 15017, + 15018, + 15019, + 15020, + 15021, + 15022, + 15023, + 15025, + 15026, + 15027, + 15028, + 15029, + 15030, + 15031, + 15032, + 15033, + 15034, + 15036, + 15037, + 15038, + 15039, + 15040, + 15041, + 15042, + 15043, + 15044, + 15045, + 15046, + 15047, + 15048, + 15050, + 15051, + 15052, + 15053, + 15054, + 15055, + 15056, + 15057, + 15058, + 15059, + 15060, + 15061, + 15062, + 15063, + 15064, + 15065, + 15066, + 15067, + 15068, + 15069, + 15070, + 15071, + 15072, + 15073, + 15074, + 15075, + 15076, + 15077, + 15078, + 15079, + 15081, + 15082, + 15083, + 15084, + 15085, + 15086, + 15087, + 15088, + 15089, + 15090, + 15091, + 15092, + 15093, + 15094, + 15095, + 15096, + 15097, + 15098, + 15099, + 15101, + 15102, + 15103, + 15104, + 15105, + 15106, + 15107, + 15108, + 15109, + 15110, + 15111, + 15112, + 15113, + 15114, + 15115, + 15116, + 15117, + 15118, + 15119, + 15120, + 15121, + 15122, + 15123, + 15124, + 15125, + 15126, + 15127, + 15128, + 15129, + 15130, + 15131, + 15132, + 15133, + 15134, + 15135, + 15137, + 15138, + 15139, + 15140, + 15141, + 15143, + 15144, + 15145, + 15146, + 15147, + 15148, + 15149, + 15150, + 15151, + 15152, + 15153, + 15154, + 15155, + 15156, + 15157, + 15158, + 15159, + 15160, + 15161, + 15162, + 15163, + 15165, + 15166, + 15167, + 15168, + 15170, + 15172, + 15173, + 15175, + 15176, + 15177, + 15178, + 15179, + 15180, + 15181, + 15182, + 15184, + 15185, + 15186, + 15187, + 15188, + 15189, + 15190, + 15191, + 15192, + 15193, + 15194, + 15195, + 15196, + 15197, + 15198, + 15199, + 15200, + 15201, + 15202, + 15203, + 15204, + 15205, + 15206, + 15207, + 15208, + 15209, + 15211, + 15212, + 15213, + 15214, + 15215, + 15216, + 15217, + 15218, + 15220, + 15221, + 15222, + 15223, + 15224, + 15225, + 15226, + 15227, + 15229, + 15230, + 15231, + 15232, + 15233, + 15234, + 15235, + 15236, + 15237, + 15238, + 15239, + 15241, + 15242, + 15243, + 15244, + 15245, + 15246, + 15247, + 15248, + 15249, + 15250, + 15251, + 15252, + 15253, + 15254, + 15255, + 15256, + 15257, + 15258, + 15259, + 15260, + 15261, + 15262, + 15263, + 15264, + 15265, + 15266, + 15267, + 15268, + 15269, + 15272, + 15273, + 15274, + 15275, + 15276, + 15277, + 15278, + 15279, + 15280, + 15281, + 15282, + 15283, + 15284, + 15285, + 15286, + 15287, + 15290, + 15291, + 15292, + 15293, + 15294, + 15295, + 15296, + 15297, + 15298, + 15299, + 15300, + 15301, + 15302, + 15304, + 15305, + 15306, + 15307, + 15308, + 15309, + 15310, + 15311, + 15312, + 15313, + 15314, + 15315, + 15316, + 15318, + 15319, + 15321, + 15322, + 15323, + 15324, + 15325, + 15326, + 15327, + 15328, + 15329, + 15330, + 15331, + 15333, + 15334, + 15335, + 15336, + 15337, + 15338, + 15339, + 15340, + 15341, + 15342, + 15343, + 15344, + 15345, + 15346, + 15347, + 15348, + 15349, + 15351, + 15352, + 15353, + 15354, + 15355, + 15356, + 15357, + 15358, + 15359, + 15360, + 15361, + 15362, + 15363, + 15364, + 15365, + 15366, + 15367, + 15368, + 15369, + 15370, + 15371, + 15372, + 15373, + 15374, + 15375, + 15376, + 15378, + 15379, + 15380, + 15381, + 15382, + 15383, + 15384, + 15385, + 15386, + 15387, + 15388, + 15389, + 15390, + 15391, + 15393, + 15394, + 15395, + 15396, + 15397, + 15398, + 15399, + 15400, + 15401, + 15402, + 15403, + 15404, + 15405, + 15406, + 15407, + 15408, + 15409, + 15410, + 15411, + 15412, + 15413, + 15414, + 15416, + 15417, + 15418, + 15419, + 15420, + 15421, + 15422, + 15424, + 15426, + 15427, + 15428, + 15429, + 15430, + 15431, + 15432, + 15433, + 15434, + 15435, + 15436, + 15437, + 15438, + 15439, + 15440, + 15441, + 15442, + 15443, + 15444, + 15445, + 15446, + 15447, + 15448, + 15449, + 15450, + 15451, + 15452, + 15453, + 15454, + 15456, + 15457, + 15458, + 15459, + 15460, + 15461, + 15462, + 15463, + 15464, + 15465, + 15466, + 15467, + 15468, + 15469, + 15470, + 15471, + 15472, + 15473, + 15474, + 15475, + 15476, + 15477, + 15478, + 15479, + 15480, + 15481, + 15482, + 15483, + 15484, + 15485, + 15486, + 15487, + 15488, + 15489, + 15490, + 15491, + 15492, + 15493, + 15494, + 15495, + 15496, + 15497, + 15498, + 15499, + 15500, + 15501, + 15502, + 15503, + 15504, + 15505, + 15506, + 15508, + 15509, + 15510, + 15511, + 15512, + 15513, + 15514, + 15515, + 15516, + 15517, + 15518, + 15519, + 15520, + 15521, + 15522, + 15523, + 15524, + 15525, + 15526, + 15527, + 15528, + 15529, + 15530, + 15531, + 15532, + 15533, + 15534, + 15535, + 15536, + 15537, + 15538, + 15539, + 15540, + 15541, + 15542, + 15543, + 15544, + 15545, + 15546, + 15547, + 15548, + 15549, + 15550, + 15551, + 15552, + 15553, + 15554, + 15555, + 15556, + 15557, + 15559, + 15560, + 15561, + 15562, + 15563, + 15564, + 15565, + 15566, + 15567, + 15568, + 15569, + 15570, + 15571, + 15572, + 15573, + 15574, + 15576, + 15578, + 15580, + 15581, + 15582, + 15584, + 15585, + 15587, + 15588, + 15589, + 15590, + 15591, + 15592, + 15593, + 15594, + 15595, + 15596, + 15597, + 15598, + 15599, + 15600, + 15601, + 15602, + 15603, + 15604, + 15606, + 15607, + 15608, + 15609, + 15610, + 15611, + 15612, + 15613, + 15614, + 15615, + 15616, + 15617, + 15618, + 15619, + 15620, + 15621, + 15622, + 15623, + 15624, + 15626, + 15627, + 15628, + 15629, + 15630, + 15631, + 15632, + 15633, + 15634, + 15635, + 15636, + 15637, + 15638, + 15639, + 15640, + 15641, + 15642, + 15643, + 15644, + 15645, + 15646, + 15647, + 15649, + 15650, + 15651, + 15652, + 15653, + 15654, + 15655, + 15656, + 15657, + 15658, + 15659, + 15660, + 15662, + 15663, + 15664, + 15665, + 15666, + 15667, + 15668, + 15669, + 15670, + 15671, + 15672, + 15673, + 15674, + 15675, + 15676, + 15677, + 15679, + 15680, + 15681, + 15682, + 15683, + 15684, + 15685, + 15686, + 15687, + 15688, + 15689, + 15690, + 15691, + 15692, + 15693, + 15694, + 15695, + 15696, + 15697, + 15698, + 15699, + 15700, + 15701, + 15702, + 15703, + 15704, + 15705, + 15706, + 15707, + 15708, + 15709, + 15710, + 15711, + 15712, + 15713, + 15714, + 15716, + 15717, + 15718, + 15719, + 15720, + 15721, + 15722, + 15723, + 15725, + 15726, + 15727, + 15728, + 15729, + 15730, + 15731, + 15732, + 15733, + 15734, + 15735, + 15736, + 15737, + 15738, + 15739, + 15740, + 15741, + 15742, + 15743, + 15744, + 15745, + 15746, + 15747, + 15748, + 15749, + 15750, + 15751, + 15752, + 15753, + 15754, + 15755, + 15756, + 15757, + 15759, + 15761, + 15762, + 15764, + 15765, + 15766, + 15767, + 15768, + 15769, + 15772, + 15773, + 15774, + 15775, + 15776, + 15777, + 15778, + 15779, + 15780, + 15781, + 15783, + 15784, + 15785, + 15788, + 15789, + 15791, + 15793, + 15794, + 15795, + 15796, + 15797, + 15798, + 15799, + 15800, + 15801, + 15802, + 15803, + 15804, + 15805, + 15806, + 15807, + 15808, + 15809, + 15810, + 15811, + 15812, + 15813, + 15814, + 15815, + 15816, + 15817, + 15818, + 15821, + 15822, + 15823, + 15824, + 15825, + 15826, + 15827, + 15828, + 15829, + 15830, + 15831, + 15832, + 15833, + 15834, + 15835, + 15836, + 15837, + 15838, + 15839, + 15840, + 15841, + 15842, + 15843, + 15844, + 15845, + 15847, + 15848, + 15849, + 15850, + 15851, + 15852, + 15853, + 15854, + 15855, + 15856, + 15857, + 15858, + 15859, + 15860, + 15861, + 15862, + 15863, + 15864, + 15865, + 15866, + 15867, + 15868, + 15869, + 15870, + 15871, + 15872, + 15873, + 15874, + 15875, + 15876, + 15877, + 15878, + 15879, + 15880, + 15881, + 15882, + 15883, + 15884, + 15885, + 15886, + 15887, + 15889, + 15890, + 15891, + 15892, + 15893, + 15896, + 15897, + 15898, + 15899, + 15900, + 15901, + 15902, + 15903, + 15904, + 15905, + 15906, + 15907, + 15908, + 15909, + 15911, + 15912, + 15913, + 15914, + 15915, + 15916, + 15917, + 15918, + 15919, + 15920, + 15921, + 15922, + 15923, + 15924, + 15926, + 15927, + 15928, + 15929, + 15930, + 15931, + 15933, + 15935, + 15936, + 15937, + 15938, + 15941, + 15943, + 15944, + 15945, + 15946, + 15947, + 15948, + 15949, + 15950, + 15951, + 15952, + 15953, + 15954, + 15956, + 15957, + 15958, + 15959, + 15960, + 15961, + 15962, + 15963, + 15964, + 15965, + 15966, + 15967, + 15968, + 15969, + 15970, + 15971, + 15972, + 15973, + 15974, + 15975, + 15976, + 15977, + 15978, + 15979, + 15980, + 15981, + 15982, + 15983, + 15984, + 15986, + 15987, + 15988, + 15989, + 15990, + 15991, + 15992, + 15993, + 15994, + 15996, + 15997, + 15998, + 15999, + 16000, + 16001, + 16002, + 16003, + 16004, + 16005, + 16006, + 16007, + 16008, + 16009, + 16011, + 16012, + 16014, + 16015, + 16016, + 16017, + 16018, + 16019, + 16021, + 16022, + 16023, + 16024, + 16025, + 16026, + 16027, + 16028, + 16029, + 16030, + 16031, + 16033, + 16034, + 16035, + 16036, + 16037, + 16038, + 16039, + 16040, + 16041, + 16042, + 16043, + 16044, + 16045, + 16046, + 16047, + 16048, + 16049, + 16050, + 16051, + 16052, + 16053, + 16054, + 16055, + 16056, + 16057, + 16058, + 16059, + 16060, + 16061, + 16062, + 16063, + 16064, + 16065, + 16067, + 16068, + 16069, + 16070, + 16071, + 16072, + 16073, + 16075, + 16076, + 16077, + 16078, + 16079, + 16080, + 16081, + 16082, + 16083, + 16084, + 16085, + 16087, + 16088, + 16089, + 16090, + 16091, + 16092, + 16093, + 16094, + 16096, + 16097, + 16098, + 16099, + 16100, + 16101, + 16102, + 16103, + 16104, + 16105, + 16106, + 16107, + 16108, + 16110, + 16111, + 16112, + 16113, + 16114, + 16115, + 16116, + 16117, + 16118, + 16119, + 16120, + 16121, + 16122, + 16123, + 16124, + 16125, + 16126, + 16127, + 16128, + 16130, + 16131, + 16132, + 16133, + 16134, + 16135, + 16136, + 16137, + 16138, + 16139, + 16140, + 16141, + 16142, + 16143, + 16144, + 16145, + 16147, + 16149, + 16150, + 16151, + 16152, + 16153, + 16154, + 16155, + 16156, + 16157, + 16158, + 16159, + 16160, + 16161, + 16162, + 16163, + 16164, + 16165, + 16167, + 16168, + 16169, + 16170, + 16171, + 16172, + 16173, + 16174, + 16175, + 16176, + 16177, + 16178, + 16179, + 16180, + 16181, + 16182, + 16183, + 16184, + 16185, + 16186, + 16187, + 16189, + 16190, + 16191, + 16192, + 16193, + 16194, + 16195, + 16196, + 16197, + 16199, + 16200, + 16201, + 16203, + 16204, + 16205, + 16206, + 16207, + 16208, + 16209, + 16210, + 16211, + 16212, + 16213, + 16214, + 16215, + 16216, + 16217, + 16218, + 16219, + 16220, + 16221, + 16222, + 16223, + 16224, + 16225, + 16227, + 16228, + 16229, + 16230, + 16231, + 16232, + 16233, + 16234, + 16235, + 16236, + 16237, + 16238, + 16239, + 16240, + 16241, + 16242, + 16243, + 16244, + 16245, + 16246, + 16247, + 16248, + 16249, + 16250, + 16251, + 16252, + 16253, + 16254, + 16255, + 16256, + 16257, + 16258, + 16259, + 16260, + 16261, + 16262, + 16263, + 16264, + 16265, + 16266, + 16267, + 16268, + 16269, + 16271, + 16272, + 16274, + 16275, + 16276, + 16277, + 16278, + 16279, + 16280, + 16281, + 16282, + 16283, + 16285, + 16286, + 16287, + 16288, + 16289, + 16290, + 16291, + 16292, + 16293, + 16294, + 16295, + 16296, + 16297, + 16298, + 16299, + 16300, + 16301, + 16302, + 16303, + 16304, + 16305, + 16306, + 16307, + 16308, + 16309, + 16310, + 16311, + 16312, + 16313, + 16314, + 16315, + 16316, + 16317, + 16318, + 16319, + 16320, + 16321, + 16322, + 16323, + 16324, + 16325, + 16326, + 16327, + 16328, + 16329, + 16331, + 16332, + 16334, + 16335, + 16337, + 16338, + 16339, + 16340, + 16341, + 16342, + 16343, + 16344, + 16345, + 16346, + 16347, + 16348, + 16349, + 16351, + 16352, + 16353, + 16354, + 16355, + 16356, + 16357, + 16358, + 16359, + 16360, + 16361, + 16362, + 16363, + 16364, + 16365, + 16366, + 16367, + 16368, + 16369, + 16370, + 16371, + 16372, + 16373, + 16374, + 16375, + 16376, + 16377, + 16378, + 16379, + 16380, + 16381, + 16382, + 16383, + 16384, + 16385, + 16387, + 16388, + 16389, + 16390, + 16392, + 16393, + 16396, + 16397, + 16398, + 16399, + 16400, + 16401, + 16402, + 16403, + 16404, + 16405, + 16406, + 16407, + 16408, + 16409, + 16410, + 16411, + 16412, + 16413, + 16414, + 16415, + 16416, + 16417, + 16418, + 16419, + 16421, + 16422, + 16423, + 16424, + 16425, + 16426, + 16427, + 16428, + 16429, + 16430, + 16431, + 16434, + 16436, + 16437, + 16438, + 16439, + 16440, + 16441, + 16442, + 16443, + 16445, + 16446, + 16447, + 16448, + 16449, + 16450, + 16451, + 16452, + 16453, + 16454, + 16455, + 16456, + 16457, + 16458, + 16459, + 16460, + 16461, + 16462, + 16463, + 16464, + 16465, + 16466, + 16467, + 16468, + 16469, + 16470, + 16471, + 16472, + 16473, + 16474, + 16475, + 16476, + 16477, + 16478, + 16479, + 16480, + 16481, + 16483, + 16484, + 16485, + 16486, + 16487, + 16488, + 16489, + 16490, + 16491, + 16492, + 16493, + 16494, + 16495, + 16496, + 16497, + 16498, + 16499, + 16500, + 16501, + 16502, + 16503, + 16504, + 16505, + 16506, + 16507, + 16508, + 16509, + 16510, + 16511, + 16512, + 16513, + 16514, + 16515, + 16516, + 16517, + 16518, + 16519, + 16520, + 16521, + 16522, + 16523, + 16524, + 16525, + 16526, + 16528, + 16529, + 16530, + 16532, + 16533, + 16534, + 16535, + 16536, + 16537, + 16538, + 16539, + 16541, + 16542, + 16543, + 16544, + 16545, + 16546, + 16547, + 16549, + 16550, + 16551, + 16552, + 16553, + 16555, + 16556, + 16557, + 16558, + 16559, + 16560, + 16561, + 16562, + 16563, + 16564, + 16565, + 16566, + 16567, + 16568, + 16569, + 16570, + 16571, + 16572, + 16573, + 16575, + 16576, + 16577, + 16578, + 16581, + 16582, + 16583, + 16584, + 16587, + 16588, + 16589, + 16590, + 16591, + 16592, + 16593, + 16595, + 16596, + 16597, + 16598, + 16599, + 16601, + 16602, + 16603, + 16604, + 16605, + 16606, + 16607, + 16609, + 16610, + 16611, + 16613, + 16614, + 16615, + 16616, + 16617, + 16618, + 16619, + 16620, + 16621, + 16622, + 16623, + 16624, + 16625, + 16626, + 16627, + 16628, + 16629, + 16630, + 16631, + 16632, + 16635, + 16636, + 16637, + 16638, + 16639, + 16640, + 16641, + 16642, + 16643, + 16644, + 16645, + 16646, + 16647, + 16648, + 16649, + 16650, + 16651, + 16652, + 16653, + 16654, + 16655, + 16656, + 16658, + 16659, + 16660, + 16661, + 16663, + 16665, + 16666, + 16667, + 16668, + 16669, + 16670, + 16671, + 16672, + 16673, + 16674, + 16675, + 16676, + 16677, + 16678, + 16679, + 16680, + 16681, + 16682, + 16683, + 16684, + 16685, + 16686, + 16687, + 16688, + 16689, + 16690, + 16691, + 16692, + 16693, + 16694, + 16695, + 16696, + 16697, + 16698, + 16699, + 16701, + 16702, + 16703, + 16704, + 16705, + 16706, + 16708, + 16709, + 16710, + 16711, + 16712, + 16713, + 16714, + 16715, + 16716, + 16717, + 16718, + 16719, + 16720, + 16721, + 16722, + 16723, + 16724, + 16726, + 16727, + 16728, + 16729, + 16730, + 16731, + 16732, + 16733, + 16734, + 16735, + 16736, + 16737, + 16738, + 16739, + 16740, + 16741, + 16742, + 16743, + 16744, + 16745, + 16746, + 16747, + 16748, + 16749, + 16750, + 16751, + 16752, + 16753, + 16754, + 16755, + 16756, + 16757, + 16758, + 16759, + 16761, + 16762, + 16763, + 16764, + 16765, + 16766, + 16767, + 16768, + 16769, + 16770, + 16771, + 16772, + 16773, + 16775, + 16776, + 16777, + 16778, + 16779, + 16780, + 16781, + 16782, + 16783, + 16784, + 16785, + 16786, + 16787, + 16788, + 16789, + 16790, + 16792, + 16793, + 16795, + 16796, + 16797, + 16798, + 16799, + 16800, + 16801, + 16802, + 16803, + 16804, + 16805, + 16806, + 16807, + 16809, + 16810, + 16811, + 16812, + 16813, + 16814, + 16815, + 16816, + 16817, + 16819, + 16820, + 16821, + 16822, + 16824, + 16825, + 16826, + 16827, + 16828, + 16829, + 16830, + 16831, + 16832, + 16833, + 16834, + 16835, + 16836, + 16837, + 16838, + 16839, + 16840, + 16841, + 16842, + 16843, + 16844, + 16846, + 16847, + 16848, + 16849, + 16850, + 16851, + 16852, + 16853, + 16854, + 16856, + 16857, + 16858, + 16859, + 16860, + 16861, + 16862, + 16863, + 16864, + 16865, + 16866, + 16867, + 16868, + 16869, + 16870, + 16871, + 16872, + 16873, + 16874, + 16875, + 16876, + 16877, + 16878, + 16879, + 16880, + 16881, + 16882, + 16883, + 16884, + 16885, + 16886, + 16887, + 16889, + 16891, + 16892, + 16893, + 16895, + 16896, + 16897, + 16898, + 16899, + 16900, + 16901, + 16902, + 16903, + 16904, + 16905, + 16907, + 16908, + 16909, + 16910, + 16911, + 16912, + 16913, + 16914, + 16915, + 16916, + 16917, + 16918, + 16919, + 16920, + 16921, + 16922, + 16923, + 16925, + 16926, + 16927, + 16928, + 16929, + 16930, + 16931, + 16932, + 16933, + 16934, + 16935, + 16936, + 16937, + 16938, + 16939, + 16940, + 16942, + 16943, + 16944, + 16946, + 16947, + 16948, + 16949, + 16950, + 16951, + 16952, + 16953, + 16954, + 16955, + 16956, + 16957, + 16958, + 16959, + 16960, + 16961, + 16962, + 16963, + 16965, + 16966, + 16967, + 16968, + 16969, + 16970, + 16971, + 16972, + 16973, + 16974, + 16975, + 16976, + 16977, + 16978, + 16979, + 16980, + 16981, + 16982, + 16983, + 16984, + 16985, + 16986, + 16987, + 16988, + 16989, + 16990, + 16991, + 16992, + 16994, + 16995, + 16996, + 16998, + 16999, + 17000, + 17001, + 17002, + 17003, + 17004, + 17005, + 17006, + 17008, + 17010, + 17011, + 17013, + 17014, + 17015, + 17016, + 17017, + 17018, + 17019, + 17020, + 17021, + 17022, + 17023, + 17024, + 17025, + 17026, + 17027, + 17028, + 17029, + 17031, + 17032, + 17033, + 17034, + 17035, + 17036, + 17037, + 17038, + 17039, + 17040, + 17041, + 17042, + 17043, + 17044, + 17045, + 17046, + 17048, + 17049, + 17050, + 17051, + 17052, + 17054, + 17055, + 17056, + 17057, + 17058, + 17060, + 17061, + 17062, + 17063, + 17064, + 17065, + 17066, + 17067, + 17068, + 17069, + 17070, + 17071, + 17073, + 17074, + 17075, + 17076, + 17077, + 17078, + 17079, + 17080, + 17081, + 17082, + 17083, + 17084, + 17085, + 17086, + 17087, + 17088, + 17089, + 17090, + 17091, + 17092, + 17093, + 17094, + 17095, + 17096, + 17097, + 17098, + 17099, + 17100, + 17101, + 17103, + 17105, + 17106, + 17107, + 17108, + 17109, + 17110, + 17111, + 17112, + 17113, + 17114, + 17115, + 17117, + 17118, + 17119, + 17120, + 17121, + 17122, + 17123, + 17124, + 17125, + 17126, + 17127, + 17128, + 17129, + 17130, + 17132, + 17134, + 17135, + 17136, + 17137, + 17138, + 17139, + 17140, + 17142, + 17143, + 17144, + 17145, + 17146, + 17147, + 17148, + 17149, + 17150, + 17151, + 17152, + 17153, + 17154, + 17155, + 17156, + 17157, + 17158, + 17159, + 17160, + 17161, + 17162, + 17163, + 17164, + 17165, + 17166, + 17167, + 17168, + 17169, + 17170, + 17171, + 17172, + 17173, + 17174, + 17176, + 17177, + 17178, + 17179, + 17180, + 17181, + 17183, + 17184, + 17185, + 17186, + 17187, + 17188, + 17190, + 17191, + 17192, + 17193, + 17194, + 17195, + 17196, + 17197, + 17198, + 17199, + 17200, + 17201, + 17202, + 17203, + 17204, + 17206, + 17207, + 17208, + 17209, + 17210, + 17211, + 17212, + 17213, + 17215, + 17216, + 17218, + 17219, + 17220, + 17221, + 17222, + 17223, + 17224, + 17225, + 17226, + 17227, + 17228, + 17229, + 17230, + 17231, + 17232, + 17233, + 17235, + 17236, + 17237, + 17238, + 17240, + 17241, + 17242, + 17243, + 17244, + 17247, + 17248, + 17249, + 17250, + 17251, + 17253, + 17254, + 17255, + 17256, + 17257, + 17258, + 17259, + 17260, + 17261, + 17262, + 17263, + 17264, + 17265, + 17266, + 17267, + 17268, + 17269, + 17270, + 17271, + 17272, + 17273, + 17274, + 17275, + 17276, + 17277, + 17278, + 17280, + 17281, + 17282, + 17283, + 17284, + 17285, + 17286, + 17287, + 17288, + 17289, + 17290, + 17291, + 17292, + 17293, + 17294, + 17295, + 17296, + 17297, + 17298, + 17299, + 17300, + 17302, + 17303, + 17304, + 17305, + 17306, + 17307, + 17309, + 17310, + 17311, + 17312, + 17313, + 17314, + 17315, + 17316, + 17317, + 17318, + 17319, + 17320, + 17321, + 17322, + 17324, + 17325, + 17326, + 17327, + 17328, + 17329, + 17330, + 17331, + 17332, + 17333, + 17334, + 17335, + 17336, + 17337, + 17339, + 17340, + 17341, + 17342, + 17343, + 17344, + 17345, + 17347, + 17348, + 17349, + 17350, + 17351, + 17352, + 17353, + 17354, + 17355, + 17356, + 17357, + 17358, + 17359, + 17360, + 17361, + 17363, + 17364, + 17365, + 17366, + 17367, + 17368, + 17369, + 17370, + 17372, + 17373, + 17374, + 17375, + 17376, + 17377, + 17378, + 17379, + 17382, + 17383, + 17384, + 17385, + 17386, + 17387, + 17388, + 17389, + 17391, + 17392, + 17393, + 17394, + 17395, + 17396, + 17397, + 17398, + 17399, + 17400, + 17401, + 17402, + 17403, + 17404, + 17405, + 17406, + 17407, + 17408, + 17409, + 17411, + 17412, + 17415, + 17416, + 17417, + 17418, + 17419, + 17420, + 17421, + 17422, + 17423, + 17424, + 17425, + 17426, + 17427, + 17428, + 17429, + 17430, + 17431, + 17432, + 17433, + 17434, + 17435, + 17437, + 17438, + 17439, + 17440, + 17441, + 17442, + 17443, + 17444, + 17445, + 17446, + 17447, + 17448, + 17449, + 17451, + 17452, + 17453, + 17454, + 17455, + 17456, + 17458, + 17459, + 17460, + 17461, + 17462, + 17463, + 17464, + 17466, + 17467, + 17468, + 17469, + 17470, + 17471, + 17472, + 17473, + 17474, + 17475, + 17476, + 17477, + 17478, + 17479, + 17480, + 17481, + 17482, + 17483, + 17484, + 17485, + 17486, + 17487, + 17488, + 17489, + 17491, + 17492, + 17493, + 17494, + 17495, + 17496, + 17497, + 17498, + 17499, + 17500, + 17501, + 17502, + 17503, + 17504, + 17505, + 17506, + 17507, + 17508, + 17510, + 17513, + 17514, + 17515, + 17516, + 17517, + 17518, + 17519, + 17520, + 17521, + 17522, + 17523, + 17524, + 17526, + 17527, + 17528, + 17529, + 17530, + 17532, + 17533, + 17534, + 17536, + 17538, + 17539, + 17540, + 17541, + 17542, + 17543, + 17544, + 17545, + 17546, + 17548, + 17549, + 17550, + 17551, + 17552, + 17553, + 17554, + 17555, + 17556, + 17557, + 17558, + 17559, + 17560, + 17561, + 17563, + 17564, + 17565, + 17566, + 17568, + 17569, + 17570, + 17571, + 17572, + 17573, + 17574, + 17575, + 17576, + 17577, + 17578, + 17579, + 17580, + 17581, + 17582, + 17583, + 17584, + 17585, + 17586, + 17587, + 17588, + 17589, + 17590, + 17592, + 17593, + 17594, + 17595, + 17596, + 17597, + 17598, + 17599, + 17600, + 17602, + 17603, + 17604, + 17605, + 17606, + 17607, + 17608, + 17610, + 17611, + 17612, + 17614, + 17615, + 17617, + 17618, + 17620, + 17621, + 17622, + 17623, + 17624, + 17626, + 17627, + 17628, + 17631, + 17632, + 17633, + 17634, + 17635, + 17636, + 17637, + 17638, + 17639, + 17640, + 17641, + 17642, + 17643, + 17644, + 17645, + 17646, + 17647, + 17648, + 17650, + 17651, + 17652, + 17653, + 17654, + 17655, + 17656, + 17657, + 17658, + 17659, + 17660, + 17661, + 17662, + 17663, + 17664, + 17665, + 17666, + 17667, + 17668, + 17669, + 17671, + 17672, + 17673, + 17674, + 17675, + 17676, + 17677, + 17678, + 17679, + 17680, + 17682, + 17683, + 17684, + 17685, + 17686, + 17687, + 17688, + 17689, + 17690, + 17691, + 17692, + 17693, + 17696, + 17697, + 17698, + 17699, + 17700, + 17701, + 17702, + 17703, + 17704, + 17705, + 17706, + 17707, + 17708, + 17709, + 17710, + 17712, + 17713, + 17714, + 17715, + 17716, + 17717, + 17718, + 17719, + 17720, + 17721, + 17722, + 17723, + 17724, + 17725, + 17726, + 17727, + 17728, + 17729, + 17730, + 17731, + 17732, + 17733, + 17734, + 17735, + 17737, + 17738, + 17739, + 17740, + 17741, + 17742, + 17743, + 17744, + 17745, + 17746, + 17747, + 17748, + 17749, + 17750, + 17751, + 17752, + 17753, + 17754, + 17755, + 17756, + 17757, + 17758, + 17759, + 17760, + 17761, + 17762, + 17763, + 17764, + 17765, + 17766, + 17767, + 17768, + 17769, + 17770, + 17771, + 17772, + 17773, + 17774, + 17775, + 17776, + 17777, + 17778, + 17779, + 17780, + 17781, + 17782, + 17783, + 17784, + 17786, + 17787, + 17789, + 17791, + 17792, + 17793, + 17794, + 17795, + 17796, + 17797, + 17798, + 17799, + 17800, + 17801, + 17802, + 17803, + 17804, + 17805, + 17806, + 17807, + 17808, + 17809, + 17810, + 17811, + 17812, + 17813, + 17814, + 17815, + 17816, + 17817, + 17818, + 17819, + 17820, + 17821, + 17822, + 17824, + 17825, + 17826, + 17827, + 17828, + 17829, + 17830, + 17831, + 17832, + 17833, + 17835, + 17836, + 17837, + 17838, + 17839, + 17841, + 17842, + 17843, + 17844, + 17845, + 17846, + 17847, + 17848, + 17849, + 17851, + 17852, + 17853, + 17854, + 17855, + 17856, + 17857, + 17858, + 17860, + 17861, + 17862, + 17863, + 17864, + 17865, + 17866, + 17867, + 17868, + 17869, + 17870, + 17871, + 17872, + 17873, + 17874, + 17875, + 17876, + 17877, + 17878, + 17879, + 17880, + 17881, + 17882, + 17883, + 17884, + 17885, + 17886, + 17887, + 17888, + 17889, + 17890, + 17891, + 17892, + 17893, + 17894, + 17896, + 17897, + 17898, + 17899, + 17900, + 17901, + 17902, + 17904, + 17905, + 17906, + 17908, + 17909, + 17910, + 17911, + 17912, + 17913, + 17914, + 17915, + 17916, + 17917, + 17918, + 17919, + 17920, + 17921, + 17922, + 17923, + 17924, + 17925, + 17926, + 17927, + 17928, + 17929, + 17930, + 17931, + 17932, + 17933, + 17934, + 17935, + 17936, + 17937, + 17939, + 17940, + 17941, + 17942, + 17943, + 17944, + 17945, + 17946, + 17947, + 17949, + 17950, + 17951, + 17952, + 17953, + 17954, + 17955, + 17956, + 17958, + 17959, + 17960, + 17961, + 17962, + 17963, + 17964, + 17965, + 17966, + 17968, + 17969, + 17971, + 17972, + 17973, + 17974, + 17975, + 17976, + 17977, + 17978, + 17979, + 17980, + 17981, + 17982, + 17983, + 17984, + 17985, + 17986, + 17987, + 17988, + 17989, + 17990, + 17991, + 17992, + 17993, + 17994, + 17995, + 17996, + 17997, + 17998, + 17999, + 18000, + 18004, + 18005, + 18006, + 18007, + 18008, + 18009, + 18010, + 18011, + 18012, + 18013, + 18014, + 18015, + 18016, + 18017, + 18018, + 18019, + 18020, + 18021, + 18022, + 18023, + 18024, + 18025, + 18026, + 18028, + 18029, + 18030, + 18034, + 18035, + 18036, + 18037, + 18039, + 18040, + 18041, + 18042, + 18043, + 18044, + 18045, + 18046, + 18049, + 18051, + 18052, + 18053, + 18054, + 18055, + 18056, + 18057, + 18058, + 18059, + 18060, + 18061, + 18063, + 18064, + 18065, + 18066, + 18067, + 18068, + 18069, + 18070, + 18071, + 18072, + 18074, + 18075, + 18076, + 18077, + 18079, + 18080, + 18082, + 18083, + 18084, + 18085, + 18086, + 18087, + 18088, + 18090, + 18091, + 18092, + 18093, + 18094, + 18095, + 18096, + 18097, + 18098, + 18099, + 18100, + 18101, + 18102, + 18103, + 18104, + 18105, + 18106, + 18107, + 18108, + 18109, + 18111, + 18114, + 18115, + 18116, + 18117, + 18118, + 18119, + 18120, + 18121, + 18122, + 18123, + 18124, + 18125, + 18126, + 18128, + 18129, + 18130, + 18131, + 18132, + 18133, + 18134, + 18135, + 18136, + 18137, + 18138, + 18139, + 18140, + 18141, + 18142, + 18143, + 18144, + 18145, + 18146, + 18147, + 18148, + 18149, + 18150, + 18151, + 18152, + 18153, + 18154, + 18155, + 18156, + 18157, + 18158, + 18159, + 18160, + 18161, + 18162, + 18163, + 18165, + 18166, + 18167, + 18168, + 18169, + 18170, + 18171, + 18172, + 18173, + 18174, + 18175, + 18176, + 18177, + 18178, + 18179, + 18180, + 18181, + 18182, + 18183, + 18184, + 18185, + 18186, + 18187, + 18188, + 18189, + 18190, + 18191, + 18192, + 18193, + 18194, + 18195, + 18196, + 18197, + 18198, + 18199, + 18200, + 18201, + 18202, + 18203, + 18204, + 18205, + 18206, + 18208, + 18209, + 18210, + 18211, + 18212, + 18213, + 18214, + 18215, + 18216, + 18217, + 18218, + 18219, + 18220, + 18221, + 18222, + 18223, + 18224, + 18225, + 18227, + 18228, + 18229, + 18230, + 18232, + 18233, + 18234, + 18235, + 18236, + 18237, + 18238, + 18239, + 18240, + 18242, + 18243, + 18244, + 18245, + 18246, + 18247, + 18248, + 18249, + 18251, + 18252, + 18253, + 18254, + 18255, + 18256, + 18258, + 18259, + 18260, + 18261, + 18262, + 18263, + 18264, + 18265, + 18267, + 18268, + 18269, + 18270, + 18271, + 18272, + 18273, + 18274, + 18275, + 18276, + 18277, + 18278, + 18279, + 18280, + 18282, + 18283, + 18284, + 18285, + 18286, + 18287, + 18288, + 18289, + 18290, + 18291, + 18292, + 18293, + 18294, + 18295, + 18296, + 18297, + 18298, + 18299, + 18300, + 18301, + 18302, + 18304, + 18305, + 18306, + 18307, + 18308, + 18309, + 18310, + 18311, + 18312, + 18313, + 18314, + 18316, + 18318, + 18319, + 18320, + 18321, + 18322, + 18323, + 18324, + 18325, + 18326, + 18327, + 18328, + 18329, + 18330, + 18331, + 18332, + 18333, + 18334, + 18335, + 18337, + 18338, + 18339, + 18340, + 18341, + 18342, + 18343, + 18344, + 18345, + 18346, + 18347, + 18348, + 18349, + 18350, + 18351, + 18352, + 18353, + 18354, + 18355, + 18356, + 18357, + 18358, + 18359, + 18360, + 18361, + 18362, + 18363, + 18364, + 18365, + 18367, + 18368, + 18369, + 18370, + 18371, + 18372, + 18373, + 18374, + 18375, + 18376, + 18377, + 18378, + 18379, + 18380, + 18381, + 18382, + 18383, + 18384, + 18385, + 18386, + 18387, + 18388, + 18389, + 18390, + 18391, + 18392, + 18393, + 18394, + 18395, + 18396, + 18397, + 18399, + 18401, + 18402, + 18403, + 18406, + 18407, + 18408, + 18409, + 18410, + 18411, + 18412, + 18414, + 18415, + 18416, + 18417, + 18419, + 18420, + 18421, + 18422, + 18423, + 18424, + 18425, + 18426, + 18427, + 18428, + 18430, + 18431, + 18433, + 18434, + 18435, + 18436, + 18437, + 18438, + 18440, + 18441, + 18442, + 18443, + 18444, + 18445, + 18446, + 18447, + 18448, + 18449, + 18451, + 18453, + 18454, + 18455, + 18456, + 18458, + 18459, + 18460, + 18461, + 18462, + 18463, + 18464, + 18465, + 18466, + 18468, + 18469, + 18470, + 18471, + 18474, + 18475, + 18476, + 18477, + 18478, + 18479, + 18480, + 18481, + 18482, + 18483, + 18484, + 18485, + 18486, + 18487, + 18488, + 18489, + 18490, + 18491, + 18492, + 18493, + 18494, + 18495, + 18496, + 18497, + 18498, + 18499, + 18500, + 18501, + 18502, + 18503, + 18504, + 18505, + 18506, + 18507, + 18508, + 18509, + 18510, + 18511, + 18512, + 18513, + 18514, + 18515, + 18516, + 18517, + 18518, + 18519, + 18520, + 18521, + 18522, + 18523, + 18524, + 18525, + 18526, + 18527, + 18528, + 18529, + 18530, + 18531, + 18532, + 18533, + 18534, + 18535, + 18537, + 18538, + 18540, + 18541, + 18542, + 18543, + 18544, + 18545, + 18546, + 18547, + 18548, + 18549, + 18550, + 18551, + 18552, + 18553, + 18554, + 18555, + 18556, + 18557, + 18558, + 18559, + 18560, + 18561, + 18562, + 18563, + 18564, + 18566, + 18567, + 18568, + 18569, + 18570, + 18571, + 18572, + 18573, + 18574, + 18575, + 18576, + 18577, + 18578, + 18579, + 18580, + 18581, + 18582, + 18583, + 18584, + 18586, + 18587, + 18588, + 18589, + 18590, + 18591, + 18592, + 18593, + 18594, + 18595, + 18596, + 18597, + 18598, + 18600, + 18601, + 18602, + 18603, + 18604, + 18606, + 18607, + 18608, + 18609, + 18610, + 18611, + 18612, + 18613, + 18614, + 18615, + 18616, + 18618, + 18619, + 18620, + 18621, + 18622, + 18624, + 18625, + 18626, + 18627, + 18628, + 18629, + 18630, + 18631, + 18632, + 18633, + 18634, + 18635, + 18636, + 18637, + 18639, + 18640, + 18641, + 18642, + 18643, + 18644, + 18645, + 18647, + 18648, + 18649, + 18650, + 18651, + 18653, + 18654, + 18655, + 18656, + 18657, + 18658, + 18659, + 18660, + 18661, + 18662, + 18663, + 18664, + 18666, + 18667, + 18668, + 18669, + 18670, + 18671, + 18672, + 18673, + 18674, + 18675, + 18676, + 18677, + 18678, + 18680, + 18681, + 18682, + 18683, + 18684, + 18685, + 18687, + 18688, + 18689, + 18690, + 18691, + 18692, + 18693, + 18694, + 18695, + 18696, + 18698, + 18699, + 18700, + 18701, + 18702, + 18703, + 18704, + 18705, + 18706, + 18707, + 18708, + 18709, + 18710, + 18711, + 18712, + 18713, + 18714, + 18715, + 18716, + 18717, + 18718, + 18719, + 18720, + 18721, + 18722, + 18723, + 18724, + 18725, + 18726, + 18727, + 18728, + 18729, + 18730, + 18731, + 18732, + 18733, + 18734, + 18735, + 18736, + 18737, + 18738, + 18742, + 18743, + 18744, + 18745, + 18746, + 18747, + 18748, + 18749, + 18750, + 18751, + 18752, + 18753, + 18754, + 18755, + 18756, + 18757, + 18758, + 18759, + 18760, + 18761, + 18762, + 18763, + 18764, + 18765, + 18766, + 18767, + 18768, + 18769, + 18770, + 18771, + 18772, + 18773, + 18774, + 18776, + 18777, + 18779, + 18781, + 18782, + 18783, + 18784, + 18785, + 18786, + 18787, + 18788, + 18789, + 18790, + 18791, + 18792, + 18793, + 18794, + 18795, + 18796, + 18797, + 18798, + 18799, + 18800, + 18801, + 18802, + 18803, + 18804, + 18805, + 18806, + 18807, + 18808, + 18809, + 18810, + 18811, + 18812, + 18813, + 18814, + 18815, + 18816, + 18817, + 18818, + 18819, + 18820, + 18821, + 18822, + 18823, + 18824, + 18825, + 18826, + 18827, + 18828, + 18829, + 18830, + 18831, + 18832, + 18833, + 18834, + 18835, + 18836, + 18837, + 18838, + 18839, + 18840, + 18841, + 18842, + 18843, + 18844, + 18845, + 18846, + 18847, + 18849, + 18850, + 18851, + 18852, + 18853, + 18854, + 18855, + 18856, + 18857, + 18858, + 18859, + 18860, + 18861, + 18862, + 18863, + 18864, + 18865, + 18866, + 18867, + 18868, + 18869, + 18870, + 18871, + 18872, + 18873, + 18874, + 18875, + 18876, + 18878, + 18879, + 18880, + 18881, + 18882, + 18883, + 18884, + 18885, + 18886, + 18887, + 18888, + 18889, + 18890, + 18891, + 18892, + 18893, + 18894, + 18895, + 18896, + 18897, + 18898, + 18899, + 18900, + 18901, + 18902, + 18903, + 18904, + 18905, + 18906, + 18907, + 18908, + 18909, + 18910, + 18913, + 18914, + 18916, + 18918, + 18919, + 18920, + 18921, + 18922, + 18923, + 18924, + 18925, + 18926, + 18928, + 18929, + 18930, + 18931, + 18932, + 18933, + 18934, + 18936, + 18937, + 18938, + 18939, + 18941, + 18942, + 18943, + 18944, + 18945, + 18946, + 18947, + 18949, + 18950, + 18951, + 18952, + 18953, + 18954, + 18955, + 18956, + 18957, + 18958, + 18959, + 18961, + 18963, + 18965, + 18968, + 18970, + 18971, + 18972, + 18974, + 18975, + 18976, + 18977, + 18978, + 18979, + 18980, + 18981, + 18982, + 18983, + 18984, + 18985, + 18986, + 18987, + 18988, + 18989, + 18990, + 18991, + 18992, + 18993, + 18994, + 18995, + 18996, + 18997, + 18998, + 18999, + 19000, + 19001, + 19002, + 19003, + 19004, + 19005, + 19006, + 19007, + 19008, + 19009, + 19010, + 19013, + 19014, + 19015, + 19016, + 19017, + 19018, + 19019, + 19020, + 19021, + 19022, + 19023, + 19024, + 19025, + 19026, + 19027, + 19028, + 19030, + 19031, + 19032, + 19033, + 19034, + 19035, + 19036, + 19037, + 19040, + 19041, + 19042, + 19043, + 19044, + 19045, + 19046, + 19047, + 19048, + 19049, + 19050, + 19051, + 19052, + 19053, + 19055, + 19056, + 19057, + 19058, + 19059, + 19060, + 19061, + 19062, + 19063, + 19064, + 19065, + 19066, + 19067, + 19068, + 19069, + 19070, + 19071, + 19072, + 19073, + 19074, + 19075, + 19076, + 19077, + 19078, + 19079, + 19080, + 19081, + 19083, + 19084, + 19085, + 19086, + 19087, + 19088, + 19089, + 19090, + 19091, + 19092, + 19093, + 19094, + 19095, + 19096, + 19097, + 19098, + 19099, + 19101, + 19102, + 19103, + 19105, + 19108, + 19109, + 19110, + 19111, + 19112, + 19113, + 19114, + 19115, + 19116, + 19117, + 19118, + 19119, + 19120, + 19121, + 19122, + 19123, + 19124, + 19125, + 19127, + 19128, + 19130, + 19131, + 19132, + 19133, + 19134, + 19135, + 19136, + 19137, + 19138, + 19139, + 19140, + 19141, + 19142, + 19143, + 19144, + 19145, + 19146, + 19148, + 19149, + 19150, + 19151, + 19152, + 19153, + 19154, + 19155, + 19156, + 19157, + 19158, + 19159, + 19160, + 19161, + 19162, + 19163, + 19164, + 19166, + 19167, + 19168, + 19169, + 19170, + 19171, + 19172, + 19173, + 19174, + 19175, + 19176, + 19177, + 19178, + 19179, + 19180, + 19181, + 19182, + 19183, + 19184, + 19185, + 19186, + 19188, + 19189, + 19190, + 19191, + 19192, + 19193, + 19194, + 19195, + 19197, + 19198, + 19199, + 19200, + 19201, + 19202, + 19203, + 19204, + 19205, + 19206, + 19208, + 19209, + 19210, + 19211, + 19212, + 19213, + 19214, + 19215, + 19217, + 19218, + 19219, + 19220, + 19221, + 19222, + 19223, + 19224, + 19225, + 19226, + 19228, + 19230, + 19231, + 19232, + 19233, + 19234, + 19235, + 19236, + 19237, + 19238, + 19239, + 19240, + 19242, + 19243, + 19244, + 19245, + 19246, + 19247, + 19248, + 19249, + 19250, + 19251, + 19252, + 19253, + 19254, + 19255, + 19256, + 19257, + 19258, + 19259, + 19260, + 19261, + 19262, + 19263, + 19264, + 19265, + 19266, + 19267, + 19268, + 19269, + 19270, + 19271, + 19272, + 19273, + 19274, + 19275, + 19276, + 19277, + 19278, + 19279, + 19280, + 19281, + 19282, + 19283, + 19284, + 19285, + 19286, + 19288, + 19289, + 19290, + 19291, + 19292, + 19293, + 19294, + 19295, + 19296, + 19297, + 19299, + 19300, + 19301, + 19302, + 19303, + 19304, + 19305, + 19306, + 19308, + 19309, + 19310, + 19311, + 19312, + 19313, + 19314, + 19315, + 19316, + 19317, + 19318, + 19319, + 19320, + 19321, + 19322, + 19323, + 19324, + 19325, + 19326, + 19327, + 19328, + 19329, + 19330, + 19331, + 19332, + 19333, + 19334, + 19335, + 19336, + 19337, + 19338, + 19339, + 19341, + 19342, + 19343, + 19344, + 19345, + 19346, + 19347, + 19348, + 19351, + 19353, + 19354, + 19355, + 19356, + 19357, + 19358, + 19359, + 19360, + 19361, + 19362, + 19363, + 19364, + 19366, + 19367, + 19368, + 19369, + 19370, + 19371, + 19372, + 19373, + 19374, + 19375, + 19376, + 19377, + 19379, + 19380, + 19381, + 19382, + 19383, + 19384, + 19385, + 19386, + 19387, + 19388, + 19389, + 19390, + 19391, + 19392, + 19393, + 19394, + 19395, + 19396, + 19397, + 19399, + 19401, + 19402, + 19403, + 19404, + 19405, + 19406, + 19407, + 19408, + 19409, + 19410, + 19411, + 19412, + 19413, + 19415, + 19416, + 19417, + 19418, + 19419, + 19420, + 19421, + 19422, + 19423, + 19424, + 19425, + 19426, + 19428, + 19429, + 19430, + 19431, + 19432, + 19433, + 19434, + 19435, + 19436, + 19437, + 19438, + 19439, + 19440, + 19441, + 19442, + 19443, + 19444, + 19445, + 19446, + 19447, + 19448, + 19449, + 19450, + 19451, + 19452, + 19453, + 19455, + 19456, + 19457, + 19458, + 19460, + 19461, + 19462, + 19463, + 19464, + 19466, + 19467, + 19468, + 19469, + 19470, + 19471, + 19472, + 19473, + 19474, + 19475, + 19476, + 19477, + 19478, + 19479, + 19481, + 19482, + 19483, + 19484, + 19485, + 19486, + 19487, + 19489, + 19490, + 19491, + 19492, + 19493, + 19494, + 19495, + 19496, + 19497, + 19498, + 19499, + 19500, + 19501, + 19502, + 19503, + 19504, + 19505, + 19506, + 19507, + 19508, + 19510, + 19511, + 19512, + 19513, + 19514, + 19515, + 19516, + 19517, + 19518, + 19520, + 19521, + 19522, + 19523, + 19524, + 19525, + 19526, + 19527, + 19528, + 19529, + 19530, + 19531, + 19532, + 19533, + 19535, + 19536, + 19537, + 19538, + 19539, + 19540, + 19541, + 19542, + 19543, + 19544, + 19545, + 19547, + 19548, + 19550, + 19551, + 19552, + 19553, + 19554, + 19555, + 19557, + 19558, + 19559, + 19560, + 19561, + 19562, + 19563, + 19564, + 19565, + 19566, + 19567, + 19568, + 19569, + 19570, + 19571, + 19572, + 19573, + 19574, + 19575, + 19576, + 19577, + 19578, + 19580, + 19581, + 19582, + 19583, + 19584, + 19585, + 19586, + 19587, + 19588, + 19589, + 19590, + 19591, + 19592, + 19593, + 19594, + 19595, + 19596, + 19597, + 19598, + 19599, + 19600, + 19601, + 19602, + 19603, + 19605, + 19606, + 19607, + 19608, + 19609, + 19610, + 19611, + 19612, + 19613, + 19614, + 19615, + 19616, + 19617, + 19618, + 19619, + 19620, + 19621, + 19622, + 19623, + 19624, + 19625, + 19626, + 19627, + 19628, + 19629, + 19630, + 19631, + 19632, + 19633, + 19634, + 19635, + 19636, + 19638, + 19639, + 19640, + 19641, + 19642, + 19643, + 19644, + 19645, + 19646, + 19647, + 19648, + 19649, + 19650, + 19651, + 19652, + 19653, + 19654, + 19655, + 19656, + 19657, + 19658, + 19659, + 19660, + 19661, + 19662, + 19663, + 19664, + 19665, + 19666, + 19667, + 19668, + 19669, + 19670, + 19671, + 19672, + 19674, + 19675, + 19676, + 19677, + 19678, + 19679, + 19680, + 19681, + 19682, + 19683, + 19684, + 19685, + 19686, + 19687, + 19688, + 19689, + 19691, + 19692, + 19693, + 19694, + 19695, + 19696, + 19697, + 19698, + 19699, + 19701, + 19702, + 19703, + 19704, + 19705, + 19706, + 19707, + 19708, + 19709, + 19710, + 19711, + 19712, + 19713, + 19714, + 19715, + 19716, + 19717, + 19718, + 19719, + 19721, + 19722, + 19723, + 19724, + 19725, + 19726, + 19727, + 19728, + 19729, + 19730, + 19731, + 19732, + 19734, + 19735, + 19736, + 19737, + 19738, + 19739, + 19740, + 19741, + 19742, + 19743, + 19744, + 19745, + 19746, + 19747, + 19748, + 19749, + 19750, + 19752, + 19753, + 19754, + 19755, + 19756, + 19758, + 19759, + 19760, + 19761, + 19762, + 19763, + 19764, + 19765, + 19766, + 19767, + 19768, + 19769, + 19770, + 19771, + 19772, + 19773, + 19774, + 19775, + 19776, + 19777, + 19778, + 19779, + 19780, + 19781, + 19782, + 19783, + 19785, + 19786, + 19787, + 19788, + 19789, + 19790, + 19791, + 19792, + 19794, + 19795, + 19796, + 19797, + 19798, + 19799, + 19800, + 19801, + 19802, + 19803, + 19804, + 19805, + 19806, + 19807, + 19808, + 19809, + 19810, + 19811, + 19812, + 19813, + 19814, + 19815, + 19816, + 19818, + 19819, + 19820, + 19821, + 19822, + 19823, + 19824, + 19825, + 19826, + 19827, + 19828, + 19829, + 19830, + 19831, + 19832, + 19833, + 19834, + 19835, + 19837, + 19838, + 19839, + 19840, + 19841, + 19842, + 19843, + 19844, + 19846, + 19847, + 19848, + 19849, + 19850, + 19852, + 19853, + 19854, + 19855, + 19856, + 19857, + 19858, + 19859, + 19861, + 19862, + 19863, + 19864, + 19865, + 19866, + 19867, + 19868, + 19869, + 19870, + 19871, + 19872, + 19873, + 19874, + 19875, + 19876, + 19877, + 19878, + 19879, + 19881, + 19882, + 19883, + 19884, + 19885, + 19886, + 19887, + 19888, + 19889, + 19891, + 19892, + 19893, + 19894, + 19895, + 19896, + 19897, + 19898, + 19899, + 19900, + 19901, + 19902, + 19903, + 19904, + 19905, + 19906, + 19907, + 19908, + 19909, + 19911, + 19912, + 19913, + 19914, + 19915, + 19916, + 19917, + 19918, + 19919, + 19920, + 19921, + 19922, + 19923, + 19924, + 19925, + 19926, + 19927, + 19928, + 19929, + 19930, + 19931, + 19932, + 19933, + 19934, + 19935, + 19936, + 19937, + 19938, + 19939, + 19940, + 19941, + 19942, + 19943, + 19944, + 19945, + 19947, + 19948, + 19949, + 19950, + 19951, + 19952, + 19955, + 19956, + 19957, + 19958, + 19959, + 19961, + 19962, + 19963, + 19964, + 19965, + 19966, + 19967, + 19968, + 19969, + 19970, + 19971, + 19972, + 19974, + 19975, + 19976, + 19977, + 19978, + 19979, + 19980, + 19981, + 19983, + 19984, + 19985, + 19986, + 19988, + 19989, + 19990, + 19991, + 19992, + 19993, + 19994, + 19995, + 19996, + 19997, + 19998, + 19999, + 20000, + 20001, + 20002, + 20003, + 20004, + 20005, + 20006, + 20007, + 20008, + 20009, + 20010, + 20011, + 20012, + 20013, + 20015, + 20016, + 20017, + 20018, + 20019, + 20020, + 20021, + 20022, + 20023, + 20024, + 20025, + 20026, + 20027, + 20028, + 20029, + 20030, + 20031, + 20032, + 20033, + 20034, + 20035, + 20036, + 20037, + 20038, + 20040, + 20041, + 20042, + 20043, + 20044, + 20045, + 20046, + 20047, + 20048, + 20049, + 20050, + 20051, + 20052, + 20053, + 20054, + 20055, + 20056, + 20057, + 20058, + 20059, + 20060, + 20061, + 20062, + 20063, + 20064, + 20065, + 20066, + 20067, + 20068, + 20069, + 20070, + 20071, + 20072, + 20073, + 20074, + 20075, + 20076, + 20077, + 20078, + 20079, + 20080, + 20081, + 20082, + 20083, + 20084, + 20085, + 20086, + 20087, + 20088, + 20089, + 20090, + 20093, + 20094, + 20095, + 20096, + 20097, + 20099, + 20100, + 20102, + 20103, + 20104, + 20105, + 20106, + 20107, + 20108, + 20109, + 20110, + 20111, + 20113, + 20114, + 20115, + 20116, + 20117, + 20118, + 20119, + 20120, + 20121, + 20122, + 20123, + 20124, + 20125, + 20127, + 20128, + 20129, + 20132, + 20133, + 20134, + 20135, + 20136, + 20137, + 20138, + 20139, + 20140, + 20142, + 20143, + 20144, + 20146, + 20147, + 20148, + 20149, + 20150, + 20151, + 20152, + 20153, + 20154, + 20155, + 20156, + 20157, + 20158, + 20159, + 20160, + 20161, + 20162, + 20164, + 20165, + 20166, + 20167, + 20168, + 20169, + 20170, + 20171, + 20172, + 20174, + 20175, + 20176, + 20177, + 20178, + 20179, + 20180, + 20181, + 20182, + 20183, + 20184, + 20185, + 20186, + 20187, + 20188, + 20189, + 20190, + 20191, + 20192, + 20193, + 20194, + 20195, + 20196, + 20197, + 20198, + 20199, + 20200, + 20202, + 20203, + 20204, + 20205, + 20207, + 20208, + 20209, + 20210, + 20212, + 20213, + 20214, + 20215, + 20216, + 20217, + 20218, + 20219, + 20220, + 20221, + 20222, + 20223, + 20224, + 20225, + 20226, + 20227, + 20228, + 20230, + 20231, + 20232, + 20233, + 20234, + 20236, + 20237, + 20238, + 20239, + 20240, + 20241, + 20242, + 20243, + 20244, + 20245, + 20246, + 20247, + 20248, + 20249, + 20250, + 20252, + 20253, + 20254, + 20255, + 20256, + 20257, + 20258, + 20259, + 20260, + 20261, + 20262, + 20263, + 20264, + 20265, + 20267, + 20268, + 20269, + 20270, + 20271, + 20272, + 20273, + 20274, + 20275, + 20276, + 20277, + 20280, + 20281, + 20282, + 20283, + 20284, + 20285, + 20286, + 20287, + 20288, + 20289, + 20290, + 20291, + 20292, + 20293, + 20295, + 20296, + 20297, + 20298, + 20299, + 20300, + 20301, + 20302, + 20303, + 20304, + 20305, + 20306, + 20308, + 20309, + 20310, + 20311, + 20312, + 20313, + 20314, + 20315, + 20317, + 20318, + 20319, + 20320, + 20321, + 20322, + 20323, + 20324, + 20325, + 20326, + 20327, + 20328, + 20329, + 20330, + 20331, + 20332, + 20334, + 20335, + 20336, + 20337, + 20338, + 20339, + 20340, + 20341, + 20342, + 20343, + 20344, + 20345, + 20346, + 20347, + 20348, + 20349, + 20350, + 20353, + 20354, + 20355, + 20356, + 20357, + 20358, + 20359, + 20361, + 20362, + 20363, + 20364, + 20365, + 20366, + 20367, + 20368, + 20369, + 20370, + 20371, + 20372, + 20373, + 20374, + 20375, + 20376, + 20377, + 20379, + 20380, + 20381, + 20382, + 20383, + 20384, + 20385, + 20386, + 20387, + 20388, + 20389, + 20390, + 20392, + 20393, + 20394, + 20395, + 20396, + 20397, + 20398, + 20399, + 20400, + 20401, + 20402, + 20403, + 20404, + 20405, + 20406, + 20407, + 20408, + 20409, + 20410, + 20411, + 20412, + 20413, + 20414, + 20415, + 20416, + 20418, + 20419, + 20420, + 20421, + 20422, + 20423, + 20424, + 20425, + 20426, + 20427, + 20428, + 20429, + 20430, + 20431, + 20432, + 20433, + 20434, + 20435, + 20437, + 20438, + 20439, + 20440, + 20441, + 20442, + 20443, + 20444, + 20445, + 20446, + 20447, + 20448, + 20449, + 20451, + 20452, + 20453, + 20454, + 20455, + 20456, + 20457, + 20458, + 20459, + 20460, + 20461, + 20462, + 20463, + 20464, + 20465, + 20466, + 20467, + 20468, + 20469, + 20470, + 20471, + 20472, + 20473, + 20475, + 20476, + 20477, + 20478, + 20479, + 20480, + 20481, + 20483, + 20484, + 20485, + 20486, + 20487, + 20488, + 20489, + 20490, + 20491, + 20492, + 20494, + 20495, + 20497, + 20499, + 20500, + 20501, + 20502, + 20503, + 20504, + 20505, + 20506, + 20507, + 20508, + 20509, + 20510, + 20511, + 20512, + 20514, + 20515, + 20516, + 20518, + 20519, + 20520, + 20521, + 20522, + 20523, + 20524, + 20525, + 20526, + 20527, + 20528, + 20529, + 20530, + 20531, + 20532, + 20533, + 20534, + 20535, + 20536, + 20537, + 20539, + 20540, + 20541, + 20542, + 20543, + 20544, + 20545, + 20546, + 20547, + 20548, + 20549, + 20550, + 20551, + 20552, + 20553, + 20554, + 20555, + 20556, + 20558, + 20559, + 20561, + 20562, + 20565, + 20567, + 20568, + 20569, + 20570, + 20571, + 20572, + 20573, + 20575, + 20576, + 20577, + 20578, + 20579, + 20580, + 20581, + 20582, + 20583, + 20584, + 20585, + 20586, + 20587, + 20588, + 20589, + 20590, + 20591, + 20592, + 20594, + 20595, + 20597, + 20598, + 20599, + 20600, + 20601, + 20602, + 20603, + 20605, + 20606, + 20607, + 20608, + 20610, + 20611, + 20612, + 20613, + 20614, + 20615, + 20616, + 20618, + 20619, + 20620, + 20621, + 20622, + 20625, + 20626, + 20627, + 20628, + 20629, + 20630, + 20631, + 20632, + 20633, + 20634, + 20635, + 20637, + 20638, + 20639, + 20640, + 20641, + 20642, + 20643, + 20645, + 20646, + 20647, + 20648, + 20649, + 20650, + 20651, + 20652, + 20653, + 20654, + 20655, + 20656, + 20657, + 20658, + 20659, + 20661, + 20663, + 20664, + 20666, + 20667, + 20668, + 20669, + 20670, + 20671, + 20672, + 20673, + 20674, + 20675, + 20676, + 20677, + 20678, + 20679, + 20680, + 20681, + 20682, + 20683, + 20684, + 20685, + 20686, + 20687, + 20688, + 20689, + 20690, + 20691, + 20692, + 20693, + 20694, + 20695, + 20696, + 20697, + 20698, + 20699, + 20700, + 20701, + 20702, + 20703, + 20706, + 20707, + 20708, + 20709, + 20710, + 20711, + 20712, + 20713, + 20714, + 20715, + 20716, + 20717, + 20718, + 20719, + 20720, + 20721, + 20723, + 20724, + 20725, + 20726, + 20727, + 20728, + 20729, + 20732, + 20733, + 20734, + 20735, + 20736, + 20737, + 20738, + 20739, + 20740, + 20742, + 20744, + 20745, + 20746, + 20747, + 20748, + 20749, + 20750, + 20752, + 20754, + 20755, + 20756, + 20757, + 20759, + 20760, + 20761, + 20762, + 20763, + 20764, + 20765, + 20766, + 20767, + 20768, + 20769, + 20770, + 20771, + 20772, + 20773, + 20774, + 20775, + 20776, + 20777, + 20778, + 20779, + 20780, + 20781, + 20782, + 20784, + 20785, + 20786, + 20787, + 20788, + 20789, + 20790, + 20791, + 20792, + 20793, + 20794, + 20795, + 20796, + 20797, + 20798, + 20799, + 20800, + 20801, + 20802, + 20803, + 20804, + 20805, + 20806, + 20807, + 20808, + 20809, + 20810, + 20811, + 20812, + 20813, + 20815, + 20816, + 20817, + 20818, + 20819, + 20821, + 20822, + 20824, + 20825, + 20826, + 20828, + 20829, + 20830, + 20831, + 20832, + 20833, + 20834, + 20835, + 20836, + 20838, + 20840, + 20841, + 20842, + 20843, + 20844, + 20845, + 20846, + 20847, + 20848, + 20849, + 20850, + 20851, + 20852, + 20853, + 20854, + 20855, + 20856, + 20857, + 20858, + 20859, + 20860, + 20861, + 20862, + 20863, + 20864, + 20865, + 20866, + 20867, + 20868, + 20869, + 20870, + 20871, + 20872, + 20873, + 20875, + 20876, + 20877, + 20878, + 20879, + 20880, + 20881, + 20882, + 20883, + 20884, + 20885, + 20886, + 20887, + 20888, + 20889, + 20890, + 20891, + 20892, + 20893, + 20894, + 20895, + 20897, + 20898, + 20899, + 20900, + 20901, + 20902, + 20903, + 20904, + 20905, + 20906, + 20907, + 20908, + 20909, + 20910, + 20911, + 20912, + 20913, + 20914, + 20915, + 20916, + 20917, + 20918, + 20919, + 20920, + 20921, + 20922, + 20923, + 20924, + 20925, + 20926, + 20928, + 20929, + 20930, + 20931, + 20932, + 20933, + 20934, + 20935, + 20936, + 20937, + 20938, + 20939, + 20940, + 20941, + 20942, + 20943, + 20944, + 20945, + 20946, + 20947, + 20949, + 20950, + 20951, + 20952, + 20953, + 20954, + 20955, + 20956, + 20957, + 20958, + 20959, + 20961, + 20963, + 20964, + 20965, + 20966, + 20967, + 20968, + 20970, + 20971, + 20972, + 20973, + 20974, + 20975, + 20976, + 20977, + 20979, + 20980, + 20981, + 20984, + 20985, + 20987, + 20988, + 20989, + 20990, + 20991, + 20992, + 20993, + 20994, + 20995, + 20996, + 20997, + 20998, + 20999, + 21000, + 21001, + 21002, + 21003, + 21004, + 21005, + 21006, + 21008, + 21009, + 21010, + 21012, + 21013, + 21014, + 21016, + 21017, + 21018, + 21019, + 21020, + 21021, + 21022, + 21023, + 21024, + 21026, + 21028, + 21029, + 21030, + 21031, + 21032, + 21033, + 21035, + 21036, + 21037, + 21038, + 21039, + 21040, + 21042, + 21043, + 21044, + 21045, + 21046, + 21047, + 21048, + 21049, + 21053, + 21054, + 21055, + 21056, + 21057, + 21058, + 21059, + 21060, + 21061, + 21062, + 21063, + 21064, + 21065, + 21066, + 21067, + 21068, + 21069, + 21070, + 21071, + 21072, + 21073, + 21074, + 21075, + 21076, + 21077, + 21078, + 21079, + 21080, + 21081, + 21082, + 21083, + 21084, + 21085, + 21086, + 21087, + 21088, + 21089, + 21090, + 21091, + 21092, + 21093, + 21094, + 21095, + 21096, + 21097, + 21098, + 21099, + 21100, + 21101, + 21102, + 21103, + 21104, + 21105, + 21106, + 21107, + 21108, + 21109, + 21110, + 21111, + 21112, + 21113, + 21115, + 21116, + 21117, + 21118, + 21120, + 21122, + 21123, + 21124, + 21125, + 21126, + 21127, + 21128, + 21129, + 21130, + 21131, + 21132, + 21133, + 21135, + 21136, + 21137, + 21138, + 21139, + 21140, + 21141, + 21142, + 21143, + 21145, + 21146, + 21147, + 21148, + 21149, + 21150, + 21151, + 21152, + 21154, + 21155, + 21156, + 21157, + 21158, + 21159, + 21160, + 21161, + 21163, + 21164, + 21166, + 21167, + 21168, + 21170, + 21171, + 21172, + 21173, + 21175, + 21176, + 21177, + 21178, + 21179, + 21180, + 21181, + 21183, + 21184, + 21185, + 21186, + 21187, + 21188, + 21190, + 21191, + 21192, + 21194, + 21195, + 21196, + 21197, + 21198, + 21199, + 21200, + 21201, + 21203, + 21204, + 21205, + 21206, + 21207, + 21208, + 21209, + 21211, + 21212, + 21213, + 21214, + 21215, + 21216, + 21217, + 21218, + 21219, + 21220, + 21221, + 21222, + 21223, + 21224, + 21225, + 21226, + 21227, + 21228, + 21229, + 21230, + 21231, + 21232, + 21233, + 21234, + 21235, + 21236, + 21237, + 21238, + 21239, + 21240, + 21241, + 21242, + 21243, + 21244, + 21245, + 21246, + 21247, + 21249, + 21250, + 21251, + 21252, + 21253, + 21254, + 21255, + 21256, + 21257, + 21258, + 21260, + 21261, + 21262, + 21263, + 21264, + 21265, + 21266, + 21267, + 21268, + 21270, + 21271, + 21272, + 21273, + 21274, + 21275, + 21276, + 21277, + 21280, + 21281, + 21282, + 21283, + 21285, + 21287, + 21288, + 21289, + 21291, + 21292, + 21293, + 21294, + 21295, + 21296, + 21297, + 21298, + 21300, + 21301, + 21302, + 21303, + 21304, + 21305, + 21306, + 21308, + 21309, + 21310, + 21311, + 21312, + 21313, + 21314, + 21315, + 21316, + 21317, + 21318, + 21319, + 21320, + 21322, + 21323, + 21324, + 21325, + 21326, + 21327, + 21328, + 21329, + 21330, + 21331, + 21334, + 21335, + 21337, + 21338, + 21339, + 21340, + 21341, + 21342, + 21343, + 21344, + 21345, + 21346, + 21347, + 21348, + 21349, + 21351, + 21352, + 21353, + 21354, + 21355, + 21356, + 21357, + 21358, + 21359, + 21360, + 21361, + 21362, + 21363, + 21364, + 21365, + 21366, + 21368, + 21369, + 21370, + 21372, + 21373, + 21374, + 21375, + 21376, + 21377, + 21379, + 21380, + 21381, + 21382, + 21384, + 21385, + 21387, + 21388, + 21389, + 21390, + 21391, + 21393, + 21394, + 21395, + 21396, + 21397, + 21398, + 21399, + 21400, + 21401, + 21402, + 21403, + 21404, + 21405, + 21406, + 21407, + 21408, + 21409, + 21410, + 21411, + 21412, + 21413, + 21414, + 21415, + 21416, + 21417, + 21418, + 21419, + 21420, + 21421, + 21423, + 21424, + 21425, + 21426, + 21427, + 21428, + 21429, + 21430, + 21431, + 21432, + 21433, + 21434, + 21436, + 21437, + 21438, + 21439, + 21441, + 21442, + 21443, + 21444, + 21445, + 21446, + 21447, + 21449, + 21450, + 21451, + 21452, + 21454, + 21455, + 21456, + 21457, + 21458, + 21459, + 21461, + 21462, + 21463, + 21464, + 21465, + 21466, + 21467, + 21468, + 21469, + 21470, + 21471, + 21472, + 21473, + 21474, + 21475, + 21476, + 21477, + 21478, + 21480, + 21481, + 21482, + 21483, + 21484, + 21485, + 21486, + 21487, + 21488, + 21489, + 21490, + 21491, + 21492, + 21493, + 21494, + 21495, + 21496, + 21497, + 21498, + 21500, + 21501, + 21502, + 21503, + 21504, + 21505, + 21506, + 21507, + 21508, + 21509, + 21510, + 21511, + 21512, + 21513, + 21514, + 21515, + 21516, + 21517, + 21518, + 21519, + 21520, + 21521, + 21522, + 21523, + 21524, + 21526, + 21527, + 21528, + 21529, + 21530, + 21531, + 21532, + 21533, + 21534, + 21535, + 21536, + 21537, + 21538, + 21539, + 21540, + 21541, + 21542, + 21543, + 21544, + 21545, + 21546, + 21547, + 21548, + 21549, + 21550, + 21551, + 21553, + 21554, + 21555, + 21556, + 21557, + 21558, + 21559, + 21560, + 21561, + 21563, + 21564, + 21566, + 21567, + 21568, + 21569, + 21571, + 21572, + 21573, + 21574, + 21575, + 21576, + 21577, + 21578, + 21579, + 21580, + 21581, + 21582, + 21583, + 21584, + 21585, + 21586, + 21588, + 21590, + 21592, + 21593, + 21594, + 21595, + 21597, + 21598, + 21599, + 21602, + 21603, + 21604, + 21605, + 21606, + 21607, + 21608, + 21609, + 21610, + 21612, + 21613, + 21614, + 21615, + 21616, + 21617, + 21618, + 21619, + 21620, + 21621, + 21622, + 21623, + 21624, + 21625, + 21627, + 21628, + 21629, + 21630, + 21631, + 21632, + 21633, + 21634, + 21635, + 21636, + 21637, + 21638, + 21639, + 21641, + 21642, + 21643, + 21644, + 21645, + 21646, + 21647, + 21648, + 21649, + 21650, + 21651, + 21652, + 21653, + 21654, + 21655, + 21656, + 21657, + 21658, + 21659, + 21660, + 21661, + 21663, + 21664, + 21665, + 21666, + 21667, + 21668, + 21669, + 21670, + 21671, + 21672, + 21673, + 21674, + 21675, + 21676, + 21677, + 21678, + 21679, + 21680, + 21681, + 21682, + 21683, + 21684, + 21685, + 21686, + 21687, + 21688, + 21689, + 21690, + 21691, + 21692, + 21693, + 21694, + 21695, + 21697, + 21698, + 21699, + 21700, + 21701, + 21702, + 21703, + 21704, + 21705, + 21706, + 21707, + 21708, + 21710, + 21711, + 21712, + 21713, + 21714, + 21715, + 21716, + 21717, + 21720, + 21721, + 21722, + 21723, + 21724, + 21725, + 21726, + 21727, + 21728, + 21729, + 21730, + 21732, + 21734, + 21735, + 21736, + 21737, + 21738, + 21740, + 21741, + 21742, + 21743, + 21744, + 21745, + 21746, + 21747, + 21748, + 21749, + 21750, + 21751, + 21752, + 21754, + 21755, + 21756, + 21757, + 21758, + 21759, + 21760, + 21761, + 21762, + 21763, + 21764, + 21766, + 21767, + 21768, + 21770, + 21771, + 21772, + 21774, + 21775, + 21776, + 21777, + 21778, + 21779, + 21782, + 21783, + 21784, + 21785, + 21786, + 21787, + 21788, + 21789, + 21791, + 21792, + 21794, + 21795, + 21796, + 21797, + 21798, + 21799, + 21800, + 21801, + 21802, + 21803, + 21804, + 21806, + 21807, + 21808, + 21809, + 21810, + 21811, + 21812, + 21813, + 21814, + 21816, + 21817, + 21818, + 21819, + 21820, + 21821, + 21822, + 21823, + 21824, + 21825, + 21826, + 21828, + 21829, + 21830, + 21831, + 21832, + 21833, + 21834, + 21835, + 21836, + 21837, + 21838, + 21839, + 21840, + 21841, + 21842, + 21843, + 21844, + 21845, + 21846, + 21847, + 21848, + 21849, + 21850, + 21851, + 21852, + 21853, + 21854, + 21855, + 21856, + 21857, + 21858, + 21859, + 21860, + 21861, + 21862, + 21863, + 21864, + 21865, + 21866, + 21867, + 21869, + 21871, + 21872, + 21874, + 21875, + 21876, + 21877, + 21879, + 21880, + 21881, + 21882, + 21883, + 21884, + 21885, + 21886, + 21887, + 21888, + 21889, + 21890, + 21891, + 21892, + 21893, + 21895, + 21896, + 21897, + 21898, + 21899, + 21900, + 21901, + 21902, + 21903, + 21904, + 21905, + 21906, + 21907, + 21908, + 21909, + 21910, + 21911, + 21912, + 21913, + 21914, + 21915, + 21916, + 21917, + 21918, + 21919, + 21920, + 21921, + 21922, + 21923, + 21924, + 21925, + 21926, + 21927, + 21928, + 21929, + 21930, + 21932, + 21933, + 21935, + 21936, + 21937, + 21938, + 21939, + 21940, + 21941, + 21942, + 21943, + 21944, + 21945, + 21946, + 21947, + 21948, + 21949, + 21950, + 21951, + 21952, + 21953, + 21955, + 21956, + 21957, + 21958, + 21959, + 21960, + 21961, + 21962, + 21963, + 21964, + 21965, + 21966, + 21967, + 21968, + 21969, + 21970, + 21972, + 21973, + 21974, + 21976, + 21977, + 21978, + 21979, + 21980, + 21981, + 21983, + 21984, + 21985, + 21986, + 21987, + 21988, + 21989, + 21990, + 21991, + 21992, + 21993, + 21994, + 21995, + 21996, + 21997, + 21998, + 21999, + 22000, + 22001, + 22002, + 22003, + 22006, + 22007, + 22008, + 22009, + 22010, + 22012, + 22013, + 22014, + 22015, + 22016, + 22017, + 22018, + 22021, + 22022, + 22023, + 22024, + 22025, + 22026, + 22027, + 22028, + 22030, + 22031, + 22032, + 22033, + 22034, + 22035, + 22036, + 22037, + 22038, + 22039, + 22041, + 22042, + 22043, + 22044, + 22045, + 22046, + 22047, + 22048, + 22049, + 22050, + 22051, + 22052, + 22053, + 22054, + 22055, + 22056, + 22057, + 22058, + 22059, + 22060, + 22061, + 22062, + 22063, + 22064, + 22065, + 22066, + 22067, + 22068, + 22069, + 22070, + 22071, + 22072, + 22073, + 22074, + 22075, + 22076, + 22077, + 22078, + 22079, + 22080, + 22081, + 22082, + 22083, + 22084, + 22085, + 22086, + 22087, + 22088, + 22089, + 22090, + 22091, + 22092, + 22093, + 22094, + 22095, + 22096, + 22097, + 22098, + 22100, + 22101, + 22102, + 22103, + 22105, + 22106, + 22107, + 22108, + 22109, + 22111, + 22112, + 22113, + 22114, + 22115, + 22116, + 22117, + 22118, + 22119, + 22120, + 22121, + 22122, + 22123, + 22124, + 22125, + 22126, + 22127, + 22128, + 22129, + 22130, + 22131, + 22132, + 22133, + 22134, + 22135, + 22136, + 22137, + 22138, + 22139, + 22140, + 22141, + 22142, + 22143, + 22144, + 22145, + 22146, + 22147, + 22148, + 22149, + 22150, + 22151, + 22152, + 22153, + 22155, + 22156, + 22157, + 22158, + 22159, + 22160, + 22162, + 22163, + 22164, + 22165, + 22166, + 22167, + 22168, + 22169, + 22170, + 22171, + 22172, + 22173, + 22174, + 22175, + 22176, + 22177, + 22178, + 22179, + 22180, + 22181, + 22182, + 22183, + 22184, + 22186, + 22187, + 22189, + 22191, + 22192, + 22193, + 22194, + 22195, + 22196, + 22198, + 22199, + 22200, + 22201, + 22202, + 22203, + 22204, + 22206, + 22207, + 22208, + 22209, + 22210, + 22211, + 22212, + 22214, + 22215, + 22216, + 22217, + 22218, + 22219, + 22220, + 22221, + 22222, + 22223, + 22224, + 22226, + 22227, + 22228, + 22230, + 22231, + 22232, + 22233, + 22234, + 22236, + 22237, + 22238, + 22239, + 22240, + 22241, + 22242, + 22243, + 22244, + 22246, + 22247, + 22248, + 22249, + 22250, + 22251, + 22253, + 22254, + 22255, + 22256, + 22257, + 22258, + 22260, + 22261, + 22262, + 22263, + 22264, + 22265, + 22266, + 22267, + 22268, + 22269, + 22270, + 22271, + 22272, + 22273, + 22274, + 22275, + 22276, + 22278, + 22280, + 22281, + 22282, + 22283, + 22284, + 22286, + 22287, + 22288, + 22291, + 22293, + 22294, + 22295, + 22296, + 22297, + 22298, + 22299, + 22300, + 22301, + 22302, + 22303, + 22304, + 22305, + 22306, + 22307, + 22308, + 22309, + 22310, + 22311, + 22312, + 22313, + 22314, + 22315, + 22316, + 22317, + 22318, + 22319, + 22320, + 22321, + 22322, + 22323, + 22324, + 22325, + 22326, + 22327, + 22328, + 22329, + 22330, + 22331, + 22332, + 22333, + 22334, + 22335, + 22336, + 22337, + 22338, + 22340, + 22341, + 22342, + 22343, + 22344, + 22345, + 22346, + 22347, + 22348, + 22349, + 22350, + 22351, + 22352, + 22353, + 22354, + 22355, + 22358, + 22359, + 22360, + 22362, + 22364, + 22365, + 22366, + 22367, + 22368, + 22369, + 22370, + 22372, + 22373, + 22374, + 22375, + 22376, + 22377, + 22378, + 22379, + 22380, + 22381, + 22382, + 22383, + 22384, + 22385, + 22386, + 22387, + 22388, + 22389, + 22390, + 22391, + 22392, + 22393, + 22394, + 22395, + 22396, + 22397, + 22398, + 22399, + 22400, + 22401, + 22402, + 22403, + 22404, + 22405, + 22406, + 22407, + 22408, + 22409, + 22410, + 22411, + 22412, + 22413, + 22414, + 22415, + 22416, + 22417, + 22418, + 22419, + 22420, + 22421, + 22422, + 22423, + 22424, + 22425, + 22426, + 22427, + 22428, + 22429, + 22430, + 22431, + 22432, + 22433, + 22434, + 22436, + 22437, + 22438, + 22439, + 22440, + 22441, + 22442, + 22443, + 22444, + 22445, + 22446, + 22447, + 22448, + 22449, + 22450, + 22451, + 22452, + 22453, + 22454, + 22455, + 22456, + 22457, + 22458, + 22459, + 22460, + 22461, + 22462, + 22463, + 22464, + 22465, + 22466, + 22467, + 22468, + 22469, + 22470, + 22471, + 22472, + 22473, + 22474, + 22475, + 22476, + 22477, + 22478, + 22479, + 22480, + 22482, + 22483, + 22484, + 22485, + 22486, + 22487, + 22488, + 22489, + 22490, + 22491, + 22493, + 22494, + 22495, + 22496, + 22497, + 22499, + 22501, + 22502, + 22503, + 22504, + 22505, + 22506, + 22507, + 22508, + 22509, + 22510, + 22511, + 22512, + 22513, + 22514, + 22515, + 22516, + 22517, + 22519, + 22520, + 22521, + 22522, + 22523, + 22524, + 22525, + 22526, + 22527, + 22528, + 22529, + 22530, + 22531, + 22532, + 22533, + 22534, + 22535, + 22536, + 22537, + 22538, + 22540, + 22541, + 22542, + 22543, + 22544, + 22545, + 22546, + 22547, + 22548, + 22549, + 22550, + 22551, + 22552, + 22553, + 22554, + 22555, + 22556, + 22557, + 22558, + 22559, + 22560, + 22561, + 22562, + 22563, + 22564, + 22565, + 22566, + 22567, + 22568, + 22569, + 22570, + 22571, + 22573, + 22574, + 22576, + 22577, + 22578, + 22579, + 22580, + 22581, + 22582, + 22583, + 22584, + 22585, + 22586, + 22587, + 22588, + 22589, + 22590, + 22591, + 22592, + 22593, + 22594, + 22595, + 22596, + 22597, + 22598, + 22599, + 22600, + 22601, + 22602, + 22603, + 22604, + 22605, + 22606, + 22607, + 22608, + 22610, + 22611, + 22612, + 22613, + 22614, + 22615, + 22616, + 22618, + 22619, + 22621, + 22622, + 22623, + 22624, + 22625, + 22626, + 22627, + 22628, + 22629, + 22630, + 22631, + 22632, + 22633, + 22634, + 22635, + 22636, + 22637, + 22638, + 22639, + 22640, + 22641, + 22642, + 22643, + 22644, + 22645, + 22646, + 22647, + 22648, + 22649, + 22650, + 22651, + 22652, + 22653, + 22654, + 22655, + 22656, + 22657, + 22658, + 22659, + 22660, + 22661, + 22662, + 22665, + 22666, + 22667, + 22668, + 22669, + 22670, + 22671, + 22672, + 22673, + 22674, + 22676, + 22677, + 22678, + 22679, + 22680, + 22681, + 22682, + 22684, + 22685, + 22686, + 22687, + 22688, + 22689, + 22691, + 22692, + 22693, + 22694, + 22695, + 22696, + 22697, + 22698, + 22699, + 22700, + 22701, + 22702, + 22703, + 22704, + 22705, + 22706, + 22707, + 22708, + 22709, + 22710, + 22711, + 22712, + 22713, + 22714, + 22715, + 22716, + 22717, + 22718, + 22719, + 22721, + 22722, + 22723, + 22724, + 22725, + 22726, + 22727, + 22728, + 22729, + 22730, + 22731, + 22732, + 22733, + 22734, + 22735, + 22736, + 22737, + 22738, + 22739, + 22740, + 22741, + 22742, + 22743, + 22744, + 22745, + 22746, + 22747, + 22748, + 22749, + 22750, + 22751, + 22752, + 22753, + 22754, + 22756, + 22758, + 22759, + 22760, + 22761, + 22762, + 22763, + 22764, + 22765, + 22766, + 22767, + 22768, + 22769, + 22770, + 22771, + 22772, + 22773, + 22774, + 22775, + 22776, + 22777, + 22778, + 22779, + 22781, + 22782, + 22783, + 22784, + 22785, + 22786, + 22787, + 22788, + 22789, + 22790, + 22792, + 22793, + 22794, + 22795, + 22796, + 22797, + 22798, + 22799, + 22800, + 22801, + 22802, + 22803, + 22804, + 22805, + 22806, + 22807, + 22808, + 22809, + 22810, + 22811, + 22812, + 22813, + 22814, + 22815, + 22816, + 22817, + 22818, + 22820, + 22822, + 22823, + 22824, + 22825, + 22826, + 22827, + 22828, + 22830, + 22831, + 22832, + 22833, + 22834, + 22835, + 22836, + 22837, + 22838, + 22839, + 22840, + 22841, + 22842, + 22843, + 22844, + 22845, + 22846, + 22847, + 22848, + 22849, + 22850, + 22851, + 22852, + 22853, + 22854, + 22855, + 22856, + 22858, + 22859, + 22860, + 22862, + 22863, + 22864, + 22865, + 22866, + 22867, + 22868, + 22869, + 22870, + 22871, + 22872, + 22874, + 22875, + 22876, + 22877, + 22878, + 22879, + 22880, + 22881, + 22882, + 22883, + 22884, + 22886, + 22887, + 22888, + 22890, + 22891, + 22892, + 22893, + 22894, + 22895, + 22896, + 22897, + 22898, + 22899, + 22901, + 22902, + 22903, + 22904, + 22905, + 22906, + 22907, + 22908, + 22909, + 22910, + 22911, + 22912, + 22913, + 22914, + 22915, + 22916, + 22917, + 22918, + 22919, + 22920, + 22921, + 22922, + 22923, + 22924, + 22925, + 22926, + 22927, + 22928, + 22929, + 22930, + 22931, + 22932, + 22933, + 22934, + 22935, + 22936, + 22937, + 22938, + 22939, + 22940, + 22942, + 22943, + 22944, + 22945, + 22947, + 22948, + 22949, + 22951, + 22953, + 22954, + 22955, + 22956, + 22957, + 22958, + 22959, + 22961, + 22962, + 22963, + 22964, + 22965, + 22966, + 22967, + 22968, + 22969, + 22970, + 22971, + 22972, + 22974, + 22976, + 22977, + 22978, + 22979, + 22980, + 22981, + 22982, + 22983, + 22984, + 22985, + 22986, + 22987, + 22988, + 22989, + 22990, + 22991, + 22992, + 22993, + 22994, + 22996, + 22997, + 22998, + 23000, + 23001, + 23002, + 23003, + 23004, + 23005, + 23006, + 23008, + 23009, + 23010, + 23011, + 23012, + 23013, + 23014, + 23015, + 23016, + 23017, + 23018, + 23019, + 23021, + 23022, + 23023, + 23025, + 23026, + 23027, + 23028, + 23029, + 23030, + 23031, + 23032, + 23033, + 23035, + 23036, + 23037, + 23038, + 23039, + 23040, + 23041, + 23042, + 23043, + 23044, + 23045, + 23046, + 23047, + 23048, + 23049, + 23050, + 23051, + 23052, + 23053, + 23054, + 23055, + 23056, + 23057, + 23058, + 23059, + 23060, + 23061, + 23062, + 23063, + 23064, + 23065, + 23066, + 23067, + 23068, + 23069, + 23070, + 23071, + 23072, + 23074, + 23075, + 23076, + 23078, + 23079, + 23080, + 23081, + 23082, + 23083, + 23084, + 23085, + 23086, + 23087, + 23088, + 23089, + 23091, + 23092, + 23093, + 23094, + 23095, + 23096, + 23097, + 23098, + 23099, + 23100, + 23101, + 23102, + 23103, + 23104, + 23105, + 23106, + 23107, + 23108, + 23109, + 23110, + 23111, + 23112, + 23113, + 23114, + 23115, + 23116, + 23117, + 23118, + 23119, + 23120, + 23121, + 23123, + 23124, + 23125, + 23126, + 23127, + 23129, + 23130, + 23131, + 23132, + 23133, + 23134, + 23135, + 23136, + 23137, + 23139, + 23140, + 23141, + 23142, + 23143, + 23144, + 23145, + 23146, + 23147, + 23148, + 23149, + 23150, + 23151, + 23152, + 23154, + 23155, + 23156, + 23157, + 23158, + 23159, + 23160, + 23161, + 23162, + 23163, + 23164, + 23165, + 23166, + 23167, + 23168, + 23169, + 23170, + 23171, + 23172, + 23173, + 23174, + 23175, + 23176, + 23177, + 23178, + 23179, + 23180, + 23181, + 23182, + 23183, + 23184, + 23185, + 23186, + 23187, + 23188, + 23189, + 23190, + 23191, + 23192, + 23193, + 23194, + 23195, + 23196, + 23197, + 23198, + 23199, + 23200, + 23201, + 23202, + 23203, + 23204, + 23205, + 23206, + 23207, + 23208, + 23209, + 23210, + 23211, + 23212, + 23213, + 23214, + 23215, + 23216, + 23217, + 23218, + 23219, + 23220, + 23222, + 23223, + 23224, + 23225, + 23226, + 23227, + 23228, + 23229, + 23230, + 23231, + 23232, + 23233, + 23234, + 23236, + 23237, + 23238, + 23239, + 23240, + 23241, + 23242, + 23244, + 23245, + 23248, + 23249, + 23250, + 23251, + 23252, + 23254, + 23255, + 23256, + 23257, + 23258, + 23259, + 23260, + 23261, + 23262, + 23263, + 23264, + 23265, + 23266, + 23267, + 23268, + 23269, + 23270, + 23271, + 23272, + 23273, + 23274, + 23275, + 23276, + 23277, + 23278, + 23279, + 23280, + 23281, + 23282, + 23283, + 23284, + 23285, + 23286, + 23287, + 23288, + 23291, + 23292, + 23293, + 23294, + 23296, + 23298, + 23299, + 23300, + 23301, + 23302, + 23303, + 23304, + 23305, + 23306, + 23307, + 23308, + 23309, + 23310, + 23311, + 23312, + 23313, + 23314, + 23316, + 23317, + 23318, + 23319, + 23320, + 23321, + 23322, + 23323, + 23324, + 23325, + 23326, + 23327, + 23328, + 23329, + 23330, + 23331, + 23332, + 23333, + 23334, + 23335, + 23336, + 23337, + 23338, + 23339, + 23340, + 23341, + 23342, + 23343, + 23344, + 23345, + 23346, + 23347, + 23348, + 23349, + 23350, + 23351, + 23354, + 23355, + 23356, + 23357, + 23358, + 23359, + 23360, + 23361, + 23362, + 23363, + 23364, + 23365, + 23366, + 23367, + 23368, + 23369, + 23370, + 23371, + 23372, + 23373, + 23374, + 23375, + 23376, + 23377, + 23378, + 23380, + 23381, + 23382, + 23383, + 23384, + 23385, + 23386, + 23387, + 23388, + 23389, + 23390, + 23391, + 23392, + 23393, + 23394, + 23396, + 23398, + 23399, + 23400, + 23401, + 23402, + 23403, + 23404, + 23405, + 23406, + 23407, + 23408, + 23409, + 23410, + 23411, + 23412, + 23413, + 23414, + 23415, + 23416, + 23417, + 23418, + 23419, + 23420, + 23423, + 23424, + 23425, + 23426, + 23427, + 23428, + 23429, + 23430, + 23431, + 23432, + 23433, + 23434, + 23435, + 23436, + 23437, + 23438, + 23439, + 23440, + 23441, + 23442, + 23443, + 23444, + 23445, + 23447, + 23448, + 23449, + 23451, + 23452, + 23454, + 23455, + 23456, + 23457, + 23458, + 23459, + 23460, + 23461, + 23462, + 23463, + 23465, + 23467, + 23468, + 23469, + 23470, + 23471, + 23472, + 23473, + 23474, + 23475, + 23476, + 23477, + 23478, + 23479, + 23480, + 23481, + 23482, + 23483, + 23484, + 23485, + 23486, + 23487, + 23488, + 23489, + 23490, + 23491, + 23492, + 23493, + 23494, + 23495, + 23496, + 23497, + 23498, + 23499, + 23500, + 23501, + 23502, + 23503, + 23504, + 23505, + 23506, + 23507, + 23508, + 23509, + 23510, + 23511, + 23512, + 23513, + 23514, + 23515, + 23516, + 23517, + 23518, + 23519, + 23520, + 23522, + 23523, + 23524, + 23525, + 23526, + 23527, + 23528, + 23529, + 23530, + 23531, + 23532, + 23534, + 23535, + 23536, + 23537, + 23538, + 23539, + 23540, + 23541, + 23542, + 23544, + 23545, + 23546, + 23547, + 23548, + 23550, + 23551, + 23552, + 23553, + 23554, + 23556, + 23557, + 23558, + 23559, + 23560, + 23561, + 23562, + 23563, + 23564, + 23566, + 23567, + 23568, + 23569, + 23570, + 23572, + 23573, + 23574, + 23575, + 23576, + 23578, + 23579, + 23580, + 23581, + 23582, + 23583, + 23584, + 23586, + 23587, + 23588, + 23589, + 23590, + 23592, + 23593, + 23594, + 23595, + 23596, + 23597, + 23598, + 23599, + 23600, + 23601, + 23602, + 23603, + 23605, + 23606, + 23607, + 23608, + 23609, + 23610, + 23611, + 23612, + 23613, + 23614, + 23615, + 23616, + 23617, + 23618, + 23619, + 23620, + 23621, + 23622, + 23623, + 23624, + 23625, + 23626, + 23627, + 23628, + 23629, + 23630, + 23631, + 23632, + 23633, + 23634, + 23635, + 23636, + 23637, + 23638, + 23639, + 23640, + 23641, + 23642, + 23643, + 23644, + 23645, + 23646, + 23647, + 23648, + 23649, + 23650, + 23651, + 23652, + 23653, + 23654, + 23656, + 23657, + 23658, + 23659, + 23660, + 23661, + 23662, + 23663, + 23664, + 23665, + 23667, + 23668, + 23669, + 23670, + 23671, + 23672, + 23673, + 23674, + 23675, + 23678, + 23679, + 23680, + 23681, + 23682, + 23683, + 23684, + 23685, + 23686, + 23687, + 23688, + 23689, + 23690, + 23692, + 23693, + 23694, + 23695, + 23696, + 23697, + 23698, + 23699, + 23700, + 23701, + 23702, + 23703, + 23704, + 23705, + 23707, + 23708, + 23709, + 23710, + 23711, + 23712, + 23713, + 23714, + 23715, + 23716, + 23717, + 23718, + 23719, + 23720, + 23721, + 23722, + 23723, + 23724, + 23725, + 23726, + 23727, + 23728, + 23729, + 23730, + 23733, + 23734, + 23735, + 23736, + 23737, + 23738, + 23739, + 23740, + 23741, + 23742, + 23745, + 23746, + 23747, + 23748, + 23749, + 23750, + 23751, + 23752, + 23753, + 23754, + 23755, + 23756, + 23757, + 23758, + 23759, + 23760, + 23761, + 23762, + 23763, + 23764, + 23765, + 23766, + 23767, + 23768, + 23769, + 23770, + 23771, + 23772, + 23773, + 23775, + 23776, + 23777, + 23779, + 23781, + 23782, + 23783, + 23784, + 23785, + 23786, + 23787, + 23788, + 23789, + 23790, + 23791, + 23792, + 23793, + 23794, + 23795, + 23797, + 23798, + 23800, + 23802, + 23803, + 23804, + 23805, + 23806, + 23807, + 23808, + 23809, + 23810, + 23811, + 23812, + 23813, + 23814, + 23815, + 23816, + 23817, + 23818, + 23819, + 23820, + 23821, + 23823, + 23824, + 23825, + 23826, + 23827, + 23828, + 23829, + 23830, + 23831, + 23832, + 23834, + 23835, + 23836, + 23837, + 23838, + 23839, + 23840, + 23841, + 23842, + 23843, + 23844, + 23846, + 23847, + 23848, + 23850, + 23851, + 23852, + 23853, + 23854, + 23855, + 23856, + 23857, + 23858, + 23859, + 23861, + 23862, + 23863, + 23864, + 23865, + 23867, + 23868, + 23870, + 23872, + 23873, + 23874, + 23875, + 23876, + 23877, + 23878, + 23879, + 23880, + 23881, + 23882, + 23883, + 23884, + 23885, + 23886, + 23887, + 23888, + 23890, + 23891, + 23892, + 23893, + 23894, + 23895, + 23896, + 23897, + 23898, + 23899, + 23900, + 23901, + 23902, + 23903, + 23904, + 23905, + 23906, + 23907, + 23908, + 23909, + 23911, + 23913, + 23914, + 23915, + 23916, + 23917, + 23918, + 23919, + 23920, + 23921, + 23922, + 23923, + 23924, + 23926, + 23927, + 23928, + 23929, + 23930, + 23931, + 23932, + 23933, + 23934, + 23935, + 23936, + 23937, + 23938, + 23939, + 23940, + 23941, + 23942, + 23943, + 23945, + 23946, + 23947, + 23948, + 23949, + 23950, + 23951, + 23952, + 23954, + 23955, + 23956, + 23957, + 23958, + 23959, + 23960, + 23961, + 23962, + 23963, + 23964, + 23965, + 23967, + 23968, + 23970, + 23971, + 23972, + 23973, + 23974, + 23975, + 23978, + 23979, + 23980, + 23982, + 23983, + 23984, + 23986, + 23987, + 23988, + 23989, + 23990, + 23991, + 23992, + 23993, + 23994, + 23995, + 23996, + 23997, + 23998, + 23999, + 24000, + 24001, + 24002, + 24003, + 24004, + 24005, + 24006, + 24007, + 24008, + 24009, + 24010, + 24011, + 24012, + 24013, + 24014, + 24015, + 24016, + 24017, + 24019, + 24020, + 24022, + 24023, + 24024, + 24026, + 24027, + 24028, + 24029, + 24031, + 24032, + 24033, + 24034, + 24035, + 24036, + 24037, + 24038, + 24039, + 24040, + 24041, + 24042, + 24043, + 24044, + 24045, + 24046, + 24047, + 24048, + 24049, + 24050, + 24051, + 24052, + 24053, + 24054, + 24055, + 24056, + 24057, + 24058, + 24059, + 24060, + 24061, + 24062, + 24063, + 24064, + 24065, + 24066, + 24067, + 24068, + 24069, + 24070, + 24071, + 24072, + 24073, + 24075, + 24076, + 24077, + 24078, + 24079, + 24080, + 24081, + 24082, + 24083, + 24084, + 24085, + 24086, + 24087, + 24088, + 24089, + 24090, + 24091, + 24092, + 24093, + 24094, + 24095, + 24096, + 24097, + 24098, + 24099, + 24100, + 24101, + 24102, + 24103, + 24104, + 24105, + 24106, + 24107, + 24108, + 24109, + 24110, + 24111, + 24112, + 24113, + 24114, + 24115, + 24116, + 24117, + 24118, + 24119, + 24120, + 24121, + 24122, + 24125, + 24126, + 24128, + 24130, + 24131, + 24132, + 24133, + 24134, + 24135, + 24136, + 24137, + 24141, + 24142, + 24143, + 24144, + 24145, + 24146, + 24147, + 24148, + 24149, + 24150, + 24151, + 24152, + 24154, + 24155, + 24156, + 24157, + 24158, + 24160, + 24161, + 24162, + 24163, + 24164, + 24165, + 24166, + 24167, + 24168, + 24169, + 24170, + 24171, + 24172, + 24173, + 24174, + 24175, + 24176, + 24177, + 24178, + 24179, + 24180, + 24181, + 24182, + 24183, + 24184, + 24185, + 24186, + 24187, + 24188, + 24189, + 24190, + 24191, + 24192, + 24193, + 24194, + 24195, + 24196, + 24197, + 24199, + 24200, + 24201, + 24202, + 24203, + 24204, + 24205, + 24207, + 24208, + 24209, + 24210, + 24211, + 24212, + 24213, + 24214, + 24215, + 24216, + 24217, + 24218, + 24219, + 24220, + 24221, + 24222, + 24223, + 24225, + 24226, + 24227, + 24228, + 24230, + 24231, + 24232, + 24233, + 24234, + 24235, + 24236, + 24237, + 24238, + 24239, + 24240, + 24241, + 24242, + 24243, + 24244, + 24245, + 24246, + 24249, + 24250, + 24252, + 24253, + 24254, + 24255, + 24256, + 24257, + 24258, + 24259, + 24260, + 24261, + 24262, + 24264, + 24265, + 24266, + 24267, + 24268, + 24270, + 24271, + 24272, + 24273, + 24274, + 24275, + 24276, + 24277, + 24279, + 24281, + 24282, + 24283, + 24284, + 24285, + 24286, + 24287, + 24288, + 24289, + 24290, + 24291, + 24292, + 24293, + 24294, + 24295, + 24296, + 24297, + 24298, + 24299, + 24300, + 24301, + 24302, + 24303, + 24304, + 24305, + 24306, + 24307, + 24308, + 24310, + 24311, + 24312, + 24313, + 24314, + 24315, + 24317, + 24318, + 24319, + 24320, + 24321, + 24322, + 24323, + 24324, + 24325, + 24326, + 24327, + 24328, + 24329, + 24331, + 24332, + 24333, + 24334, + 24335, + 24336, + 24337, + 24338, + 24339, + 24340, + 24341, + 24342, + 24343, + 24344, + 24345, + 24346, + 24347, + 24348, + 24349, + 24351, + 24353, + 24354, + 24356, + 24357, + 24358, + 24359, + 24360, + 24361, + 24362, + 24363, + 24364, + 24365, + 24366, + 24367, + 24368, + 24370, + 24371, + 24372, + 24373, + 24374, + 24375, + 24376, + 24377, + 24378, + 24379, + 24380, + 24381, + 24383, + 24384, + 24385, + 24386, + 24387, + 24388, + 24389, + 24390, + 24391, + 24392, + 24394, + 24395, + 24396, + 24397, + 24398, + 24399, + 24402, + 24403, + 24404, + 24405, + 24406, + 24407, + 24408, + 24409, + 24410, + 24411, + 24412, + 24413, + 24414, + 24415, + 24416, + 24417, + 24418, + 24419, + 24420, + 24421, + 24422, + 24423, + 24424, + 24427, + 24429, + 24430, + 24431, + 24432, + 24434, + 24435, + 24436, + 24437, + 24438, + 24439, + 24440, + 24441, + 24442, + 24443, + 24444, + 24445, + 24446, + 24447, + 24448, + 24449, + 24450, + 24451, + 24452, + 24453, + 24454, + 24455, + 24457, + 24459, + 24460, + 24461, + 24462, + 24463, + 24464, + 24465, + 24466, + 24467, + 24468, + 24469, + 24470, + 24471, + 24472, + 24473, + 24474, + 24475, + 24476, + 24477, + 24478, + 24479, + 24480, + 24481, + 24482, + 24483, + 24484, + 24485, + 24486, + 24487, + 24488, + 24489, + 24490, + 24491, + 24492, + 24493, + 24494, + 24495, + 24496, + 24497, + 24498, + 24499, + 24500, + 24501, + 24502, + 24503, + 24504, + 24505, + 24506, + 24507, + 24508, + 24510, + 24511, + 24512, + 24513, + 24514, + 24515, + 24516, + 24517, + 24518, + 24519, + 24520, + 24521, + 24522, + 24523, + 24524, + 24525, + 24526, + 24528, + 24529, + 24530, + 24531, + 24532, + 24534, + 24535, + 24536, + 24537, + 24538, + 24539, + 24541, + 24542, + 24543, + 24545, + 24546, + 24547, + 24548, + 24549, + 24550, + 24551, + 24552, + 24553, + 24554, + 24555, + 24556, + 24557, + 24558, + 24559, + 24560, + 24561, + 24562, + 24563, + 24564, + 24565, + 24566, + 24567, + 24569, + 24570, + 24571, + 24573, + 24574, + 24575, + 24576, + 24577, + 24578, + 24579, + 24580, + 24581, + 24582, + 24583, + 24584, + 24585, + 24586, + 24587, + 24588, + 24589, + 24590, + 24591, + 24592, + 24593, + 24595, + 24596, + 24597, + 24598, + 24599, + 24600, + 24601, + 24602, + 24604, + 24605, + 24606, + 24608, + 24609, + 24610, + 24611, + 24612, + 24613, + 24614, + 24615, + 24616, + 24617, + 24618, + 24619, + 24620, + 24621, + 24622, + 24623, + 24624, + 24625, + 24626, + 24627, + 24628, + 24629, + 24630, + 24631, + 24632, + 24633, + 24634, + 24635, + 24636, + 24637, + 24638, + 24639, + 24640, + 24641, + 24642, + 24643, + 24644, + 24645, + 24646, + 24647, + 24648, + 24649, + 24650, + 24651, + 24652, + 24654, + 24655, + 24656, + 24658, + 24659, + 24660, + 24661, + 24662, + 24663, + 24664, + 24665, + 24666, + 24668, + 24669, + 24670, + 24671, + 24672, + 24673, + 24674, + 24675, + 24677, + 24678, + 24679, + 24680, + 24682, + 24683, + 24684, + 24685, + 24686, + 24689, + 24690, + 24691, + 24692, + 24693, + 24694, + 24695, + 24696, + 24697, + 24698, + 24699, + 24700, + 24701, + 24702, + 24703, + 24704, + 24705, + 24706, + 24707, + 24708, + 24709, + 24710, + 24711, + 24713, + 24714, + 24715, + 24716, + 24717, + 24718, + 24719, + 24720, + 24721, + 24722, + 24723, + 24724, + 24725, + 24726, + 24727, + 24728, + 24729, + 24731, + 24732, + 24733, + 24734, + 24735, + 24736, + 24737, + 24738, + 24739, + 24740, + 24741, + 24742, + 24743, + 24744, + 24745, + 24746, + 24747, + 24748, + 24749, + 24750, + 24751, + 24752, + 24753, + 24754, + 24758, + 24759, + 24760, + 24761, + 24762, + 24763, + 24764, + 24765, + 24766, + 24767, + 24768, + 24769, + 24770, + 24771, + 24772, + 24773, + 24774, + 24775, + 24776, + 24777, + 24778, + 24779, + 24780, + 24781, + 24782, + 24783, + 24784, + 24785, + 24786, + 24787, + 24788, + 24789, + 24790, + 24791, + 24792, + 24793, + 24794, + 24795, + 24796, + 24797, + 24798, + 24799, + 24800, + 24801, + 24802, + 24804, + 24805, + 24806, + 24807, + 24808, + 24809, + 24810, + 24811, + 24812, + 24813, + 24814, + 24815, + 24816, + 24818, + 24819, + 24820, + 24821, + 24822, + 24823, + 24824, + 24825, + 24826, + 24827, + 24828, + 24829, + 24831, + 24832, + 24833, + 24834, + 24835, + 24836, + 24837, + 24838, + 24839, + 24840, + 24841, + 24842, + 24843, + 24846, + 24847, + 24848, + 24849, + 24850, + 24851, + 24852, + 24853, + 24854, + 24855, + 24856, + 24859, + 24860, + 24861, + 24862, + 24863, + 24864, + 24865, + 24866, + 24868, + 24869, + 24870, + 24871, + 24872, + 24873, + 24874, + 24875, + 24876, + 24877, + 24879, + 24882, + 24883, + 24884, + 24885, + 24886, + 24887, + 24889, + 24890, + 24891, + 24892, + 24893, + 24895, + 24896, + 24897, + 24898, + 24899, + 24900, + 24901, + 24902, + 24903, + 24904, + 24905, + 24906, + 24907, + 24909, + 24910, + 24911, + 24912, + 24913, + 24914, + 24915, + 24916, + 24917, + 24918, + 24919, + 24921, + 24922, + 24923, + 24924, + 24926, + 24927, + 24928, + 24929, + 24930, + 24931, + 24932, + 24933, + 24934, + 24935, + 24936, + 24937, + 24938, + 24939, + 24940, + 24941, + 24942, + 24943, + 24944, + 24945, + 24946, + 24947, + 24948, + 24949, + 24950, + 24951, + 24952, + 24953, + 24954, + 24955, + 24956, + 24957, + 24958, + 24959, + 24960, + 24962, + 24963, + 24964, + 24965, + 24966, + 24967, + 24969, + 24970, + 24972, + 24973, + 24974, + 24975, + 24976, + 24977, + 24978, + 24979, + 24980, + 24981, + 24983, + 24984, + 24985, + 24986, + 24987, + 24988, + 24989, + 24990, + 24991, + 24992, + 24993, + 24994, + 24995, + 24996, + 24997, + 24998, + 24999, + 25000, + 25002, + 25003, + 25004, + 25005, + 25006, + 25007, + 25008, + 25009, + 25010, + 25011, + 25013, + 25014, + 25015, + 25016, + 25017, + 25018, + 25019, + 25020, + 25021, + 25022, + 25023, + 25024, + 25025, + 25026, + 25027, + 25028, + 25029, + 25030, + 25031, + 25032, + 25033, + 25034, + 25035, + 25036, + 25037, + 25039, + 25040, + 25041, + 25042, + 25044, + 25045, + 25046, + 25047, + 25048, + 25049, + 25050, + 25051, + 25052, + 25053, + 25054, + 25055, + 25057, + 25058, + 25059, + 25060, + 25061, + 25062, + 25063, + 25064, + 25065, + 25066, + 25067, + 25068, + 25069, + 25070, + 25071, + 25072, + 25073, + 25074, + 25075, + 25076, + 25077, + 25078, + 25079, + 25080, + 25081, + 25082, + 25083, + 25084, + 25085, + 25086, + 25087, + 25088, + 25089, + 25090, + 25091, + 25092, + 25093, + 25094, + 25095, + 25096, + 25097, + 25098, + 25099, + 25100, + 25101, + 25102, + 25103, + 25104, + 25105, + 25106, + 25107, + 25110, + 25111, + 25112, + 25113, + 25114, + 25115, + 25117, + 25118, + 25119, + 25120, + 25121, + 25122, + 25123, + 25124, + 25125, + 25126, + 25127, + 25128, + 25129, + 25131, + 25132, + 25133, + 25134, + 25135, + 25136, + 25138, + 25139, + 25140, + 25141, + 25142, + 25143, + 25144, + 25146, + 25147, + 25148, + 25149, + 25150, + 25151, + 25152, + 25153, + 25154, + 25155, + 25156, + 25157, + 25158, + 25159, + 25160, + 25161, + 25162, + 25163, + 25164, + 25165, + 25166, + 25167, + 25168, + 25169, + 25170, + 25171, + 25172, + 25173, + 25175, + 25176, + 25178, + 25179, + 25180, + 25181, + 25182, + 25183, + 25184, + 25185, + 25186, + 25187, + 25188, + 25189, + 25190, + 25191, + 25192, + 25193, + 25194, + 25195, + 25196, + 25197, + 25198, + 25200, + 25201, + 25202, + 25203, + 25204, + 25206, + 25207, + 25208, + 25209, + 25210, + 25211, + 25212, + 25213, + 25214, + 25215, + 25216, + 25217, + 25218, + 25219, + 25220, + 25221, + 25222, + 25223, + 25224, + 25225, + 25226, + 25227, + 25228, + 25229, + 25230, + 25231, + 25232, + 25233, + 25234, + 25235, + 25236, + 25237, + 25238, + 25239, + 25240, + 25241, + 25242, + 25243, + 25244, + 25245, + 25246, + 25247, + 25248, + 25249, + 25250, + 25251, + 25252, + 25253, + 25254, + 25255, + 25256, + 25257, + 25258, + 25260, + 25261, + 25263, + 25264, + 25265, + 25266, + 25267, + 25268, + 25269, + 25270, + 25271, + 25273, + 25274, + 25275, + 25278, + 25280, + 25281, + 25282, + 25283, + 25284, + 25285, + 25286, + 25287, + 25288, + 25289, + 25290, + 25291, + 25292, + 25293, + 25294, + 25295, + 25296, + 25298, + 25299, + 25300, + 25301, + 25302, + 25303, + 25304, + 25305, + 25306, + 25307, + 25308, + 25309, + 25310, + 25311, + 25312, + 25313, + 25314, + 25315, + 25316, + 25317, + 25318, + 25319, + 25320, + 25321, + 25322, + 25323, + 25324, + 25325, + 25326, + 25327, + 25328, + 25329, + 25330, + 25331, + 25332, + 25333, + 25334, + 25335, + 25336, + 25337, + 25338, + 25339, + 25340, + 25341, + 25342, + 25343, + 25344, + 25345, + 25346, + 25347, + 25348, + 25349, + 25350, + 25351, + 25352, + 25353, + 25354, + 25355, + 25356, + 25357, + 25358, + 25359, + 25360, + 25362, + 25363, + 25366, + 25367, + 25368, + 25369, + 25370, + 25371, + 25372, + 25373, + 25374, + 25375, + 25376, + 25377, + 25378, + 25379, + 25380, + 25381, + 25382, + 25383, + 25385, + 25386, + 25387, + 25388, + 25389, + 25390, + 25391, + 25392, + 25393, + 25394, + 25395, + 25397, + 25398, + 25399, + 25401, + 25402, + 25403, + 25404, + 25405, + 25406, + 25407, + 25408, + 25409, + 25410, + 25411, + 25412, + 25413, + 25414, + 25415, + 25416, + 25417, + 25418, + 25419, + 25420, + 25422, + 25423, + 25424, + 25425, + 25426, + 25427, + 25428, + 25429, + 25430, + 25431, + 25432, + 25433, + 25434, + 25436, + 25437, + 25438, + 25440, + 25441, + 25442, + 25444, + 25445, + 25446, + 25447, + 25448, + 25449, + 25450, + 25451, + 25452, + 25454, + 25455, + 25456, + 25457, + 25458, + 25460, + 25461, + 25462, + 25463, + 25464, + 25465, + 25466, + 25467, + 25468, + 25469, + 25470, + 25471, + 25472, + 25473, + 25474, + 25475, + 25476, + 25477, + 25478, + 25479, + 25480, + 25481, + 25482, + 25484, + 25485, + 25487, + 25488, + 25489, + 25490, + 25492, + 25493, + 25494, + 25495, + 25496, + 25497, + 25499, + 25500, + 25501, + 25502, + 25503, + 25504, + 25505, + 25506, + 25507, + 25508, + 25509, + 25510, + 25511, + 25512, + 25513, + 25514, + 25515, + 25516, + 25518, + 25519, + 25520, + 25521, + 25522, + 25523, + 25524, + 25525, + 25526, + 25527, + 25528, + 25529, + 25530, + 25531, + 25533, + 25534, + 25535, + 25536, + 25537, + 25538, + 25539, + 25541, + 25542, + 25543, + 25544, + 25545, + 25546, + 25547, + 25548, + 25549, + 25550, + 25551, + 25553, + 25554, + 25555, + 25557, + 25558, + 25559, + 25560, + 25561, + 25562, + 25563, + 25564, + 25565, + 25566, + 25567, + 25568, + 25569, + 25571, + 25572, + 25574, + 25575, + 25576, + 25577, + 25578, + 25579, + 25580, + 25581, + 25582, + 25583, + 25584, + 25585, + 25586, + 25587, + 25588, + 25589, + 25590, + 25591, + 25592, + 25593, + 25594, + 25595, + 25596, + 25597, + 25598, + 25600, + 25601, + 25602, + 25603, + 25605, + 25606, + 25607, + 25608, + 25609, + 25610, + 25611, + 25612, + 25613, + 25614, + 25616, + 25617, + 25618, + 25620, + 25621, + 25623, + 25624, + 25625, + 25626, + 25627, + 25628, + 25629, + 25630, + 25631, + 25632, + 25633, + 25634, + 25635, + 25636, + 25637, + 25638, + 25639, + 25640, + 25641, + 25642, + 25643, + 25644, + 25645, + 25646, + 25647, + 25648, + 25649, + 25650, + 25651, + 25652, + 25653, + 25654, + 25655, + 25656, + 25657, + 25658, + 25659, + 25660, + 25661, + 25662, + 25663, + 25664, + 25665, + 25666, + 25667, + 25668, + 25669, + 25670, + 25671, + 25672, + 25673, + 25675, + 25676, + 25677, + 25678, + 25680, + 25681, + 25682, + 25683, + 25684, + 25685, + 25686, + 25687, + 25688, + 25689, + 25690, + 25691, + 25692, + 25693, + 25694, + 25695, + 25696, + 25697, + 25698, + 25700, + 25701, + 25702, + 25703, + 25704, + 25705, + 25706, + 25707, + 25708, + 25709, + 25710, + 25712, + 25713, + 25714, + 25715, + 25716, + 25717, + 25718, + 25719, + 25720, + 25721, + 25722, + 25723, + 25724, + 25725, + 25726, + 25727, + 25728, + 25729, + 25731, + 25732, + 25733, + 25734, + 25735, + 25736, + 25737, + 25738, + 25739, + 25740, + 25741, + 25742, + 25743, + 25744, + 25745, + 25746, + 25747, + 25749, + 25750, + 25751, + 25752, + 25753, + 25754, + 25755, + 25756, + 25757, + 25758, + 25759, + 25761, + 25762, + 25763, + 25765, + 25766, + 25767, + 25768, + 25769, + 25770, + 25771, + 25772, + 25773, + 25774, + 25775, + 25776, + 25777, + 25778, + 25779, + 25780, + 25781, + 25782, + 25783, + 25784, + 25785, + 25786, + 25787, + 25789, + 25790, + 25791, + 25792, + 25793, + 25794, + 25795, + 25796, + 25797, + 25798, + 25799, + 25800, + 25801, + 25802, + 25803, + 25804, + 25805, + 25806, + 25807, + 25808, + 25809, + 25810, + 25811, + 25812, + 25813, + 25814, + 25816, + 25817, + 25818, + 25820, + 25821, + 25822, + 25823, + 25824, + 25825, + 25826, + 25827, + 25829, + 25830, + 25831, + 25832, + 25833, + 25834, + 25835, + 25836, + 25837, + 25838, + 25839, + 25840, + 25841, + 25842, + 25843, + 25844, + 25845, + 25846, + 25847, + 25848, + 25849, + 25850, + 25851, + 25852, + 25853, + 25856, + 25857, + 25858, + 25859, + 25860, + 25861, + 25862, + 25863, + 25864, + 25865, + 25866, + 25867, + 25868, + 25869, + 25870, + 25871, + 25872, + 25873, + 25874, + 25875, + 25876, + 25877, + 25878, + 25879, + 25880, + 25881, + 25882, + 25883, + 25884, + 25885, + 25886, + 25887, + 25888, + 25889, + 25890, + 25891, + 25892, + 25894, + 25895, + 25896, + 25897, + 25898, + 25899, + 25900, + 25901, + 25902, + 25903, + 25904, + 25905, + 25906, + 25907, + 25908, + 25909, + 25910, + 25911, + 25912, + 25913, + 25914, + 25915, + 25916, + 25917, + 25918, + 25919, + 25920, + 25921, + 25922, + 25923, + 25924, + 25925, + 25926, + 25927, + 25928, + 25929, + 25930, + 25931, + 25932, + 25933, + 25934, + 25935, + 25936, + 25937, + 25938, + 25939, + 25940, + 25941, + 25942, + 25943, + 25944, + 25945, + 25946, + 25947, + 25948, + 25949, + 25950, + 25951, + 25952, + 25953, + 25954, + 25955, + 25956, + 25957, + 25958, + 25959, + 25960, + 25961, + 25962, + 25963, + 25964, + 25965, + 25966, + 25967, + 25968, + 25969, + 25970, + 25971, + 25972, + 25973, + 25974, + 25975, + 25976, + 25978, + 25979, + 25981, + 25982, + 25983, + 25984, + 25985, + 25986, + 25987, + 25988, + 25989, + 25990, + 25991, + 25992, + 25994, + 25995, + 25996, + 25997, + 25998, + 25999, + 26000, + 26001, + 26002, + 26003, + 26004, + 26005, + 26006, + 26008, + 26009, + 26010, + 26011, + 26012, + 26013, + 26014, + 26015, + 26016, + 26017, + 26018, + 26019, + 26020, + 26022, + 26023, + 26024, + 26025, + 26027, + 26028, + 26029, + 26030, + 26031, + 26032, + 26033, + 26034, + 26035, + 26036, + 26037, + 26038, + 26039, + 26040, + 26041, + 26043, + 26044, + 26045, + 26046, + 26047, + 26048, + 26049, + 26050, + 26051, + 26052, + 26053, + 26054, + 26055, + 26056, + 26057, + 26058, + 26059, + 26060, + 26061, + 26062, + 26063, + 26064, + 26065, + 26066, + 26067, + 26068, + 26069, + 26070, + 26071, + 26072, + 26073, + 26074, + 26075, + 26076, + 26077, + 26078, + 26079, + 26080, + 26081, + 26082, + 26083, + 26084, + 26085, + 26086, + 26087, + 26088, + 26089, + 26090, + 26091, + 26092, + 26093, + 26094, + 26095, + 26096, + 26097, + 26098, + 26099, + 26100, + 26101, + 26102, + 26103, + 26105, + 26106, + 26107, + 26108, + 26110, + 26111, + 26113, + 26114, + 26115, + 26116, + 26117, + 26118, + 26119, + 26120, + 26121, + 26122, + 26123, + 26124, + 26125, + 26126, + 26127, + 26128, + 26129, + 26130, + 26131, + 26133, + 26134, + 26135, + 26136, + 26137, + 26139, + 26140, + 26141, + 26142, + 26143, + 26144, + 26145, + 26146, + 26147, + 26148, + 26150, + 26151, + 26152, + 26153, + 26154, + 26155, + 26156, + 26157, + 26158, + 26159, + 26161, + 26162, + 26163, + 26164, + 26165, + 26166, + 26168, + 26169, + 26170, + 26171, + 26172, + 26173, + 26174, + 26175, + 26176, + 26177, + 26178, + 26179, + 26181, + 26182, + 26183, + 26184, + 26185, + 26186, + 26187, + 26188, + 26190, + 26191, + 26192, + 26193, + 26194, + 26196, + 26198, + 26199, + 26200, + 26201, + 26202, + 26203, + 26204, + 26205, + 26206, + 26207, + 26208, + 26209, + 26210, + 26211, + 26212, + 26213, + 26215, + 26216, + 26217, + 26219, + 26220, + 26221, + 26223, + 26224, + 26225, + 26226, + 26228, + 26229, + 26230, + 26231, + 26232, + 26233, + 26236, + 26237, + 26238, + 26239, + 26240, + 26241, + 26242, + 26243, + 26244, + 26245, + 26247, + 26248, + 26249, + 26250, + 26251, + 26252, + 26254, + 26255, + 26256, + 26257, + 26258, + 26259, + 26260, + 26261, + 26262, + 26263, + 26264, + 26265, + 26266, + 26267, + 26268, + 26270, + 26271, + 26272, + 26273, + 26274, + 26275, + 26276, + 26277, + 26278, + 26279, + 26280, + 26281, + 26282, + 26283, + 26284, + 26285, + 26286, + 26287, + 26288, + 26290, + 26291, + 26292, + 26293, + 26295, + 26296, + 26297, + 26298, + 26299, + 26300, + 26301, + 26302, + 26303, + 26305, + 26306, + 26307, + 26308, + 26309, + 26310, + 26311, + 26313, + 26314, + 26315, + 26316, + 26317, + 26318, + 26319, + 26320, + 26321, + 26322, + 26323, + 26324, + 26325, + 26327, + 26328, + 26329, + 26330, + 26332, + 26333, + 26334, + 26335, + 26336, + 26337, + 26338, + 26339, + 26340, + 26341, + 26342, + 26343, + 26344, + 26345, + 26346, + 26348, + 26349, + 26350, + 26351, + 26352, + 26353, + 26354, + 26356, + 26357, + 26358, + 26359, + 26360, + 26361, + 26362, + 26363, + 26364, + 26365, + 26366, + 26367, + 26368, + 26369, + 26370, + 26374, + 26375, + 26376, + 26377, + 26378, + 26379, + 26380, + 26381, + 26382, + 26383, + 26385, + 26386, + 26387, + 26388, + 26389, + 26391, + 26392, + 26393, + 26394, + 26398, + 26399, + 26400, + 26401, + 26402, + 26403, + 26404, + 26406, + 26407, + 26409, + 26410, + 26412, + 26413, + 26414, + 26415, + 26416, + 26417, + 26418, + 26419, + 26420, + 26421, + 26422, + 26423, + 26424, + 26425, + 26426, + 26427, + 26428, + 26429, + 26430, + 26431, + 26432, + 26433, + 26434, + 26435, + 26436, + 26437, + 26438, + 26439, + 26440, + 26441, + 26442, + 26443, + 26444, + 26446, + 26447, + 26448, + 26449, + 26450, + 26451, + 26452, + 26453, + 26454, + 26455, + 26456, + 26458, + 26459, + 26460, + 26461, + 26462, + 26463, + 26464, + 26466, + 26467, + 26468, + 26469, + 26470, + 26471, + 26472, + 26473, + 26474, + 26475, + 26476, + 26477, + 26478, + 26479, + 26480, + 26482, + 26483, + 26484, + 26485, + 26486, + 26487, + 26488, + 26489, + 26490, + 26491, + 26492, + 26494, + 26495, + 26496, + 26497, + 26498, + 26499, + 26500, + 26501, + 26502, + 26504, + 26505, + 26506, + 26508, + 26509, + 26510, + 26511, + 26512, + 26513, + 26514, + 26515, + 26516, + 26517, + 26518, + 26520, + 26522, + 26524, + 26525, + 26526, + 26528, + 26529, + 26530, + 26531, + 26532, + 26533, + 26534, + 26535, + 26536, + 26537, + 26538, + 26539, + 26540, + 26541, + 26542, + 26543, + 26544, + 26545, + 26546, + 26547, + 26548, + 26549, + 26550, + 26551, + 26552, + 26553, + 26554, + 26555, + 26556, + 26557, + 26558, + 26559, + 26560, + 26561, + 26562, + 26563, + 26564, + 26565, + 26566, + 26567, + 26568, + 26569, + 26570, + 26571, + 26572, + 26573, + 26574, + 26575, + 26576, + 26577, + 26578, + 26579, + 26580, + 26581, + 26582, + 26583, + 26584, + 26585, + 26586, + 26587, + 26588, + 26590, + 26592, + 26593, + 26594, + 26595, + 26596, + 26597, + 26598, + 26599, + 26600, + 26601, + 26602, + 26603, + 26604, + 26605, + 26606, + 26607, + 26608, + 26609, + 26610, + 26611, + 26612, + 26613, + 26614, + 26616, + 26617, + 26620, + 26621, + 26622, + 26624, + 26625, + 26626, + 26627, + 26628, + 26629, + 26630, + 26631, + 26632, + 26633, + 26634, + 26636, + 26637, + 26638, + 26639, + 26640, + 26641, + 26643, + 26644, + 26646, + 26647, + 26648, + 26649, + 26650, + 26651, + 26652, + 26653, + 26654, + 26655, + 26656, + 26657, + 26658, + 26659, + 26660, + 26661, + 26662, + 26663, + 26664, + 26665, + 26666, + 26667, + 26668, + 26669, + 26670, + 26671, + 26672, + 26673, + 26674, + 26675, + 26676, + 26677, + 26678, + 26679, + 26680, + 26681, + 26682, + 26683, + 26684, + 26685, + 26686, + 26687, + 26688, + 26689, + 26690, + 26691, + 26692, + 26693, + 26694, + 26695, + 26696, + 26697, + 26698, + 26699, + 26700, + 26701, + 26702, + 26703, + 26704, + 26705, + 26706, + 26707, + 26709, + 26710, + 26711, + 26712, + 26713, + 26714, + 26715, + 26716, + 26717, + 26718, + 26719, + 26720, + 26721, + 26722, + 26723, + 26724, + 26725, + 26726, + 26727, + 26728, + 26729, + 26730, + 26731, + 26732, + 26734, + 26735, + 26736, + 26737, + 26738, + 26739, + 26740, + 26741, + 26742, + 26743, + 26744, + 26745, + 26746, + 26747, + 26748, + 26750, + 26751, + 26752, + 26753, + 26755, + 26756, + 26757, + 26758, + 26759, + 26760, + 26761, + 26762, + 26763, + 26764, + 26765, + 26766, + 26767, + 26768, + 26769, + 26770, + 26771, + 26772, + 26773, + 26774, + 26775, + 26776, + 26777, + 26778, + 26779, + 26780, + 26781, + 26782, + 26783, + 26784, + 26785, + 26786, + 26787, + 26788, + 26789, + 26790, + 26791, + 26792, + 26793, + 26794, + 26795, + 26796, + 26797, + 26798, + 26799, + 26800, + 26801, + 26802, + 26803, + 26804, + 26806, + 26807, + 26808, + 26809, + 26810, + 26811, + 26812, + 26813, + 26814, + 26815, + 26816, + 26817, + 26818, + 26819, + 26820, + 26821, + 26822, + 26823, + 26825, + 26826, + 26827, + 26828, + 26829, + 26830, + 26831, + 26832, + 26833, + 26834, + 26835, + 26838, + 26839, + 26840, + 26841, + 26842, + 26844, + 26845, + 26846, + 26847, + 26848, + 26849, + 26850, + 26851, + 26852, + 26853, + 26854, + 26855, + 26856, + 26857, + 26858, + 26859, + 26860, + 26862, + 26863, + 26864, + 26865, + 26866, + 26867, + 26868, + 26869, + 26870, + 26871, + 26873, + 26874, + 26875, + 26876, + 26877, + 26878, + 26879, + 26880, + 26881, + 26882, + 26883, + 26885, + 26886, + 26887, + 26888, + 26889, + 26890, + 26891, + 26892, + 26893, + 26894, + 26895, + 26896, + 26897, + 26898, + 26899, + 26900, + 26901, + 26902, + 26903, + 26904, + 26905, + 26906, + 26907, + 26908, + 26909, + 26910, + 26911, + 26912, + 26913, + 26914, + 26915, + 26916, + 26917, + 26918, + 26919, + 26920, + 26921, + 26922, + 26923, + 26924, + 26925, + 26926, + 26927, + 26928, + 26929, + 26930, + 26932, + 26933, + 26934, + 26935, + 26936, + 26937, + 26938, + 26940, + 26941, + 26942, + 26943, + 26944, + 26945, + 26946, + 26947, + 26948, + 26949, + 26950, + 26951, + 26952, + 26953, + 26954, + 26955, + 26956, + 26957, + 26958, + 26959, + 26960, + 26961, + 26962, + 26963, + 26964, + 26965, + 26966, + 26967, + 26968, + 26969, + 26970, + 26971, + 26972, + 26973, + 26974, + 26975, + 26976, + 26977, + 26978, + 26979, + 26980, + 26981, + 26982, + 26983, + 26984, + 26985, + 26986, + 26987, + 26988, + 26989, + 26991, + 26992, + 26993, + 26994, + 26996, + 26997, + 26998, + 26999, + 27000, + 27001, + 27002, + 27003, + 27004, + 27005, + 27006, + 27007, + 27008, + 27009, + 27011, + 27012, + 27013, + 27014, + 27015, + 27016, + 27018, + 27019, + 27020, + 27021, + 27022, + 27023, + 27024, + 27025, + 27027, + 27028, + 27029, + 27030, + 27032, + 27033, + 27034, + 27035, + 27036, + 27037, + 27038, + 27039, + 27040, + 27041, + 27042, + 27043, + 27044, + 27046, + 27047, + 27048, + 27049, + 27050, + 27051, + 27052, + 27053, + 27054, + 27055, + 27056, + 27057, + 27058, + 27059, + 27060, + 27061, + 27062, + 27063, + 27064, + 27065, + 27066, + 27067, + 27068, + 27070, + 27072, + 27073, + 27074, + 27075, + 27076, + 27077, + 27078, + 27079, + 27080, + 27081, + 27082, + 27083, + 27084, + 27085, + 27086, + 27087, + 27088, + 27089, + 27090, + 27091, + 27093, + 27094, + 27095, + 27096, + 27097, + 27098, + 27099, + 27100, + 27101, + 27102, + 27103, + 27104, + 27105, + 27106, + 27107, + 27108, + 27109, + 27110, + 27111, + 27112, + 27113, + 27114, + 27115, + 27116, + 27117, + 27118, + 27119, + 27120, + 27121, + 27122, + 27123, + 27124, + 27125, + 27126, + 27127, + 27128, + 27129, + 27130, + 27132, + 27133, + 27134, + 27135, + 27136, + 27137, + 27138, + 27140, + 27141, + 27142, + 27143, + 27144, + 27145, + 27146, + 27147, + 27148, + 27149, + 27150, + 27151, + 27152, + 27153, + 27154, + 27155, + 27156, + 27157, + 27159, + 27160, + 27161, + 27163, + 27164, + 27165, + 27166, + 27167, + 27168, + 27169, + 27170, + 27171, + 27172, + 27174, + 27175, + 27176, + 27177, + 27178, + 27179, + 27180, + 27182, + 27183, + 27184, + 27185, + 27186, + 27187, + 27188, + 27189, + 27190, + 27191, + 27192, + 27193, + 27194, + 27196, + 27198, + 27199, + 27200, + 27201, + 27202, + 27203, + 27204, + 27205, + 27206, + 27207, + 27208, + 27209, + 27210, + 27211, + 27212, + 27213, + 27214, + 27215, + 27216, + 27217, + 27218, + 27219, + 27220, + 27221, + 27222, + 27223, + 27225, + 27226, + 27227, + 27228, + 27229, + 27230, + 27231, + 27232, + 27234, + 27235, + 27236, + 27237, + 27238, + 27239, + 27240, + 27241, + 27242, + 27243, + 27244, + 27245, + 27246, + 27247, + 27248, + 27249, + 27250, + 27251, + 27252, + 27254, + 27255, + 27256, + 27257, + 27258, + 27259, + 27261, + 27262, + 27263, + 27264, + 27265, + 27266, + 27267, + 27268, + 27269, + 27270, + 27271, + 27272, + 27273, + 27274, + 27275, + 27276, + 27277, + 27278, + 27279, + 27280, + 27281, + 27282, + 27283, + 27284, + 27285, + 27286, + 27287, + 27288, + 27289, + 27290, + 27291, + 27292, + 27293, + 27294, + 27295, + 27296, + 27297, + 27298, + 27299, + 27300, + 27301, + 27302, + 27303, + 27304, + 27305, + 27306, + 27307, + 27308, + 27309, + 27310, + 27311, + 27312, + 27313, + 27314, + 27315, + 27316, + 27317, + 27318, + 27319, + 27320, + 27321, + 27322, + 27323, + 27324, + 27326, + 27327, + 27330, + 27331, + 27332, + 27333, + 27334, + 27335, + 27336, + 27337, + 27338, + 27339, + 27340, + 27341, + 27342, + 27343, + 27344, + 27345, + 27346, + 27347, + 27348, + 27350, + 27351, + 27352, + 27353, + 27354, + 27355, + 27356, + 27357, + 27358, + 27360, + 27361, + 27362, + 27363, + 27364, + 27365, + 27366, + 27367, + 27368, + 27370, + 27371, + 27372, + 27374, + 27375, + 27377, + 27378, + 27379, + 27380, + 27381, + 27382, + 27383, + 27384, + 27385, + 27386, + 27387, + 27388, + 27389, + 27390, + 27391, + 27392, + 27393, + 27394, + 27395, + 27396, + 27397, + 27398, + 27399, + 27400, + 27401, + 27402, + 27403, + 27404, + 27405, + 27406, + 27407, + 27408, + 27409, + 27410, + 27411, + 27412, + 27413, + 27414, + 27416, + 27417, + 27418, + 27419, + 27420, + 27421, + 27423, + 27424, + 27425, + 27426, + 27427, + 27428, + 27429, + 27430, + 27431, + 27432, + 27433, + 27434, + 27435, + 27436, + 27437, + 27438, + 27439, + 27440, + 27441, + 27443, + 27444, + 27445, + 27446, + 27447, + 27448, + 27449, + 27450, + 27451, + 27452, + 27453, + 27454, + 27455, + 27456, + 27459, + 27460, + 27461, + 27462, + 27463, + 27464, + 27465, + 27466, + 27467, + 27468, + 27469, + 27470, + 27471, + 27472, + 27474, + 27475, + 27476, + 27477, + 27478, + 27480, + 27481, + 27482, + 27483, + 27484, + 27485, + 27486, + 27487, + 27488, + 27489, + 27490, + 27491, + 27492, + 27493, + 27494, + 27495, + 27496, + 27497, + 27498, + 27499, + 27500, + 27501, + 27503, + 27504, + 27505, + 27506, + 27507, + 27508, + 27509, + 27510, + 27511, + 27512, + 27513, + 27514, + 27515, + 27516, + 27517, + 27518, + 27519, + 27520, + 27521, + 27522, + 27523, + 27524, + 27525, + 27526, + 27527, + 27528, + 27529, + 27530, + 27532, + 27534, + 27535, + 27536, + 27537, + 27538, + 27539, + 27540, + 27541, + 27542, + 27544, + 27545, + 27546, + 27547, + 27548, + 27549, + 27550, + 27551, + 27552, + 27553, + 27555, + 27556, + 27557, + 27558, + 27559, + 27560, + 27561, + 27562, + 27563, + 27564, + 27565, + 27566, + 27567, + 27568, + 27569, + 27570, + 27571, + 27573, + 27574, + 27575, + 27576, + 27577, + 27578, + 27579, + 27580, + 27581, + 27582, + 27583, + 27584, + 27585, + 27587, + 27588, + 27589, + 27590, + 27591, + 27593, + 27595, + 27596, + 27597, + 27598, + 27599, + 27600, + 27601, + 27602, + 27603, + 27604, + 27605, + 27606, + 27607, + 27608, + 27609, + 27610, + 27611, + 27612, + 27613, + 27615, + 27616, + 27617, + 27618, + 27619, + 27620, + 27622, + 27623, + 27624, + 27625, + 27626, + 27627, + 27628, + 27629, + 27630, + 27631, + 27632, + 27633, + 27634, + 27635, + 27636, + 27637, + 27638, + 27639, + 27640, + 27641, + 27642, + 27643, + 27644, + 27645, + 27648, + 27649, + 27650, + 27651, + 27652, + 27653, + 27654, + 27655, + 27656, + 27657, + 27658, + 27660, + 27661, + 27662, + 27663, + 27664, + 27665, + 27666, + 27667, + 27668, + 27669, + 27671, + 27672, + 27673, + 27674, + 27675, + 27677, + 27679, + 27680, + 27681, + 27682, + 27683, + 27684, + 27685, + 27686, + 27687, + 27688, + 27689, + 27690, + 27691, + 27692, + 27693, + 27694, + 27695, + 27696, + 27697, + 27699, + 27700, + 27701, + 27702, + 27703, + 27704, + 27705, + 27706, + 27707, + 27708, + 27709, + 27710, + 27711, + 27712, + 27713, + 27714, + 27715, + 27717, + 27719, + 27720, + 27721, + 27722, + 27723, + 27724, + 27725, + 27726, + 27727, + 27728, + 27729, + 27730, + 27731, + 27732, + 27733, + 27734, + 27735, + 27736, + 27737, + 27738, + 27739, + 27740, + 27741, + 27742, + 27743, + 27744, + 27745, + 27747, + 27748, + 27749, + 27750, + 27751, + 27752, + 27753, + 27754, + 27755, + 27756, + 27757, + 27758, + 27759, + 27760, + 27762, + 27763, + 27764, + 27765, + 27766, + 27767, + 27768, + 27770, + 27772, + 27773, + 27774, + 27775, + 27776, + 27780, + 27781, + 27782, + 27783, + 27784, + 27785, + 27786, + 27787, + 27788, + 27789, + 27790, + 27791, + 27792, + 27793, + 27794, + 27795, + 27796, + 27797, + 27798, + 27799, + 27800, + 27801, + 27802, + 27803, + 27804, + 27807, + 27808, + 27810, + 27811, + 27812, + 27813, + 27814, + 27815, + 27816, + 27817, + 27818, + 27819, + 27820, + 27821, + 27822, + 27823, + 27824, + 27825, + 27826, + 27827, + 27828, + 27829, + 27830, + 27831, + 27832, + 27833, + 27834, + 27835, + 27836, + 27837, + 27838, + 27839, + 27840, + 27841, + 27842, + 27843, + 27844, + 27846, + 27847, + 27849, + 27850, + 27851, + 27852, + 27853, + 27854, + 27855, + 27856, + 27859, + 27860, + 27862, + 27863, + 27864, + 27865, + 27866, + 27867, + 27868, + 27869, + 27870, + 27871, + 27872, + 27873, + 27874, + 27875, + 27876, + 27877, + 27878, + 27880, + 27881, + 27882, + 27883, + 27884, + 27885, + 27886, + 27887, + 27888, + 27889, + 27890, + 27891, + 27892, + 27893, + 27894, + 27895, + 27896, + 27897, + 27898, + 27899, + 27900, + 27901, + 27902, + 27903, + 27905, + 27906, + 27907, + 27908, + 27909, + 27910, + 27911, + 27912, + 27913, + 27914, + 27915, + 27916, + 27917, + 27918, + 27919, + 27920, + 27921, + 27922, + 27924, + 27925, + 27926, + 27927, + 27928, + 27929, + 27930, + 27933, + 27934, + 27935, + 27936, + 27937, + 27938, + 27939, + 27940, + 27941, + 27942, + 27943, + 27944, + 27945, + 27946, + 27947, + 27948, + 27949, + 27950, + 27951, + 27952, + 27953, + 27955, + 27956, + 27957, + 27958, + 27959, + 27960, + 27961, + 27962, + 27963, + 27964, + 27965, + 27966, + 27967, + 27968, + 27969, + 27970, + 27971, + 27972, + 27973, + 27974, + 27975, + 27976, + 27977, + 27978, + 27979, + 27980, + 27981, + 27982, + 27983, + 27984, + 27985, + 27986, + 27987, + 27988, + 27989, + 27990, + 27991, + 27992, + 27993, + 27994, + 27995, + 27996, + 27997, + 27998, + 27999, + 28000, + 28001, + 28002, + 28005, + 28006, + 28007, + 28008, + 28009, + 28010, + 28011, + 28012, + 28013, + 28014, + 28015, + 28016, + 28017, + 28018, + 28019, + 28020, + 28021, + 28022, + 28023, + 28024, + 28025, + 28026, + 28027, + 28028, + 28029, + 28030, + 28031, + 28032, + 28033, + 28034, + 28035, + 28036, + 28037, + 28038, + 28039, + 28041, + 28042, + 28043, + 28044, + 28045, + 28046, + 28048, + 28049, + 28050, + 28051, + 28052, + 28053, + 28054, + 28055, + 28056, + 28057, + 28058, + 28060, + 28061, + 28062, + 28063, + 28064, + 28065, + 28067, + 28068, + 28069, + 28070, + 28071, + 28073, + 28074, + 28075, + 28076, + 28077, + 28078, + 28079, + 28080, + 28081, + 28082, + 28084, + 28086, + 28087, + 28088, + 28089, + 28090, + 28091, + 28092, + 28093, + 28094, + 28095, + 28096, + 28097, + 28098, + 28099, + 28100, + 28101, + 28103, + 28104, + 28105, + 28106, + 28107, + 28108, + 28109, + 28110, + 28111, + 28112, + 28113, + 28114, + 28115, + 28116, + 28117, + 28118, + 28119, + 28120, + 28121, + 28122, + 28123, + 28124, + 28126, + 28127, + 28129, + 28130, + 28131, + 28132, + 28133, + 28135, + 28136, + 28137, + 28138, + 28139, + 28140, + 28141, + 28142, + 28143, + 28144, + 28145, + 28146, + 28147, + 28148, + 28149, + 28150, + 28151, + 28152, + 28153, + 28154, + 28155, + 28156, + 28157, + 28158, + 28159, + 28160, + 28161, + 28162, + 28163, + 28164, + 28165, + 28166, + 28167, + 28168, + 28169, + 28170, + 28171, + 28172, + 28173, + 28175, + 28176, + 28177, + 28178, + 28179, + 28180, + 28181, + 28182, + 28183, + 28184, + 28185, + 28187, + 28188, + 28189, + 28190, + 28191, + 28192, + 28193, + 28194, + 28196, + 28197, + 28198, + 28199, + 28200, + 28201, + 28202, + 28203, + 28206, + 28207, + 28209, + 28210, + 28211, + 28213, + 28214, + 28215, + 28216, + 28217, + 28218, + 28219, + 28220, + 28221, + 28222, + 28223, + 28224, + 28225, + 28226, + 28227, + 28228, + 28229, + 28231, + 28232, + 28233, + 28234, + 28235, + 28236, + 28238, + 28239, + 28240, + 28241, + 28243, + 28244, + 28245, + 28246, + 28247, + 28248, + 28249, + 28251, + 28252, + 28253, + 28254, + 28255, + 28257, + 28258, + 28259, + 28260, + 28261, + 28262, + 28265, + 28266, + 28267, + 28268, + 28269, + 28270, + 28271, + 28272, + 28273, + 28274, + 28275, + 28276, + 28277, + 28279, + 28280, + 28281, + 28282, + 28283, + 28284, + 28285, + 28286, + 28287, + 28288, + 28289, + 28290, + 28291, + 28292, + 28293, + 28294, + 28295, + 28296, + 28297, + 28301, + 28302, + 28303, + 28304, + 28305, + 28306, + 28307, + 28308, + 28309, + 28310, + 28312, + 28313, + 28314, + 28315, + 28316, + 28317, + 28318, + 28320, + 28321, + 28322, + 28323, + 28324, + 28325, + 28326, + 28328, + 28329, + 28330, + 28332, + 28334, + 28335, + 28336, + 28337, + 28338, + 28339, + 28341, + 28343, + 28344, + 28345, + 28346, + 28347, + 28348, + 28349, + 28350, + 28351, + 28352, + 28353, + 28354, + 28355, + 28356, + 28357, + 28358, + 28359, + 28360, + 28361, + 28363, + 28364, + 28365, + 28366, + 28368, + 28369, + 28370, + 28371, + 28372, + 28373, + 28374, + 28375, + 28376, + 28377, + 28378, + 28379, + 28380, + 28381, + 28382, + 28383, + 28384, + 28385, + 28386, + 28387, + 28388, + 28389, + 28390, + 28391, + 28392, + 28393, + 28394, + 28395, + 28396, + 28397, + 28398, + 28399, + 28400, + 28401, + 28402, + 28403, + 28404, + 28405, + 28406, + 28407, + 28408, + 28409, + 28410, + 28411, + 28412, + 28413, + 28414, + 28415, + 28417, + 28418, + 28419, + 28420, + 28421, + 28422, + 28423, + 28424, + 28425, + 28426, + 28427, + 28428, + 28429, + 28430, + 28431, + 28432, + 28433, + 28434, + 28435, + 28437, + 28438, + 28439, + 28440, + 28441, + 28442, + 28443, + 28444, + 28445, + 28446, + 28447, + 28448, + 28449, + 28450, + 28451, + 28452, + 28453, + 28454, + 28456, + 28457, + 28458, + 28459, + 28460, + 28461, + 28462, + 28463, + 28464, + 28465, + 28466, + 28467, + 28468, + 28469, + 28470, + 28471, + 28472, + 28473, + 28475, + 28477, + 28478, + 28479, + 28480, + 28482, + 28483, + 28484, + 28485, + 28486, + 28487, + 28488, + 28489, + 28490, + 28491, + 28492, + 28493, + 28495, + 28496, + 28497, + 28498, + 28499, + 28500, + 28501, + 28502, + 28503, + 28504, + 28505, + 28506, + 28507, + 28508, + 28509, + 28510, + 28511, + 28512, + 28513, + 28514, + 28515, + 28516, + 28517, + 28518, + 28519, + 28520, + 28521, + 28522, + 28523, + 28524, + 28525, + 28526, + 28527, + 28528, + 28529, + 28530, + 28531, + 28532, + 28533, + 28534, + 28535, + 28536, + 28537, + 28538, + 28539, + 28540, + 28541, + 28542, + 28543, + 28544, + 28545, + 28546, + 28548, + 28549, + 28550, + 28551, + 28552, + 28554, + 28555, + 28556, + 28557, + 28558, + 28559, + 28560, + 28561, + 28562, + 28563, + 28564, + 28565, + 28566, + 28567, + 28568, + 28569, + 28570, + 28571, + 28573, + 28574, + 28575, + 28576, + 28577, + 28578, + 28580, + 28581, + 28582, + 28583, + 28584, + 28585, + 28586, + 28587, + 28588, + 28589, + 28590, + 28591, + 28592, + 28593, + 28594, + 28595, + 28596, + 28597, + 28600, + 28601, + 28602, + 28603, + 28604, + 28605, + 28606, + 28607, + 28608, + 28611, + 28612, + 28613, + 28614, + 28615, + 28616, + 28617, + 28618, + 28619, + 28620, + 28621, + 28622, + 28623, + 28624, + 28625, + 28626, + 28627, + 28628, + 28629, + 28630, + 28631, + 28632, + 28633, + 28634, + 28635, + 28636, + 28638, + 28639, + 28640, + 28641, + 28642, + 28643, + 28644, + 28645, + 28646, + 28647, + 28648, + 28649, + 28651, + 28652, + 28653, + 28654, + 28655, + 28656, + 28657, + 28658, + 28659, + 28660, + 28661, + 28662, + 28663, + 28664, + 28665, + 28666, + 28668, + 28669, + 28670, + 28671, + 28672, + 28673, + 28674, + 28675, + 28676, + 28677, + 28678, + 28679, + 28680, + 28682, + 28683, + 28684, + 28686, + 28687, + 28688, + 28689, + 28690, + 28691, + 28692, + 28693, + 28694, + 28695, + 28696, + 28697, + 28698, + 28699, + 28700, + 28701, + 28702, + 28703, + 28704, + 28705, + 28706, + 28707, + 28708, + 28709, + 28710, + 28711, + 28712, + 28713, + 28714, + 28715, + 28716, + 28717, + 28718, + 28719, + 28720, + 28721, + 28722, + 28723, + 28724, + 28725, + 28726, + 28727, + 28728, + 28730, + 28731, + 28732, + 28734, + 28735, + 28736, + 28737, + 28738, + 28740, + 28741, + 28742, + 28744, + 28745, + 28746, + 28747, + 28748, + 28749, + 28751, + 28752, + 28753, + 28754, + 28755, + 28756, + 28757, + 28758, + 28759, + 28760, + 28761, + 28762, + 28764, + 28765, + 28766, + 28767, + 28768, + 28769, + 28770, + 28771, + 28772, + 28773, + 28774, + 28775, + 28776, + 28777, + 28778, + 28779, + 28780, + 28781, + 28782, + 28784, + 28785, + 28786, + 28788, + 28789, + 28790, + 28791, + 28793, + 28794, + 28795, + 28796, + 28797, + 28798, + 28800, + 28801, + 28802, + 28803, + 28804, + 28805, + 28807, + 28808, + 28809, + 28810, + 28811, + 28812, + 28813, + 28814, + 28815, + 28816, + 28817, + 28818, + 28819, + 28821, + 28822, + 28823, + 28824, + 28825, + 28827, + 28828, + 28829, + 28830, + 28831, + 28832, + 28833, + 28834, + 28835, + 28836, + 28837, + 28838, + 28839, + 28840, + 28841, + 28842, + 28843, + 28844, + 28845, + 28846, + 28847, + 28848, + 28849, + 28850, + 28851, + 28852, + 28853, + 28854, + 28855, + 28856, + 28857, + 28858, + 28860, + 28861, + 28863, + 28865, + 28866, + 28868, + 28869, + 28870, + 28871, + 28872, + 28873, + 28874, + 28875, + 28876, + 28878, + 28879, + 28881, + 28882, + 28885, + 28886, + 28887, + 28888, + 28889, + 28890, + 28891, + 28893, + 28894, + 28895, + 28896, + 28897, + 28899, + 28900, + 28901, + 28902, + 28903, + 28904, + 28905, + 28906, + 28907, + 28908, + 28909, + 28910, + 28911, + 28912, + 28913, + 28914, + 28915, + 28917, + 28918, + 28919, + 28920, + 28921, + 28922, + 28923, + 28924, + 28926, + 28928, + 28929, + 28930, + 28931, + 28932, + 28933, + 28934, + 28935, + 28937, + 28938, + 28939, + 28940, + 28941, + 28943, + 28944, + 28945, + 28946, + 28949, + 28950, + 28951, + 28954, + 28955, + 28956, + 28957, + 28958, + 28959, + 28960, + 28961, + 28962, + 28963, + 28965, + 28966, + 28967, + 28968, + 28969, + 28970, + 28971, + 28972, + 28973, + 28974, + 28975, + 28976, + 28977, + 28978, + 28979, + 28980, + 28981, + 28982, + 28983, + 28984, + 28986, + 28987, + 28988, + 28989, + 28990, + 28992, + 28993, + 28994, + 28995, + 28996, + 28997, + 28998, + 28999, + 29000, + 29001, + 29002, + 29003, + 29004, + 29005, + 29006, + 29007, + 29008, + 29009, + 29010, + 29011, + 29013, + 29014, + 29015, + 29016, + 29017, + 29018, + 29019, + 29020, + 29021, + 29022, + 29023, + 29024, + 29025, + 29026, + 29027, + 29028, + 29029, + 29030, + 29031, + 29032, + 29033, + 29034, + 29036, + 29037, + 29038, + 29040, + 29041, + 29042, + 29043, + 29044, + 29045, + 29046, + 29047, + 29048, + 29049, + 29050, + 29051, + 29052, + 29055, + 29056, + 29057, + 29058, + 29059, + 29060, + 29061, + 29062, + 29063, + 29064, + 29065, + 29066, + 29067, + 29068, + 29071, + 29072, + 29073, + 29074, + 29075, + 29076, + 29077, + 29078, + 29079, + 29080, + 29081, + 29082, + 29083, + 29084, + 29085, + 29086, + 29087, + 29088, + 29089, + 29090, + 29091, + 29092, + 29093, + 29094, + 29095, + 29096, + 29097, + 29099, + 29100, + 29101, + 29102, + 29103, + 29104, + 29105, + 29106, + 29107, + 29108, + 29109, + 29110, + 29111, + 29112, + 29113, + 29115, + 29116, + 29117, + 29118, + 29119, + 29120, + 29121, + 29122, + 29123, + 29124, + 29125, + 29126, + 29127, + 29128, + 29129, + 29130, + 29131, + 29132, + 29133, + 29134, + 29135, + 29136, + 29137, + 29138, + 29140, + 29141, + 29142, + 29143, + 29144, + 29145, + 29146, + 29147, + 29148, + 29150, + 29151, + 29152, + 29153, + 29154, + 29155, + 29156, + 29157, + 29158, + 29159, + 29160, + 29161, + 29162, + 29163, + 29164, + 29165, + 29166, + 29167, + 29168, + 29169, + 29170, + 29171, + 29172, + 29173, + 29174, + 29175, + 29176, + 29177, + 29178, + 29179, + 29180, + 29181, + 29183, + 29184, + 29185, + 29186, + 29187, + 29188, + 29190, + 29191, + 29192, + 29193, + 29194, + 29196, + 29197, + 29198, + 29199, + 29200, + 29201, + 29202, + 29203, + 29204, + 29206, + 29207, + 29208, + 29209, + 29210, + 29211, + 29212, + 29213, + 29214, + 29215, + 29216, + 29217, + 29219, + 29220, + 29221, + 29222, + 29223, + 29224, + 29225, + 29226, + 29227, + 29228, + 29229, + 29230, + 29231, + 29232, + 29233, + 29236, + 29237, + 29238, + 29239, + 29240, + 29241, + 29242, + 29243, + 29244, + 29245, + 29246, + 29247, + 29248, + 29249, + 29250, + 29251, + 29252, + 29253, + 29254, + 29255, + 29256, + 29257, + 29258, + 29259, + 29260, + 29261, + 29262, + 29263, + 29264, + 29265, + 29266, + 29268, + 29269, + 29270, + 29271, + 29272, + 29273, + 29274, + 29275, + 29277, + 29278, + 29279, + 29280, + 29281, + 29282, + 29283, + 29285, + 29286, + 29287, + 29288, + 29289, + 29290, + 29291, + 29292, + 29293, + 29294, + 29295, + 29296, + 29297, + 29298, + 29299, + 29301, + 29302, + 29303, + 29304, + 29305, + 29306, + 29307, + 29308, + 29309, + 29310, + 29311, + 29312, + 29313, + 29314, + 29315, + 29316, + 29317, + 29318, + 29319, + 29320, + 29321, + 29322, + 29323, + 29324, + 29325, + 29326, + 29327, + 29328, + 29329, + 29330, + 29331, + 29332, + 29333, + 29334, + 29335, + 29337, + 29338, + 29339, + 29340, + 29341, + 29342, + 29343, + 29344, + 29345, + 29346, + 29348, + 29350, + 29351, + 29352, + 29353, + 29354, + 29355, + 29356, + 29357, + 29359, + 29360, + 29361, + 29362, + 29363, + 29364, + 29365, + 29367, + 29368, + 29369, + 29370, + 29371, + 29372, + 29373, + 29374, + 29375, + 29376, + 29377, + 29378, + 29379, + 29380, + 29381, + 29382, + 29384, + 29385, + 29386, + 29387, + 29388, + 29389, + 29390, + 29391, + 29392, + 29393, + 29394, + 29395, + 29396, + 29397, + 29398, + 29399, + 29400, + 29401, + 29402, + 29403, + 29404, + 29405, + 29406, + 29407, + 29408, + 29409, + 29410, + 29411, + 29412, + 29413, + 29414, + 29415, + 29416, + 29417, + 29418, + 29419, + 29420, + 29421, + 29422, + 29423, + 29424, + 29425, + 29426, + 29427, + 29428, + 29429, + 29430, + 29431, + 29432, + 29433, + 29434, + 29435, + 29436, + 29437, + 29438, + 29440, + 29442, + 29443, + 29444, + 29445, + 29446, + 29447, + 29448, + 29449, + 29452, + 29453, + 29454, + 29455, + 29456, + 29457, + 29458, + 29459, + 29460, + 29461, + 29462, + 29463, + 29464, + 29465, + 29466, + 29467, + 29468, + 29469, + 29470, + 29471, + 29472, + 29473, + 29474, + 29475, + 29476, + 29477, + 29478, + 29479, + 29480, + 29481, + 29482, + 29483, + 29484, + 29485, + 29486, + 29487, + 29488, + 29489, + 29490, + 29491, + 29492, + 29493, + 29494, + 29495, + 29496, + 29497, + 29498, + 29499, + 29500, + 29501, + 29502, + 29503, + 29504, + 29505, + 29506, + 29507, + 29508, + 29510, + 29511, + 29512, + 29513, + 29515, + 29516, + 29517, + 29518, + 29519, + 29520, + 29521, + 29522, + 29523, + 29524, + 29525, + 29526, + 29527, + 29528, + 29529, + 29530, + 29531, + 29532, + 29533, + 29534, + 29535, + 29537, + 29538, + 29539, + 29540, + 29541, + 29542, + 29543, + 29545, + 29546, + 29547, + 29548, + 29549, + 29550, + 29551, + 29552, + 29554, + 29555, + 29556, + 29557, + 29558, + 29559, + 29560, + 29561, + 29562, + 29563, + 29564, + 29565, + 29566, + 29567, + 29568, + 29569, + 29570, + 29571, + 29572, + 29573, + 29574, + 29575, + 29576, + 29577, + 29578, + 29579, + 29580, + 29581, + 29582, + 29583, + 29584, + 29585, + 29586, + 29587, + 29588, + 29589, + 29590, + 29591, + 29592, + 29593, + 29594, + 29595, + 29596, + 29597, + 29598, + 29599, + 29600, + 29601, + 29602, + 29603, + 29604, + 29605, + 29606, + 29607, + 29608, + 29609, + 29610, + 29611, + 29612, + 29613, + 29614, + 29615, + 29617, + 29618, + 29619, + 29620, + 29621, + 29622, + 29623, + 29624, + 29625, + 29626, + 29627, + 29628, + 29629, + 29630, + 29631, + 29632, + 29633, + 29634, + 29635, + 29636, + 29637, + 29638, + 29639, + 29640, + 29641, + 29642, + 29643, + 29644, + 29645, + 29646, + 29647, + 29648, + 29649, + 29650, + 29651, + 29652, + 29653, + 29654, + 29655, + 29656, + 29657, + 29658, + 29659, + 29660, + 29661, + 29662, + 29663, + 29664, + 29665, + 29666, + 29668, + 29669, + 29670, + 29671, + 29672, + 29673, + 29674, + 29675, + 29676, + 29677, + 29678, + 29679, + 29680, + 29681, + 29682, + 29684, + 29685, + 29686, + 29687, + 29689, + 29690, + 29691, + 29692, + 29693, + 29694, + 29695, + 29696, + 29697, + 29698, + 29699, + 29700, + 29701, + 29702, + 29703, + 29704, + 29705, + 29706, + 29707, + 29708, + 29709, + 29710, + 29711, + 29712, + 29713, + 29714, + 29715, + 29716, + 29717, + 29718, + 29719, + 29720, + 29721, + 29722, + 29723, + 29724, + 29725, + 29727, + 29729, + 29730, + 29731, + 29732, + 29733, + 29734, + 29735, + 29736, + 29737, + 29738, + 29739, + 29740, + 29742, + 29743, + 29744, + 29745, + 29746, + 29747, + 29748, + 29749, + 29750, + 29751, + 29752, + 29753, + 29754, + 29755, + 29756, + 29757, + 29758, + 29759, + 29761, + 29762, + 29763, + 29764, + 29767, + 29768, + 29769, + 29770, + 29771, + 29772, + 29773, + 29774, + 29775, + 29776, + 29777, + 29778, + 29779, + 29780, + 29781, + 29782, + 29783, + 29784, + 29785, + 29786, + 29787, + 29788, + 29789, + 29790, + 29791, + 29792, + 29793, + 29794, + 29795, + 29796, + 29797, + 29798, + 29799, + 29800, + 29802, + 29804, + 29805, + 29806, + 29807, + 29808, + 29809, + 29810, + 29811, + 29812, + 29813, + 29814, + 29815, + 29816, + 29817, + 29818, + 29819, + 29820, + 29821, + 29822, + 29825, + 29826, + 29827, + 29828, + 29829, + 29830, + 29831, + 29833, + 29834, + 29836, + 29838, + 29839, + 29840, + 29841, + 29843, + 29844, + 29845, + 29847, + 29848, + 29849, + 29850, + 29851, + 29852, + 29853, + 29854, + 29855, + 29856, + 29857, + 29858, + 29859, + 29860, + 29861, + 29863, + 29864, + 29865, + 29867, + 29868, + 29869, + 29870, + 29871, + 29872, + 29873, + 29874, + 29875, + 29877, + 29878, + 29879, + 29880, + 29881, + 29882, + 29883, + 29884, + 29885, + 29886, + 29887, + 29888, + 29891, + 29892, + 29893, + 29894, + 29895, + 29896, + 29898, + 29899, + 29900, + 29901, + 29902, + 29903, + 29904, + 29905, + 29906, + 29907, + 29908, + 29909, + 29910, + 29911, + 29912, + 29913, + 29914, + 29915, + 29916, + 29917, + 29919, + 29920, + 29921, + 29922, + 29923, + 29924, + 29925, + 29926, + 29927, + 29928, + 29929, + 29930, + 29931, + 29932, + 29933, + 29934, + 29935, + 29936, + 29937, + 29938, + 29939, + 29940, + 29941, + 29942, + 29943, + 29945, + 29946, + 29947, + 29948, + 29949, + 29950, + 29951, + 29952, + 29953, + 29954, + 29955, + 29956, + 29957, + 29958, + 29959, + 29960, + 29961, + 29962, + 29964, + 29965, + 29966, + 29967, + 29969, + 29970, + 29972, + 29973, + 29974, + 29975, + 29976, + 29977, + 29978, + 29979, + 29980, + 29981, + 29982, + 29983, + 29985, + 29986, + 29987, + 29988, + 29989, + 29990, + 29991, + 29992, + 29993, + 29994, + 29995, + 29996, + 29997, + 29998, + 29999, + 30000, + 30001, + 30002, + 30004, + 30005, + 30006, + 30007, + 30008, + 30009, + 30010, + 30011, + 30012, + 30013, + 30014, + 30015, + 30016, + 30017, + 30018, + 30019, + 30020, + 30021, + 30023, + 30024, + 30025, + 30026, + 30027, + 30028, + 30029, + 30030, + 30031, + 30032, + 30033, + 30034, + 30035, + 30036, + 30037, + 30039, + 30040, + 30041, + 30042, + 30043, + 30044, + 30045, + 30046, + 30047, + 30048, + 30049, + 30050, + 30051, + 30052, + 30053, + 30054, + 30055, + 30056, + 30057, + 30058, + 30059, + 30060, + 30061, + 30062, + 30063, + 30064, + 30065, + 30066, + 30067, + 30068, + 30069, + 30070, + 30071, + 30072, + 30073, + 30074, + 30076, + 30077, + 30078, + 30079, + 30080, + 30083, + 30084, + 30085, + 30086, + 30087, + 30088, + 30089, + 30090, + 30091, + 30092, + 30093, + 30094, + 30095, + 30097, + 30098, + 30099, + 30100, + 30101, + 30102, + 30103, + 30105, + 30106, + 30107, + 30108, + 30109, + 30110, + 30111, + 30112, + 30113, + 30114, + 30115, + 30116, + 30117, + 30118, + 30119, + 30120, + 30121, + 30122, + 30124, + 30125, + 30126, + 30127, + 30128, + 30129, + 30130, + 30131, + 30132, + 30133, + 30134, + 30135, + 30136, + 30137, + 30138, + 30139, + 30140, + 30141, + 30142, + 30143, + 30144, + 30145, + 30146, + 30147, + 30148, + 30149, + 30150, + 30151, + 30153, + 30154, + 30155, + 30156, + 30157, + 30158, + 30159, + 30160, + 30161, + 30163, + 30164, + 30165, + 30166, + 30167, + 30168, + 30169, + 30171, + 30172, + 30173, + 30174, + 30175, + 30176, + 30177, + 30178, + 30179, + 30180, + 30181, + 30182, + 30183, + 30184, + 30185, + 30186, + 30187, + 30188, + 30189, + 30190, + 30191, + 30192, + 30193, + 30194, + 30195, + 30196, + 30197, + 30198, + 30199, + 30200, + 30202, + 30203, + 30204, + 30205, + 30206, + 30207, + 30208, + 30209, + 30210, + 30211, + 30213, + 30215, + 30216, + 30218, + 30219, + 30220, + 30221, + 30222, + 30223, + 30224, + 30226, + 30227, + 30228, + 30229, + 30230, + 30231, + 30232, + 30233, + 30234, + 30235, + 30237, + 30238, + 30239, + 30240, + 30242, + 30243, + 30244, + 30245, + 30246, + 30247, + 30248, + 30249, + 30250, + 30251, + 30252, + 30253, + 30254, + 30255, + 30256, + 30257, + 30258, + 30259, + 30260, + 30261, + 30262, + 30263, + 30264, + 30265, + 30266, + 30267, + 30268, + 30269, + 30270, + 30271, + 30272, + 30273, + 30274, + 30276, + 30277, + 30279, + 30280, + 30281, + 30282, + 30283, + 30285, + 30286, + 30287, + 30288, + 30289, + 30290, + 30291, + 30292, + 30293, + 30294, + 30295, + 30296, + 30297, + 30298, + 30299, + 30300, + 30301, + 30302, + 30303, + 30304, + 30305, + 30306, + 30307, + 30308, + 30309, + 30310, + 30311, + 30312, + 30313, + 30314, + 30315, + 30316, + 30317, + 30318, + 30319, + 30320, + 30321, + 30322, + 30323, + 30324, + 30325, + 30326, + 30327, + 30328, + 30329, + 30330, + 30331, + 30332, + 30333, + 30334, + 30335, + 30336, + 30337, + 30339, + 30340, + 30341, + 30342, + 30343, + 30344, + 30345, + 30346, + 30347, + 30348, + 30349, + 30350, + 30351, + 30352, + 30353, + 30354, + 30355, + 30356, + 30357, + 30358, + 30359, + 30360, + 30361, + 30362, + 30363, + 30364, + 30365, + 30367, + 30368, + 30369, + 30370, + 30371, + 30372, + 30373, + 30374, + 30376, + 30378, + 30379, + 30382, + 30383, + 30384, + 30386, + 30387, + 30388, + 30390, + 30391, + 30392, + 30393, + 30394, + 30395, + 30396, + 30397, + 30398, + 30399, + 30400, + 30401, + 30402, + 30403, + 30404, + 30405, + 30406, + 30407, + 30408, + 30409, + 30411, + 30412, + 30413, + 30415, + 30416, + 30417, + 30418, + 30419, + 30420, + 30421, + 30422, + 30423, + 30424, + 30425, + 30426, + 30427, + 30428, + 30429, + 30430, + 30431, + 30432, + 30433, + 30435, + 30436, + 30437, + 30438, + 30439, + 30440, + 30441, + 30442, + 30443, + 30445, + 30446, + 30447, + 30448, + 30449, + 30450, + 30451, + 30452, + 30453, + 30454, + 30455, + 30456, + 30457, + 30458, + 30459, + 30460, + 30461, + 30462, + 30463, + 30464, + 30465, + 30467, + 30469, + 30470, + 30471, + 30473, + 30474, + 30476, + 30477, + 30479, + 30480, + 30481, + 30482, + 30483, + 30484, + 30485, + 30486, + 30487, + 30488, + 30489, + 30490, + 30491, + 30492, + 30493, + 30494, + 30495, + 30496, + 30497, + 30498, + 30499, + 30500, + 30501, + 30502, + 30503, + 30504, + 30506, + 30507, + 30508, + 30509, + 30511, + 30512, + 30513, + 30514, + 30515, + 30516, + 30517, + 30518, + 30519, + 30521, + 30522, + 30523, + 30524, + 30526, + 30527, + 30528, + 30529, + 30530, + 30531, + 30532, + 30534, + 30535, + 30536, + 30538, + 30539, + 30540, + 30541, + 30542, + 30543, + 30544, + 30545, + 30546, + 30547, + 30548, + 30549, + 30550, + 30551, + 30552, + 30553, + 30554, + 30555, + 30556, + 30557, + 30558, + 30559, + 30560, + 30561, + 30562, + 30563, + 30564, + 30565, + 30566, + 30568, + 30569, + 30570, + 30571, + 30572, + 30573, + 30574, + 30575, + 30576, + 30577, + 30578, + 30579, + 30580, + 30581, + 30582, + 30583, + 30584, + 30585, + 30586, + 30587, + 30588, + 30589, + 30590, + 30591, + 30592, + 30593, + 30594, + 30595, + 30596, + 30597, + 30598, + 30599, + 30600, + 30601, + 30602, + 30603, + 30604, + 30605, + 30606, + 30607, + 30608, + 30609, + 30610, + 30611, + 30612, + 30613, + 30614, + 30615, + 30616, + 30617, + 30618, + 30619, + 30620, + 30621, + 30622, + 30626, + 30627, + 30628, + 30629, + 30630, + 30631, + 30632, + 30633, + 30634, + 30635, + 30636, + 30637, + 30638, + 30639, + 30640, + 30641, + 30642, + 30643, + 30644, + 30645, + 30646, + 30648, + 30651, + 30652, + 30653, + 30654, + 30655, + 30656, + 30657, + 30658, + 30659, + 30660, + 30661, + 30662, + 30664, + 30665, + 30667, + 30668, + 30669, + 30670, + 30671, + 30672, + 30673, + 30674, + 30675, + 30676, + 30677, + 30679, + 30680, + 30681, + 30682, + 30683, + 30684, + 30685, + 30686, + 30688, + 30689, + 30690, + 30691, + 30692, + 30693, + 30694, + 30695, + 30696, + 30697, + 30698, + 30699, + 30700, + 30701, + 30703, + 30704, + 30705, + 30706, + 30707, + 30708, + 30709, + 30711, + 30712, + 30713, + 30714, + 30715, + 30716, + 30717, + 30718, + 30719, + 30720, + 30721, + 30722, + 30723, + 30724, + 30725, + 30726, + 30727, + 30728, + 30731, + 30732, + 30733, + 30736, + 30737, + 30738, + 30739, + 30740, + 30741, + 30742, + 30743, + 30744, + 30745, + 30746, + 30747, + 30748, + 30749, + 30750, + 30751, + 30752, + 30753, + 30755, + 30756, + 30758, + 30759, + 30760, + 30761, + 30762, + 30763, + 30764, + 30765, + 30766, + 30767, + 30768, + 30769, + 30770, + 30771, + 30772, + 30773, + 30774, + 30775, + 30776, + 30777, + 30778, + 30779, + 30780, + 30781, + 30782, + 30783, + 30784, + 30785, + 30786, + 30787, + 30788, + 30789, + 30790, + 30791, + 30792, + 30794, + 30795, + 30797, + 30798, + 30799, + 30800, + 30801, + 30803, + 30804, + 30806, + 30807, + 30808, + 30809, + 30810, + 30811, + 30812, + 30813, + 30814, + 30816, + 30817, + 30818, + 30819, + 30820, + 30821, + 30822, + 30823, + 30824, + 30825, + 30826, + 30827, + 30828, + 30829, + 30830, + 30831, + 30832, + 30833, + 30835, + 30836, + 30841, + 30842, + 30843, + 30844, + 30845, + 30846, + 30847, + 30848, + 30849, + 30850, + 30851, + 30852, + 30853, + 30854, + 30855, + 30857, + 30858, + 30859, + 30860, + 30861, + 30862, + 30863, + 30864, + 30866, + 30867, + 30868, + 30869, + 30870, + 30871, + 30872, + 30873, + 30874, + 30875, + 30876, + 30877, + 30878, + 30879, + 30880, + 30882, + 30883, + 30884, + 30886, + 30887, + 30888, + 30889, + 30890, + 30891, + 30892, + 30893, + 30894, + 30895, + 30896, + 30897, + 30898, + 30899, + 30900, + 30901, + 30902, + 30903, + 30904, + 30905, + 30906, + 30907, + 30908, + 30909, + 30910, + 30911, + 30912, + 30913, + 30914, + 30915, + 30916, + 30917, + 30918, + 30919, + 30920, + 30921, + 30923, + 30924, + 30925, + 30926, + 30927, + 30928, + 30929, + 30930, + 30931, + 30932, + 30933, + 30934, + 30935, + 30936, + 30937, + 30938, + 30939, + 30940, + 30941, + 30942, + 30943, + 30944, + 30945, + 30946, + 30947, + 30949, + 30950, + 30951, + 30952, + 30954, + 30955, + 30956, + 30958, + 30959, + 30960, + 30961, + 30962, + 30963, + 30964, + 30966, + 30967, + 30968, + 30969, + 30970, + 30971, + 30972, + 30973, + 30974, + 30975, + 30976, + 30977, + 30978, + 30979, + 30980, + 30981, + 30982, + 30983, + 30984, + 30985, + 30986, + 30987, + 30989, + 30990, + 30991, + 30992, + 30993, + 30994, + 30995, + 30996, + 30997, + 30998, + 30999, + 31000, + 31002, + 31003, + 31004, + 31005, + 31006, + 31007, + 31008, + 31009, + 31010, + 31011, + 31012, + 31013, + 31014, + 31015, + 31016, + 31017, + 31018, + 31019, + 31020, + 31021, + 31022, + 31024, + 31025, + 31026, + 31027, + 31028, + 31029, + 31030, + 31031, + 31032, + 31033, + 31034, + 31035, + 31036, + 31037, + 31038, + 31039, + 31040, + 31041, + 31044, + 31045, + 31046, + 31047, + 31048, + 31049, + 31050, + 31051, + 31052, + 31053, + 31054, + 31055, + 31056, + 31057, + 31058, + 31059, + 31060, + 31061, + 31062, + 31064, + 31065, + 31066, + 31067, + 31068, + 31069, + 31070, + 31071, + 31072, + 31073, + 31074, + 31075, + 31076, + 31077, + 31078, + 31079, + 31080, + 31081, + 31082, + 31083, + 31084, + 31085, + 31086, + 31087, + 31088, + 31089, + 31090, + 31092, + 31093, + 31095, + 31096, + 31097, + 31098, + 31099, + 31100, + 31101, + 31102, + 31103, + 31104, + 31105, + 31107, + 31108, + 31109, + 31110, + 31111, + 31112, + 31113, + 31114, + 31115, + 31116, + 31117, + 31118, + 31119, + 31120, + 31122, + 31123, + 31124, + 31125, + 31126, + 31127, + 31128, + 31129, + 31130, + 31131, + 31132, + 31133, + 31134, + 31135, + 31136, + 31137, + 31138, + 31139, + 31140, + 31141, + 31142, + 31143, + 31144, + 31145, + 31146, + 31147, + 31148, + 31149, + 31150, + 31151, + 31153, + 31154, + 31155, + 31156, + 31157, + 31158, + 31160, + 31161, + 31162, + 31163, + 31164, + 31165, + 31166, + 31167, + 31168, + 31169, + 31170, + 31171, + 31172, + 31173, + 31174, + 31175, + 31176, + 31178, + 31179, + 31180, + 31181, + 31182, + 31183, + 31184, + 31185, + 31186, + 31187, + 31189, + 31191, + 31192, + 31193, + 31195, + 31196, + 31197, + 31198, + 31199, + 31200, + 31201, + 31202, + 31203, + 31204, + 31205, + 31206, + 31207, + 31208, + 31209, + 31210, + 31211, + 31213, + 31214, + 31215, + 31217, + 31218, + 31219, + 31220, + 31221, + 31222, + 31223, + 31224, + 31225, + 31226, + 31227, + 31228, + 31229, + 31230, + 31231, + 31232, + 31233, + 31234, + 31235, + 31236, + 31237, + 31238, + 31239, + 31240, + 31242, + 31243, + 31244, + 31245, + 31247, + 31248, + 31249, + 31250, + 31251, + 31252, + 31253, + 31254, + 31255, + 31257, + 31258, + 31259, + 31260, + 31262, + 31263, + 31265, + 31266, + 31267, + 31268, + 31269, + 31270, + 31271, + 31272, + 31273, + 31274, + 31275, + 31276, + 31277, + 31278, + 31280, + 31281, + 31282, + 31283, + 31284, + 31285, + 31286, + 31287, + 31288, + 31289, + 31290, + 31291, + 31292, + 31294, + 31296, + 31297, + 31298, + 31299, + 31300, + 31301, + 31302, + 31303, + 31304, + 31305, + 31306, + 31307, + 31308, + 31309, + 31310, + 31311, + 31313, + 31314, + 31315, + 31316, + 31317, + 31318, + 31319, + 31320, + 31321, + 31322, + 31323, + 31324, + 31325, + 31326, + 31327, + 31328, + 31329, + 31330, + 31331, + 31332, + 31333, + 31334, + 31335, + 31336, + 31337, + 31338, + 31339, + 31340, + 31341, + 31342, + 31343, + 31344, + 31345, + 31346, + 31347, + 31348, + 31349, + 31350, + 31351, + 31352, + 31353, + 31354, + 31355, + 31356, + 31357, + 31358, + 31360, + 31361, + 31362, + 31363, + 31364, + 31365, + 31366, + 31367, + 31368, + 31369, + 31370, + 31371, + 31372, + 31373, + 31374, + 31375, + 31376, + 31377, + 31378, + 31379, + 31380, + 31381, + 31382, + 31383, + 31384, + 31385, + 31386, + 31387, + 31388, + 31389, + 31390, + 31391, + 31392, + 31393, + 31394, + 31395, + 31396, + 31397, + 31398, + 31399, + 31401, + 31403, + 31404, + 31405, + 31406, + 31407, + 31409, + 31410, + 31411, + 31412, + 31413, + 31414, + 31415, + 31416, + 31417, + 31418, + 31419, + 31420, + 31421, + 31422, + 31423, + 31424, + 31425, + 31426, + 31427, + 31428, + 31429, + 31430, + 31432, + 31433, + 31434, + 31435, + 31436, + 31437, + 31438, + 31439, + 31440, + 31441, + 31442, + 31443, + 31445, + 31446, + 31447, + 31448, + 31449, + 31450, + 31451, + 31452, + 31453, + 31454, + 31455, + 31456, + 31459, + 31460, + 31461, + 31462, + 31463, + 31464, + 31465, + 31466, + 31467, + 31469, + 31470, + 31471, + 31472, + 31473, + 31474, + 31475, + 31476, + 31477, + 31478, + 31479, + 31480, + 31481, + 31482, + 31483, + 31484, + 31487, + 31488, + 31489, + 31491, + 31492, + 31493, + 31494, + 31495, + 31496, + 31497, + 31499, + 31500, + 31501, + 31502, + 31503, + 31504, + 31505, + 31506, + 31507, + 31510, + 31511, + 31512, + 31513, + 31514, + 31515, + 31516, + 31517, + 31518, + 31519, + 31520, + 31521, + 31522, + 31523, + 31524, + 31525, + 31526, + 31527, + 31528, + 31529, + 31530, + 31531, + 31532, + 31533, + 31534, + 31535, + 31536, + 31537, + 31538, + 31539, + 31540, + 31541, + 31544, + 31545, + 31546, + 31547, + 31548, + 31549, + 31550, + 31551, + 31552, + 31553, + 31554, + 31555, + 31556, + 31557, + 31559, + 31560, + 31561, + 31562, + 31563, + 31564, + 31565, + 31566, + 31567, + 31568, + 31569, + 31570, + 31571, + 31572, + 31573, + 31574, + 31575, + 31576, + 31577, + 31578, + 31579, + 31580, + 31581, + 31582, + 31583, + 31584, + 31585, + 31586, + 31587, + 31588, + 31589, + 31591, + 31592, + 31593, + 31594, + 31595, + 31596, + 31597, + 31598, + 31599, + 31600, + 31601, + 31602, + 31603, + 31604, + 31605, + 31606, + 31607, + 31608, + 31610, + 31611, + 31612, + 31614, + 31615, + 31616, + 31617, + 31618, + 31619, + 31620, + 31621, + 31622, + 31623, + 31624, + 31625, + 31626, + 31627, + 31628, + 31629, + 31630, + 31631, + 31632, + 31633, + 31634, + 31635, + 31636, + 31637, + 31638, + 31639, + 31640, + 31641, + 31642, + 31643, + 31644, + 31645, + 31646, + 31647, + 31648, + 31649, + 31650, + 31651, + 31652, + 31653, + 31655, + 31656, + 31657, + 31658, + 31659, + 31661, + 31662, + 31663, + 31664, + 31665, + 31666, + 31667, + 31668, + 31669, + 31670, + 31671, + 31672, + 31673, + 31674, + 31675, + 31676, + 31677, + 31678, + 31679, + 31680, + 31681, + 31682, + 31683, + 31684, + 31685, + 31686, + 31687, + 31688, + 31689, + 31691, + 31692, + 31693, + 31694, + 31696, + 31698, + 31699, + 31700, + 31701, + 31702, + 31703, + 31704, + 31705, + 31706, + 31707, + 31708, + 31709, + 31710, + 31711, + 31712, + 31713, + 31714, + 31715, + 31716, + 31717, + 31718, + 31719, + 31720, + 31721, + 31722, + 31724, + 31725, + 31726, + 31727, + 31728, + 31729, + 31730, + 31731, + 31732, + 31733, + 31735, + 31736, + 31737, + 31738, + 31740, + 31741, + 31742, + 31743, + 31744, + 31745, + 31746, + 31747, + 31748, + 31749, + 31751, + 31752, + 31753, + 31754, + 31755, + 31756, + 31757, + 31759, + 31761, + 31762, + 31763, + 31764, + 31765, + 31767, + 31768, + 31769, + 31771, + 31772, + 31773, + 31774, + 31775, + 31776, + 31777, + 31779, + 31780, + 31781, + 31782, + 31783, + 31784, + 31785, + 31786, + 31787, + 31788, + 31789, + 31790, + 31791, + 31792, + 31793, + 31794, + 31795, + 31796, + 31797, + 31798, + 31799, + 31800, + 31801, + 31802, + 31803, + 31804, + 31805, + 31806, + 31809, + 31810, + 31811, + 31813, + 31814, + 31815, + 31816, + 31817, + 31818, + 31819, + 31820, + 31822, + 31823, + 31824, + 31825, + 31826, + 31827, + 31828, + 31829, + 31830, + 31831, + 31832, + 31833, + 31834, + 31835, + 31836, + 31837, + 31838, + 31839, + 31840, + 31842, + 31843, + 31844, + 31845, + 31846, + 31847, + 31848, + 31849, + 31850, + 31851, + 31852, + 31854, + 31855, + 31856, + 31858, + 31859, + 31860, + 31861, + 31862, + 31863, + 31864, + 31865, + 31866, + 31867, + 31868, + 31869, + 31870, + 31871, + 31872, + 31873, + 31875, + 31877, + 31878, + 31879, + 31880, + 31881, + 31882, + 31883, + 31884, + 31885, + 31886, + 31887, + 31888, + 31889, + 31890, + 31891, + 31892, + 31893, + 31894, + 31895, + 31896, + 31897, + 31898, + 31899, + 31902, + 31903, + 31904, + 31905, + 31906, + 31907, + 31908, + 31909, + 31911, + 31912, + 31913, + 31914, + 31915, + 31916, + 31917, + 31918, + 31919, + 31920, + 31921, + 31922, + 31923, + 31924, + 31925, + 31926, + 31927, + 31928, + 31929, + 31930, + 31931, + 31932, + 31933, + 31934, + 31935, + 31936, + 31937, + 31938, + 31939, + 31941, + 31942, + 31943, + 31944, + 31945, + 31946, + 31947, + 31948, + 31949, + 31950, + 31951, + 31952, + 31953, + 31954, + 31955, + 31956, + 31957, + 31958, + 31959, + 31960, + 31961, + 31962, + 31963, + 31964, + 31965, + 31966, + 31967, + 31968, + 31969, + 31971, + 31972, + 31973, + 31975, + 31976, + 31977, + 31978, + 31979, + 31980, + 31981, + 31983, + 31984, + 31985, + 31986, + 31987, + 31988, + 31989, + 31990, + 31991, + 31992, + 31993, + 31994, + 31995, + 31996, + 31997, + 31998, + 31999, + 32000, + 32001, + 32002, + 32003, + 32004, + 32005, + 32006, + 32007, + 32008, + 32009, + 32010, + 32011, + 32012, + 32013, + 32014, + 32015, + 32016, + 32017, + 32018, + 32019, + 32020, + 32021, + 32022, + 32023, + 32024, + 32025, + 32026, + 32027, + 32028, + 32029, + 32030, + 32031, + 32032, + 32033, + 32034, + 32035, + 32036, + 32037, + 32038, + 32039, + 32040, + 32041, + 32042, + 32043, + 32044, + 32045, + 32046, + 32047, + 32049, + 32050, + 32051, + 32052, + 32053, + 32054, + 32055, + 32056, + 32057, + 32058, + 32059, + 32060, + 32061, + 32063, + 32064, + 32065, + 32066, + 32067, + 32068, + 32069, + 32070, + 32071, + 32072, + 32073, + 32074, + 32075, + 32076, + 32077, + 32078, + 32079, + 32080, + 32081, + 32082, + 32083, + 32084, + 32085, + 32086, + 32087, + 32088, + 32089, + 32090, + 32091, + 32092, + 32094, + 32095, + 32096, + 32097, + 32098, + 32099, + 32100, + 32101, + 32103, + 32104, + 32105, + 32106, + 32107, + 32108, + 32109, + 32110, + 32112, + 32113, + 32114, + 32116, + 32117, + 32118, + 32122, + 32123, + 32124, + 32125, + 32126, + 32127, + 32128, + 32129, + 32131, + 32132, + 32133, + 32134, + 32136, + 32137, + 32138, + 32139, + 32140, + 32141, + 32142, + 32143, + 32144, + 32147, + 32148, + 32149, + 32151, + 32152, + 32153, + 32154, + 32155, + 32156, + 32157, + 32158, + 32159, + 32160, + 32161, + 32162, + 32163, + 32164, + 32165, + 32166, + 32167, + 32168, + 32169, + 32170, + 32171, + 32172, + 32173, + 32174, + 32175, + 32176, + 32177, + 32178, + 32179, + 32180, + 32181, + 32182, + 32183, + 32184, + 32185, + 32186, + 32188, + 32189, + 32190, + 32191, + 32192, + 32193, + 32194, + 32195, + 32196, + 32197, + 32198, + 32199, + 32200, + 32201, + 32202, + 32203, + 32204, + 32205, + 32206, + 32207, + 32208, + 32209, + 32211, + 32212, + 32213, + 32214, + 32215, + 32216, + 32217, + 32218, + 32219, + 32220, + 32221, + 32222, + 32223, + 32224, + 32225, + 32226, + 32227, + 32228, + 32229, + 32230, + 32231, + 32232, + 32233, + 32234, + 32235, + 32236, + 32237, + 32238, + 32239, + 32240, + 32241, + 32242, + 32243, + 32244, + 32245, + 32246, + 32247, + 32248, + 32249, + 32250, + 32251, + 32252, + 32254, + 32255, + 32256, + 32257, + 32258, + 32259, + 32260, + 32261, + 32262, + 32263, + 32264, + 32266, + 32267, + 32268, + 32269, + 32270, + 32271, + 32272, + 32273, + 32274, + 32275, + 32276, + 32277, + 32278, + 32279, + 32280, + 32281, + 32282, + 32283, + 32284, + 32285, + 32286, + 32287, + 32288, + 32289, + 32290, + 32291, + 32292, + 32293, + 32294, + 32295, + 32296, + 32297, + 32298, + 32299, + 32300, + 32301, + 32302, + 32303, + 32304, + 32305, + 32306, + 32307, + 32308, + 32310, + 32311, + 32312, + 32313, + 32314, + 32315, + 32316, + 32317, + 32318, + 32319, + 32320, + 32321, + 32322, + 32323, + 32324, + 32325, + 32326, + 32327, + 32328, + 32329, + 32330, + 32334, + 32335, + 32336, + 32337, + 32338, + 32339, + 32340, + 32341, + 32342, + 32343, + 32344, + 32346, + 32348, + 32349, + 32350, + 32351, + 32352, + 32353, + 32354, + 32355, + 32356, + 32357, + 32358, + 32359, + 32360, + 32361, + 32362, + 32363, + 32364, + 32365, + 32366, + 32367, + 32368, + 32370, + 32371, + 32372, + 32373, + 32375, + 32376, + 32377, + 32378, + 32379, + 32380, + 32381, + 32382, + 32383, + 32384, + 32386, + 32387, + 32388, + 32390, + 32391, + 32392, + 32393, + 32394, + 32395, + 32396, + 32397, + 32398, + 32399, + 32400, + 32403, + 32404, + 32405, + 32407, + 32408, + 32409, + 32410, + 32411, + 32412, + 32414, + 32415, + 32416, + 32417, + 32418, + 32419, + 32420, + 32421, + 32422, + 32423, + 32424, + 32425, + 32426, + 32427, + 32428, + 32429, + 32430, + 32431, + 32432, + 32433, + 32434, + 32435, + 32436, + 32437, + 32438, + 32439, + 32440, + 32441, + 32442, + 32443, + 32444, + 32445, + 32446, + 32447, + 32448, + 32449, + 32450, + 32451, + 32452, + 32453, + 32454, + 32455, + 32456, + 32457, + 32458, + 32459, + 32460, + 32461, + 32462, + 32463, + 32464, + 32465, + 32466, + 32467, + 32468, + 32469, + 32470, + 32471, + 32472, + 32473, + 32474, + 32475, + 32476, + 32477, + 32478, + 32479, + 32480, + 32481, + 32482, + 32483, + 32484, + 32485, + 32486, + 32487, + 32488, + 32489, + 32490, + 32491, + 32492, + 32493, + 32494, + 32495, + 32496, + 32497, + 32498, + 32499, + 32500, + 32501, + 32502, + 32503, + 32505, + 32507, + 32508, + 32509, + 32510, + 32511, + 32512, + 32513, + 32514, + 32515, + 32516, + 32517, + 32518, + 32519, + 32520, + 32521, + 32522, + 32523, + 32524, + 32525, + 32526, + 32527, + 32528, + 32529, + 32530, + 32531, + 32532, + 32533, + 32534, + 32535, + 32536, + 32537, + 32539, + 32540, + 32541, + 32542, + 32543, + 32544, + 32545, + 32546, + 32547, + 32548, + 32549, + 32550, + 32551, + 32552, + 32553, + 32554, + 32555, + 32556, + 32557, + 32558, + 32559, + 32560, + 32561, + 32562, + 32563, + 32564, + 32565, + 32566, + 32567, + 32568, + 32569, + 32570, + 32571, + 32572, + 32573, + 32575, + 32576, + 32577, + 32578, + 32579, + 32580, + 32581, + 32582, + 32583, + 32584, + 32586, + 32587, + 32588, + 32589, + 32590, + 32591, + 32592, + 32593, + 32594, + 32595, + 32596, + 32598, + 32599, + 32600, + 32601, + 32602, + 32604, + 32605, + 32606, + 32607, + 32608, + 32609, + 32610, + 32612, + 32613, + 32614, + 32615, + 32616, + 32617, + 32618, + 32619, + 32620, + 32621, + 32623, + 32624, + 32625, + 32626, + 32627, + 32628, + 32629, + 32631, + 32632, + 32634, + 32635, + 32636, + 32637, + 32638, + 32639, + 32640, + 32641, + 32642, + 32643, + 32644, + 32645, + 32646, + 32647, + 32648, + 32649, + 32650, + 32652, + 32653, + 32654, + 32655, + 32656, + 32657, + 32658, + 32659, + 32660, + 32661, + 32662, + 32663, + 32664, + 32665, + 32666, + 32667, + 32669, + 32670, + 32671, + 32672, + 32673, + 32674, + 32675, + 32676, + 32677, + 32678, + 32679, + 32680, + 32681, + 32682, + 32683, + 32684, + 32685, + 32686, + 32687, + 32688, + 32689, + 32690, + 32691, + 32692, + 32693, + 32694, + 32695, + 32696, + 32697, + 32698, + 32699, + 32700, + 32701, + 32702, + 32703, + 32705, + 32706, + 32707, + 32708, + 32709, + 32710, + 32711, + 32712, + 32713, + 32714, + 32715, + 32716, + 32717, + 32718, + 32720, + 32721, + 32722, + 32723, + 32724, + 32725, + 32726, + 32727, + 32728, + 32729, + 32730, + 32732, + 32733, + 32735, + 32736, + 32737, + 32738, + 32739, + 32740, + 32741, + 32742, + 32743, + 32744, + 32745, + 32746, + 32747, + 32748, + 32749, + 32750, + 32751, + 32752, + 32753, + 32754, + 32755, + 32756, + 32757, + 32758, + 32759, + 32760, + 32761, + 32763, + 32764, + 32765, + 32766, + 32767, + 32768, + 32769, + 32770, + 32771, + 32772, + 32773, + 32775, + 32776, + 32777, + 32778, + 32779, + 32780, + 32781, + 32782, + 32783, + 32784, + 32785, + 32786, + 32787, + 32788, + 32789, + 32790, + 32791, + 32793, + 32794, + 32795, + 32796, + 32797, + 32798, + 32799, + 32801, + 32802, + 32803, + 32804, + 32805, + 32807, + 32808, + 32809, + 32810, + 32811, + 32812, + 32813, + 32814, + 32815, + 32816, + 32817, + 32818, + 32819, + 32821, + 32824, + 32825, + 32826, + 32827, + 32828, + 32829, + 32830, + 32831, + 32832, + 32833, + 32834, + 32835, + 32836, + 32838, + 32839, + 32840, + 32842, + 32843, + 32844, + 32845, + 32846, + 32847, + 32848, + 32849, + 32850, + 32851, + 32852, + 32853, + 32854, + 32855, + 32856, + 32857, + 32858, + 32859, + 32860, + 32861, + 32862, + 32863, + 32864, + 32865, + 32866, + 32867, + 32868, + 32869, + 32870, + 32871, + 32872, + 32873, + 32874, + 32875, + 32876, + 32877, + 32878, + 32879, + 32881, + 32882, + 32883, + 32884, + 32885, + 32886, + 32887, + 32888, + 32889, + 32890, + 32891, + 32892, + 32893, + 32894, + 32895, + 32897, + 32898, + 32899, + 32900, + 32901, + 32903, + 32904, + 32905, + 32906, + 32907, + 32908, + 32909, + 32910, + 32911, + 32912, + 32913, + 32914, + 32915, + 32916, + 32917, + 32918, + 32919, + 32920, + 32921, + 32922, + 32923, + 32925, + 32926, + 32927, + 32928, + 32929, + 32930, + 32931, + 32932, + 32933, + 32934, + 32935, + 32936, + 32937, + 32938, + 32939, + 32940, + 32941, + 32942, + 32943, + 32944, + 32945, + 32946, + 32948, + 32949, + 32950, + 32951, + 32952, + 32953, + 32954, + 32955, + 32956, + 32957, + 32958, + 32960, + 32961, + 32962, + 32963, + 32964, + 32965, + 32966, + 32967, + 32968, + 32969, + 32970, + 32971, + 32972, + 32973, + 32974, + 32975, + 32976, + 32977, + 32978, + 32980, + 32981, + 32982, + 32983, + 32984, + 32985, + 32986, + 32989, + 32990, + 32991, + 32993, + 32994, + 32995, + 32996, + 32997, + 32998, + 32999, + 33000, + 33001, + 33002, + 33003, + 33004, + 33005, + 33006, + 33007, + 33008, + 33009, + 33010, + 33011, + 33012, + 33014, + 33015, + 33016, + 33017, + 33018, + 33019, + 33020, + 33021, + 33022, + 33023, + 33024, + 33025, + 33027, + 33028, + 33029, + 33030, + 33031, + 33032, + 33033, + 33034, + 33036, + 33037, + 33038, + 33039, + 33040, + 33041, + 33042, + 33043, + 33044, + 33045, + 33046, + 33047, + 33048, + 33049, + 33050, + 33051, + 33052, + 33053, + 33054, + 33056, + 33057, + 33058, + 33059, + 33060, + 33061, + 33062, + 33063, + 33064, + 33065, + 33067, + 33068, + 33069, + 33070, + 33071, + 33072, + 33073, + 33074, + 33075, + 33076, + 33077, + 33078, + 33079, + 33080, + 33081, + 33082, + 33083, + 33084, + 33085, + 33086, + 33088, + 33089, + 33090, + 33091, + 33092, + 33093, + 33094, + 33095, + 33096, + 33097, + 33098, + 33099, + 33100, + 33101, + 33102, + 33103, + 33104, + 33105, + 33106, + 33107, + 33108, + 33109, + 33110, + 33112, + 33113, + 33114, + 33115, + 33116, + 33117, + 33118, + 33119, + 33120, + 33121, + 33122, + 33123, + 33124, + 33125, + 33126, + 33127, + 33128, + 33129, + 33131, + 33133, + 33134, + 33136, + 33138, + 33139, + 33140, + 33142, + 33143, + 33144, + 33145, + 33146, + 33147, + 33148, + 33149, + 33150, + 33151, + 33152, + 33153, + 33154, + 33155, + 33156, + 33157, + 33158, + 33159, + 33160, + 33161, + 33162, + 33163, + 33164, + 33165, + 33166, + 33167, + 33168, + 33170, + 33171, + 33173, + 33174, + 33175, + 33176, + 33177, + 33178, + 33179, + 33180, + 33181, + 33182, + 33183, + 33184, + 33185, + 33186, + 33187, + 33188, + 33189, + 33190, + 33191, + 33192, + 33193, + 33195, + 33196, + 33197, + 33198, + 33199, + 33200, + 33201, + 33202, + 33204, + 33205, + 33206, + 33207, + 33209, + 33210, + 33211, + 33212, + 33213, + 33214, + 33215, + 33216, + 33217, + 33218, + 33219, + 33221, + 33223, + 33224, + 33225, + 33226, + 33227, + 33228, + 33229, + 33230, + 33231, + 33232, + 33234, + 33235, + 33236, + 33237, + 33238, + 33239, + 33240, + 33241, + 33242, + 33243, + 33245, + 33246, + 33247, + 33248, + 33249, + 33250, + 33251, + 33252, + 33253, + 33254, + 33255, + 33256, + 33257, + 33258, + 33259, + 33260, + 33261, + 33262, + 33264, + 33265, + 33266, + 33267, + 33268, + 33269, + 33270, + 33271, + 33272, + 33273, + 33274, + 33275, + 33276, + 33277, + 33278, + 33279, + 33281, + 33282, + 33283, + 33284, + 33285, + 33286, + 33287, + 33288, + 33289, + 33290, + 33291, + 33292, + 33293, + 33294, + 33295, + 33296, + 33297, + 33298, + 33299, + 33300, + 33301, + 33303, + 33304, + 33305, + 33306, + 33307, + 33309, + 33310, + 33311, + 33312, + 33313, + 33314, + 33315, + 33316, + 33317, + 33318, + 33319, + 33321, + 33322, + 33323, + 33324, + 33325, + 33326, + 33327, + 33328, + 33329, + 33330, + 33331, + 33332, + 33333, + 33334, + 33336, + 33337, + 33338, + 33339, + 33340, + 33341, + 33342, + 33343, + 33344, + 33346, + 33347, + 33348, + 33350, + 33351, + 33352, + 33353, + 33354, + 33355, + 33356, + 33357, + 33358, + 33359, + 33360, + 33361, + 33362, + 33363, + 33364, + 33365, + 33366, + 33367, + 33369, + 33370, + 33371, + 33372, + 33373, + 33374, + 33375, + 33376, + 33377, + 33378, + 33379, + 33380, + 33381, + 33382, + 33384, + 33385, + 33387, + 33388, + 33389, + 33390, + 33391, + 33392, + 33394, + 33395, + 33396, + 33397, + 33398, + 33399, + 33400, + 33401, + 33402, + 33403, + 33404, + 33405, + 33406, + 33407, + 33408, + 33409, + 33410, + 33411, + 33412, + 33413, + 33414, + 33415, + 33416, + 33417, + 33418, + 33419, + 33420, + 33421, + 33422, + 33423, + 33424, + 33425, + 33426, + 33427, + 33428, + 33429, + 33430, + 33431, + 33432, + 33433, + 33434, + 33435, + 33437, + 33438, + 33439, + 33440, + 33441, + 33442, + 33443, + 33445, + 33446, + 33447, + 33448, + 33449, + 33450, + 33451, + 33452, + 33453, + 33454, + 33455, + 33456, + 33457, + 33459, + 33460, + 33461, + 33462, + 33463, + 33464, + 33465, + 33466, + 33467, + 33468, + 33471, + 33472, + 33475, + 33476, + 33477, + 33478, + 33479, + 33480, + 33481, + 33482, + 33483, + 33485, + 33486, + 33487, + 33488, + 33489, + 33490, + 33491, + 33492, + 33493, + 33494, + 33495, + 33496, + 33497, + 33498, + 33499, + 33500, + 33501, + 33502, + 33503, + 33504, + 33505, + 33506, + 33507, + 33508, + 33509, + 33510, + 33511, + 33512, + 33513, + 33514, + 33515, + 33516, + 33517, + 33518, + 33519, + 33520, + 33521, + 33522, + 33524, + 33525, + 33526, + 33527, + 33528, + 33529, + 33531, + 33532, + 33533, + 33534, + 33535, + 33536, + 33537, + 33538, + 33539, + 33540, + 33541, + 33542, + 33543, + 33544, + 33545, + 33546, + 33547, + 33548, + 33549, + 33550, + 33552, + 33553, + 33554, + 33555, + 33556, + 33557, + 33558, + 33559, + 33560, + 33561, + 33562, + 33563, + 33564, + 33565, + 33566, + 33567, + 33568, + 33569, + 33570, + 33571, + 33572, + 33573, + 33574, + 33575, + 33576, + 33577, + 33578, + 33579, + 33580, + 33581, + 33582, + 33583, + 33584, + 33585, + 33586, + 33587, + 33588, + 33589, + 33590, + 33591, + 33592, + 33593, + 33594, + 33595, + 33596, + 33597, + 33598, + 33599, + 33600, + 33601, + 33602, + 33603, + 33604, + 33605, + 33606, + 33607, + 33609, + 33610, + 33611, + 33612, + 33613, + 33614, + 33615, + 33616, + 33617, + 33618, + 33619, + 33620, + 33621, + 33622, + 33623, + 33624, + 33625, + 33626, + 33627, + 33628, + 33629, + 33630, + 33631, + 33632, + 33633, + 33634, + 33635, + 33636, + 33638, + 33639, + 33640, + 33641, + 33642, + 33644, + 33645, + 33646, + 33647, + 33648, + 33649, + 33650, + 33651, + 33653, + 33654, + 33656, + 33657, + 33658, + 33659, + 33660, + 33661, + 33662, + 33663, + 33664, + 33665, + 33666, + 33667, + 33669, + 33670, + 33672, + 33673, + 33675, + 33676, + 33677, + 33678, + 33679, + 33680, + 33681, + 33682, + 33683, + 33684, + 33686, + 33687, + 33688, + 33689, + 33690, + 33691, + 33692, + 33693, + 33694, + 33695, + 33696, + 33697, + 33698, + 33700, + 33701, + 33702, + 33703, + 33704, + 33705, + 33706, + 33707, + 33708, + 33709, + 33710, + 33712, + 33713, + 33714, + 33716, + 33717, + 33718, + 33719, + 33721, + 33722, + 33723, + 33724, + 33725, + 33726, + 33727, + 33728, + 33729, + 33730, + 33731, + 33732, + 33733, + 33734, + 33736, + 33737, + 33738, + 33739, + 33740, + 33741, + 33742, + 33743, + 33744, + 33745, + 33746, + 33747, + 33748, + 33749, + 33750, + 33751, + 33752, + 33754, + 33755, + 33756, + 33757, + 33758, + 33759, + 33760, + 33761, + 33762, + 33764, + 33765, + 33766, + 33767, + 33768, + 33769, + 33770, + 33771, + 33773, + 33774, + 33775, + 33776, + 33778, + 33779, + 33780, + 33781, + 33782, + 33783, + 33784, + 33785, + 33786, + 33787, + 33789, + 33791, + 33792, + 33793, + 33794, + 33795, + 33797, + 33798, + 33799, + 33801, + 33802, + 33803, + 33804, + 33805, + 33807, + 33808, + 33809, + 33810, + 33811, + 33812, + 33813, + 33814, + 33815, + 33817, + 33818, + 33819, + 33820, + 33821, + 33822, + 33823, + 33824, + 33825, + 33827, + 33828, + 33829, + 33830, + 33831, + 33832, + 33833, + 33834, + 33835, + 33836, + 33837, + 33838, + 33839, + 33841, + 33842, + 33843, + 33844, + 33845, + 33846, + 33847, + 33848, + 33849, + 33850, + 33851, + 33852, + 33853, + 33854, + 33855, + 33856, + 33857, + 33858, + 33859, + 33860, + 33861, + 33862, + 33864, + 33865, + 33866, + 33867, + 33868, + 33869, + 33870, + 33871, + 33872, + 33873, + 33874, + 33875, + 33877, + 33878, + 33880, + 33881, + 33882, + 33883, + 33884, + 33885, + 33886, + 33887, + 33888, + 33889, + 33890, + 33891, + 33892, + 33893, + 33894, + 33895, + 33896, + 33897, + 33898, + 33899, + 33900, + 33901, + 33902, + 33903, + 33906, + 33907, + 33908, + 33909, + 33910, + 33911, + 33912, + 33913, + 33914, + 33915, + 33916, + 33917, + 33918, + 33919, + 33920, + 33921, + 33922, + 33923, + 33924, + 33925, + 33926, + 33927, + 33928, + 33929, + 33930, + 33931, + 33932, + 33933, + 33934, + 33935, + 33936, + 33937, + 33938, + 33939, + 33940, + 33942, + 33943, + 33944, + 33945, + 33946, + 33947, + 33948, + 33949, + 33950, + 33951, + 33952, + 33953, + 33954, + 33955, + 33956, + 33957, + 33958, + 33959, + 33960, + 33961, + 33962, + 33963, + 33964, + 33965, + 33966, + 33968, + 33969, + 33970, + 33971, + 33972, + 33973, + 33974, + 33975, + 33977, + 33978, + 33979, + 33980, + 33981, + 33982, + 33983, + 33984, + 33985, + 33986, + 33987, + 33989, + 33990, + 33991, + 33992, + 33993, + 33994, + 33995, + 33996, + 33998, + 33999, + 34000, + 34001, + 34002, + 34003, + 34004, + 34005, + 34006, + 34007, + 34008, + 34009, + 34010, + 34011, + 34012, + 34013, + 34014, + 34015, + 34016, + 34017, + 34018, + 34019, + 34020, + 34021, + 34023, + 34024, + 34026, + 34027, + 34028, + 34029, + 34030, + 34031, + 34033, + 34034, + 34035, + 34037, + 34038, + 34039, + 34040, + 34041, + 34042, + 34043, + 34044, + 34045, + 34046, + 34047, + 34048, + 34049, + 34050, + 34052, + 34053, + 34054, + 34055, + 34056, + 34059, + 34060, + 34061, + 34062, + 34063, + 34064, + 34065, + 34066, + 34067, + 34068, + 34069, + 34070, + 34071, + 34072, + 34073, + 34074, + 34075, + 34076, + 34077, + 34079, + 34080, + 34081, + 34082, + 34083, + 34085, + 34087, + 34088, + 34090, + 34091, + 34092, + 34093, + 34094, + 34095, + 34096, + 34097, + 34098, + 34099, + 34100, + 34102, + 34103, + 34105, + 34106, + 34107, + 34108, + 34109, + 34111, + 34112, + 34113, + 34114, + 34115, + 34116, + 34117, + 34118, + 34119, + 34121, + 34122, + 34123, + 34124, + 34125, + 34126, + 34127, + 34128, + 34129, + 34130, + 34131, + 34132, + 34133, + 34134, + 34135, + 34136, + 34137, + 34138, + 34140, + 34141, + 34143, + 34144, + 34145, + 34146, + 34148, + 34149, + 34150, + 34151, + 34152, + 34153, + 34154, + 34155, + 34156, + 34157, + 34158, + 34159, + 34160, + 34161, + 34162, + 34163, + 34164, + 34165, + 34167, + 34168, + 34169, + 34170, + 34171, + 34172, + 34173, + 34174, + 34175, + 34176, + 34177, + 34178, + 34179, + 34180, + 34182, + 34183, + 34184, + 34185, + 34186, + 34187, + 34188, + 34189, + 34190, + 34191, + 34192, + 34193, + 34194, + 34195, + 34196, + 34197, + 34198, + 34199, + 34200, + 34201, + 34202, + 34203, + 34204, + 34205, + 34206, + 34207, + 34208, + 34209, + 34210, + 34211, + 34212, + 34213, + 34214, + 34215, + 34216, + 34217, + 34218, + 34219, + 34220, + 34221, + 34222, + 34223, + 34224, + 34226, + 34227, + 34228, + 34229, + 34230, + 34231, + 34232, + 34233, + 34234, + 34235, + 34236, + 34237, + 34238, + 34239, + 34240, + 34241, + 34242, + 34243, + 34244, + 34246, + 34247, + 34248, + 34249, + 34250, + 34251, + 34252, + 34253, + 34254, + 34255, + 34256, + 34257, + 34258, + 34259, + 34260, + 34262, + 34263, + 34264, + 34265, + 34266, + 34267, + 34268, + 34269, + 34270, + 34271, + 34272, + 34273, + 34274, + 34275, + 34276, + 34277, + 34278, + 34279, + 34280, + 34282, + 34283, + 34284, + 34285, + 34286, + 34287, + 34288, + 34289, + 34290, + 34291, + 34292, + 34293, + 34294, + 34295, + 34296, + 34297, + 34298, + 34299, + 34300, + 34301, + 34302, + 34303, + 34304, + 34305, + 34306, + 34307, + 34308, + 34309, + 34310, + 34311, + 34312, + 34313, + 34315, + 34316, + 34317, + 34318, + 34319, + 34320, + 34321, + 34322, + 34323, + 34324, + 34325, + 34326, + 34328, + 34329, + 34330, + 34331, + 34332, + 34333, + 34334, + 34335, + 34338, + 34339, + 34340, + 34341, + 34342, + 34343, + 34344, + 34345, + 34346, + 34347, + 34348, + 34349, + 34350, + 34351, + 34352, + 34354, + 34355, + 34356, + 34358, + 34359, + 34361, + 34362, + 34363, + 34364, + 34365, + 34366, + 34367, + 34368, + 34369, + 34370, + 34371, + 34372, + 34373, + 34374, + 34375, + 34376, + 34377, + 34378, + 34379, + 34380, + 34381, + 34382, + 34383, + 34384, + 34386, + 34387, + 34388, + 34389, + 34390, + 34391, + 34392, + 34393, + 34394, + 34395, + 34396, + 34397, + 34398, + 34399, + 34400, + 34401, + 34402, + 34403, + 34404, + 34405, + 34406, + 34407, + 34408, + 34409, + 34410, + 34411, + 34412, + 34413, + 34414, + 34415, + 34416, + 34417, + 34418, + 34420, + 34421, + 34422, + 34423, + 34424, + 34425, + 34426, + 34427, + 34428, + 34429, + 34430, + 34431, + 34432, + 34433, + 34434, + 34435, + 34436, + 34437, + 34438, + 34439, + 34440, + 34441, + 34442, + 34443, + 34444, + 34446, + 34447, + 34448, + 34449, + 34450, + 34451, + 34452, + 34453, + 34454, + 34455, + 34456, + 34457, + 34458, + 34459, + 34460, + 34461, + 34462, + 34463, + 34464, + 34465, + 34466, + 34468, + 34469, + 34470, + 34471, + 34472, + 34473, + 34474, + 34475, + 34476, + 34477, + 34478, + 34479, + 34480, + 34481, + 34482, + 34483, + 34484, + 34485, + 34486, + 34487, + 34488, + 34489, + 34490, + 34491, + 34492, + 34493, + 34494, + 34495, + 34496, + 34497, + 34498, + 34499, + 34500, + 34501, + 34502, + 34503, + 34504, + 34505, + 34506, + 34507, + 34508, + 34509, + 34510, + 34512, + 34513, + 34514, + 34516, + 34517, + 34518, + 34519, + 34520, + 34521, + 34522, + 34523, + 34524, + 34525, + 34526, + 34527, + 34528, + 34529, + 34530, + 34531, + 34532, + 34533, + 34534, + 34535, + 34536, + 34537, + 34538, + 34539, + 34540, + 34541, + 34542, + 34543, + 34544, + 34545, + 34546, + 34547, + 34548, + 34549, + 34550, + 34552, + 34553, + 34554, + 34555, + 34556, + 34557, + 34558, + 34560, + 34561, + 34562, + 34564, + 34565, + 34566, + 34567, + 34568, + 34569, + 34570, + 34571, + 34572, + 34573, + 34574, + 34575, + 34576, + 34577, + 34578, + 34579, + 34580, + 34582, + 34583, + 34584, + 34585, + 34586, + 34587, + 34589, + 34590, + 34591, + 34592, + 34593, + 34594, + 34595, + 34596, + 34597, + 34598, + 34599, + 34600, + 34601, + 34602, + 34603, + 34604, + 34605, + 34606, + 34607, + 34608, + 34609, + 34610, + 34611, + 34612, + 34613, + 34615, + 34616, + 34617, + 34618, + 34619, + 34620, + 34621, + 34623, + 34624, + 34627, + 34628, + 34629, + 34630, + 34631, + 34632, + 34633, + 34634, + 34635, + 34636, + 34637, + 34638, + 34639, + 34640, + 34641, + 34642, + 34643, + 34644, + 34645, + 34646, + 34647, + 34648, + 34649, + 34650, + 34651, + 34652, + 34653, + 34654, + 34655, + 34656, + 34657, + 34658, + 34659, + 34660, + 34661, + 34662, + 34663, + 34664, + 34665, + 34666, + 34667, + 34668, + 34669, + 34670, + 34671, + 34672, + 34675, + 34676, + 34677, + 34678, + 34679, + 34680, + 34682, + 34683, + 34684, + 34685, + 34686, + 34687, + 34688, + 34689, + 34690, + 34691, + 34692, + 34693, + 34694, + 34695, + 34696, + 34697, + 34698, + 34699, + 34700, + 34701, + 34702, + 34703, + 34704, + 34706, + 34707, + 34708, + 34709, + 34710, + 34711, + 34712, + 34713, + 34714, + 34715, + 34717, + 34718, + 34719, + 34720, + 34721, + 34722, + 34723, + 34724, + 34726, + 34727, + 34728, + 34729, + 34730, + 34731, + 34732, + 34734, + 34735, + 34736, + 34737, + 34738, + 34739, + 34740, + 34742, + 34743, + 34745, + 34746, + 34747, + 34749, + 34750, + 34751, + 34752, + 34753, + 34754, + 34755, + 34756, + 34757, + 34758, + 34759, + 34760, + 34761, + 34762, + 34764, + 34765, + 34766, + 34767, + 34768, + 34769, + 34770, + 34771, + 34772, + 34773, + 34774, + 34775, + 34776, + 34777, + 34778, + 34779, + 34780, + 34781, + 34782, + 34784, + 34785, + 34786, + 34787, + 34788, + 34789, + 34790, + 34791, + 34792, + 34793, + 34795, + 34797, + 34798, + 34799, + 34800, + 34801, + 34802, + 34803, + 34804, + 34805, + 34806, + 34807, + 34808, + 34809, + 34810, + 34811, + 34812, + 34813, + 34816, + 34817, + 34818, + 34819, + 34820, + 34821, + 34822, + 34823, + 34824, + 34826, + 34827, + 34828, + 34829, + 34830, + 34831, + 34833, + 34834, + 34835, + 34836, + 34837, + 34838, + 34839, + 34840, + 34841, + 34842, + 34843, + 34845, + 34846, + 34847, + 34848, + 34849, + 34850, + 34851, + 34852, + 34853, + 34854, + 34855, + 34856, + 34857, + 34858, + 34859, + 34860, + 34861, + 34862, + 34863, + 34864, + 34865, + 34866, + 34867, + 34868, + 34869, + 34870, + 34871, + 34872, + 34873, + 34874, + 34875, + 34876, + 34877, + 34878, + 34879, + 34880, + 34881, + 34882, + 34883, + 34884, + 34885, + 34886, + 34890, + 34891, + 34892, + 34893, + 34894, + 34895, + 34896, + 34897, + 34898, + 34899, + 34900, + 34901, + 34902, + 34903, + 34904, + 34905, + 34906, + 34907, + 34908, + 34909, + 34910, + 34911, + 34912, + 34913, + 34914, + 34915, + 34916, + 34917, + 34918, + 34919, + 34921, + 34922, + 34923, + 34924, + 34925, + 34926, + 34927, + 34929, + 34930, + 34931, + 34932, + 34933, + 34934, + 34935, + 34936, + 34937, + 34938, + 34939, + 34940, + 34941, + 34942, + 34943, + 34944, + 34945, + 34946, + 34947, + 34948, + 34949, + 34950, + 34951, + 34952, + 34953, + 34954, + 34955, + 34958, + 34959, + 34960, + 34961, + 34962, + 34963, + 34964, + 34965, + 34966, + 34967, + 34968, + 34969, + 34970, + 34971, + 34972, + 34973, + 34974, + 34975, + 34976, + 34977, + 34978, + 34979, + 34981, + 34982, + 34983, + 34984, + 34985, + 34986, + 34987, + 34988, + 34989, + 34990, + 34991, + 34992, + 34993, + 34994, + 34995, + 34996, + 34997, + 34998, + 34999, + 35000, + 35001, + 35002, + 35003, + 35004, + 35005, + 35006, + 35007, + 35009, + 35010, + 35011, + 35012, + 35013, + 35014, + 35015, + 35017, + 35018, + 35019, + 35020, + 35021, + 35022, + 35023, + 35024, + 35025, + 35026, + 35027, + 35028, + 35029, + 35030, + 35031, + 35032, + 35033, + 35034, + 35035, + 35036, + 35037, + 35038, + 35039, + 35040, + 35041, + 35042, + 35043, + 35044, + 35045, + 35046, + 35047, + 35048, + 35049, + 35050, + 35051, + 35052, + 35053, + 35055, + 35056, + 35057, + 35058, + 35059, + 35060, + 35062, + 35064, + 35065, + 35066, + 35067, + 35068, + 35069, + 35070, + 35071, + 35073, + 35074, + 35076, + 35078, + 35079, + 35080, + 35081, + 35082, + 35083, + 35084, + 35085, + 35086, + 35087, + 35088, + 35089, + 35090, + 35092, + 35093, + 35094, + 35095, + 35096, + 35097, + 35098, + 35099, + 35100, + 35101, + 35102, + 35104, + 35105, + 35106, + 35107, + 35108, + 35109, + 35110, + 35111, + 35112, + 35113, + 35115, + 35116, + 35117, + 35118, + 35119, + 35120, + 35121, + 35122, + 35124, + 35125, + 35126, + 35127, + 35128, + 35129, + 35130, + 35131, + 35132, + 35133, + 35134, + 35135, + 35136, + 35137, + 35138, + 35139, + 35140, + 35141, + 35142, + 35143, + 35144, + 35145, + 35146, + 35147, + 35148, + 35149, + 35150, + 35151, + 35152, + 35153, + 35154, + 35155, + 35156, + 35157, + 35158, + 35159, + 35160, + 35161, + 35162, + 35163, + 35164, + 35165, + 35166, + 35167, + 35168, + 35169, + 35170, + 35171, + 35172, + 35173, + 35174, + 35175, + 35176, + 35177, + 35178, + 35179, + 35180, + 35181, + 35182, + 35183, + 35184, + 35185, + 35186, + 35187, + 35188, + 35189, + 35190, + 35191, + 35192, + 35193, + 35194, + 35195, + 35196, + 35198, + 35199, + 35200, + 35201, + 35204, + 35205, + 35206, + 35207, + 35208, + 35209, + 35210, + 35211, + 35212, + 35213, + 35214, + 35215, + 35216, + 35217, + 35218, + 35219, + 35220, + 35221, + 35222, + 35223, + 35224, + 35225, + 35226, + 35227, + 35228, + 35229, + 35230, + 35231, + 35232, + 35233, + 35234, + 35235, + 35237, + 35238, + 35239, + 35240, + 35241, + 35242, + 35243, + 35244, + 35245, + 35246, + 35247, + 35248, + 35249, + 35250, + 35251, + 35253, + 35254, + 35255, + 35256, + 35257, + 35258, + 35259, + 35261, + 35263, + 35264, + 35265, + 35266, + 35267, + 35268, + 35269, + 35270, + 35271, + 35272, + 35273, + 35274, + 35275, + 35276, + 35277, + 35278, + 35279, + 35280, + 35282, + 35283, + 35284, + 35285, + 35286, + 35287, + 35288, + 35289, + 35290, + 35291, + 35292, + 35293, + 35294, + 35295, + 35296, + 35297, + 35298, + 35299, + 35301, + 35302, + 35303, + 35304, + 35305, + 35306, + 35307, + 35308, + 35309, + 35310, + 35311, + 35313, + 35314, + 35315, + 35316, + 35317, + 35318, + 35319, + 35320, + 35321, + 35322, + 35323, + 35324, + 35325, + 35326, + 35327, + 35328, + 35330, + 35331, + 35332, + 35333, + 35334, + 35336, + 35337, + 35338, + 35339, + 35340, + 35341, + 35342, + 35343, + 35344, + 35346, + 35347, + 35348, + 35349, + 35350, + 35351, + 35352, + 35353, + 35354, + 35355, + 35356, + 35357, + 35358, + 35359, + 35360, + 35361, + 35362, + 35363, + 35364, + 35365, + 35366, + 35367, + 35369, + 35370, + 35371, + 35372, + 35374, + 35375, + 35376, + 35377, + 35378, + 35379, + 35380, + 35381, + 35382, + 35383, + 35384, + 35385, + 35386, + 35387, + 35388, + 35389, + 35390, + 35391, + 35392, + 35393, + 35394, + 35395, + 35396, + 35397, + 35398, + 35399, + 35400, + 35401, + 35402, + 35403, + 35404, + 35405, + 35406, + 35408, + 35409, + 35410, + 35411, + 35412, + 35413, + 35415, + 35416, + 35417, + 35420, + 35421, + 35422, + 35424, + 35425, + 35426, + 35427, + 35428, + 35429, + 35430, + 35432, + 35433, + 35434, + 35435, + 35436, + 35438, + 35439, + 35440, + 35441, + 35442, + 35443, + 35444, + 35445, + 35446, + 35447, + 35448, + 35449, + 35450, + 35451, + 35453, + 35454, + 35455, + 35456, + 35457, + 35458, + 35459, + 35460, + 35461, + 35462, + 35463, + 35464, + 35465, + 35466, + 35467, + 35468, + 35469, + 35470, + 35471, + 35472, + 35473, + 35474, + 35475, + 35476, + 35477, + 35478, + 35479, + 35481, + 35482, + 35483, + 35484, + 35486, + 35487, + 35488, + 35489, + 35491, + 35492, + 35493, + 35494, + 35495, + 35496, + 35497, + 35498, + 35499, + 35500, + 35501, + 35502, + 35504, + 35505, + 35506, + 35507, + 35509, + 35510, + 35511, + 35512, + 35514, + 35515, + 35516, + 35517, + 35518, + 35519, + 35520, + 35521, + 35522, + 35523, + 35524, + 35525, + 35526, + 35527, + 35528, + 35529, + 35530, + 35532, + 35533, + 35534, + 35535, + 35537, + 35538, + 35539, + 35540, + 35541, + 35542, + 35543, + 35544, + 35545, + 35546, + 35547, + 35549, + 35550, + 35552, + 35553, + 35554, + 35555, + 35556, + 35557, + 35558, + 35559, + 35560, + 35561, + 35562, + 35564, + 35565, + 35566, + 35567, + 35568, + 35570, + 35571, + 35572, + 35573, + 35574, + 35576, + 35578, + 35579, + 35580, + 35581, + 35582, + 35583, + 35584, + 35585, + 35586, + 35587, + 35588, + 35589, + 35590, + 35591, + 35592, + 35593, + 35595, + 35596, + 35597, + 35598, + 35599, + 35600, + 35601, + 35602, + 35603, + 35604, + 35605, + 35606, + 35607, + 35608, + 35609, + 35610, + 35611, + 35612, + 35613, + 35614, + 35615, + 35616, + 35617, + 35618, + 35619, + 35620, + 35621, + 35622, + 35624, + 35625, + 35626, + 35627, + 35628, + 35629, + 35630, + 35631, + 35632, + 35633, + 35634, + 35635, + 35636, + 35637, + 35638, + 35640, + 35642, + 35643, + 35644, + 35645, + 35646, + 35647, + 35649, + 35650, + 35651, + 35652, + 35653, + 35654, + 35655, + 35656, + 35657, + 35658, + 35659, + 35660, + 35661, + 35662, + 35663, + 35664, + 35665, + 35666, + 35667, + 35668, + 35669, + 35670, + 35672, + 35673, + 35674, + 35675, + 35676, + 35678, + 35679, + 35680, + 35681, + 35682, + 35683, + 35684, + 35685, + 35686, + 35687, + 35688, + 35689, + 35690, + 35691, + 35692, + 35693, + 35694, + 35695, + 35696, + 35697, + 35698, + 35699, + 35700, + 35701, + 35702, + 35703, + 35704, + 35705, + 35707, + 35708, + 35709, + 35710, + 35711, + 35712, + 35713, + 35714, + 35715, + 35716, + 35717, + 35718, + 35720, + 35721, + 35722, + 35723, + 35724, + 35725, + 35726, + 35727, + 35729, + 35730, + 35731, + 35732, + 35733, + 35734, + 35735, + 35736, + 35737, + 35738, + 35739, + 35740, + 35741, + 35742, + 35743, + 35745, + 35746, + 35747, + 35748, + 35749, + 35750, + 35752, + 35753, + 35754, + 35755, + 35756, + 35757, + 35758, + 35759, + 35760, + 35761, + 35762, + 35763, + 35764, + 35765, + 35766, + 35768, + 35769, + 35770, + 35771, + 35774, + 35775, + 35776, + 35777, + 35778, + 35779, + 35780, + 35781, + 35782, + 35783, + 35784, + 35785, + 35786, + 35788, + 35789, + 35790, + 35791, + 35792, + 35793, + 35794, + 35795, + 35796, + 35797, + 35798, + 35799, + 35801, + 35802, + 35803, + 35804, + 35805, + 35806, + 35807, + 35808, + 35809, + 35810, + 35811, + 35812, + 35813, + 35814, + 35815, + 35816, + 35817, + 35818, + 35819, + 35820, + 35821, + 35822, + 35823, + 35825, + 35826, + 35827, + 35828, + 35830, + 35831, + 35832, + 35833, + 35834, + 35835, + 35836, + 35837, + 35838, + 35839, + 35840, + 35841, + 35842, + 35843, + 35844, + 35845, + 35846, + 35847, + 35848, + 35849, + 35850, + 35851, + 35852, + 35853, + 35854, + 35855, + 35856, + 35857, + 35859, + 35860, + 35861, + 35862, + 35863, + 35864, + 35865, + 35866, + 35867, + 35868, + 35870, + 35871, + 35872, + 35873, + 35874, + 35875, + 35876, + 35877, + 35878, + 35879, + 35881, + 35882, + 35884, + 35885, + 35886, + 35887, + 35888, + 35889, + 35890, + 35891, + 35892, + 35893, + 35894, + 35895, + 35896, + 35897, + 35898, + 35900, + 35901, + 35902, + 35903, + 35904, + 35905, + 35906, + 35907, + 35908, + 35909, + 35910, + 35911, + 35912, + 35913, + 35914, + 35915, + 35916, + 35917, + 35919, + 35921, + 35922, + 35923, + 35924, + 35925, + 35926, + 35927, + 35928, + 35930, + 35931, + 35932, + 35933, + 35935, + 35936, + 35937, + 35938, + 35939, + 35940, + 35941, + 35942, + 35943, + 35945, + 35946, + 35947, + 35948, + 35949, + 35950, + 35951, + 35952, + 35954, + 35955, + 35956, + 35957, + 35958, + 35959, + 35960, + 35961, + 35962, + 35963, + 35964, + 35965, + 35966, + 35967, + 35968, + 35969, + 35970, + 35971, + 35972, + 35973, + 35975, + 35976, + 35977, + 35978, + 35979, + 35980, + 35981, + 35982, + 35983, + 35984, + 35985, + 35986, + 35987, + 35988, + 35989, + 35990, + 35991, + 35992, + 35993, + 35994, + 35996, + 35997, + 35998, + 35999, + 36000, + 36001, + 36003, + 36004, + 36005, + 36006, + 36008, + 36009, + 36010, + 36011, + 36012, + 36013, + 36014, + 36015, + 36016, + 36017, + 36018, + 36019, + 36020, + 36021, + 36022, + 36023, + 36025, + 36026, + 36027, + 36028, + 36029, + 36030, + 36031, + 36032, + 36033, + 36034, + 36035, + 36036, + 36037, + 36038, + 36039, + 36040, + 36041, + 36042, + 36043, + 36045, + 36046, + 36047, + 36048, + 36049, + 36050, + 36051, + 36052, + 36053, + 36054, + 36055, + 36056, + 36057, + 36058, + 36059, + 36060, + 36061, + 36062, + 36063, + 36064, + 36065, + 36066, + 36067, + 36068, + 36069, + 36070, + 36071, + 36072, + 36073, + 36074, + 36075, + 36076, + 36077, + 36078, + 36079, + 36080, + 36081, + 36082, + 36083, + 36084, + 36085, + 36087, + 36088, + 36089, + 36090, + 36091, + 36092, + 36093, + 36094, + 36095, + 36096, + 36097, + 36098, + 36099, + 36100, + 36101, + 36102, + 36103, + 36104, + 36105, + 36106, + 36107, + 36108, + 36109, + 36110, + 36111, + 36112, + 36113, + 36114, + 36115, + 36116, + 36117, + 36118, + 36119, + 36120, + 36121, + 36122, + 36123, + 36124, + 36125, + 36126, + 36127, + 36128, + 36130, + 36131, + 36132, + 36133, + 36134, + 36135, + 36136, + 36137, + 36138, + 36139, + 36140, + 36141, + 36142, + 36143, + 36144, + 36145, + 36146, + 36147, + 36148, + 36149, + 36152, + 36153, + 36154, + 36155, + 36156, + 36157, + 36158, + 36159, + 36160, + 36161, + 36162, + 36163, + 36164, + 36165, + 36166, + 36167, + 36168, + 36170, + 36171, + 36172, + 36173, + 36174, + 36176, + 36177, + 36178, + 36179, + 36180, + 36181, + 36182, + 36183, + 36184, + 36185, + 36186, + 36187, + 36188, + 36189, + 36190, + 36191, + 36192, + 36193, + 36194, + 36195, + 36196, + 36198, + 36199, + 36200, + 36201, + 36202, + 36203, + 36204, + 36206, + 36207, + 36208, + 36209, + 36210, + 36211, + 36212, + 36213, + 36214, + 36215, + 36216, + 36217, + 36218, + 36219, + 36220, + 36221, + 36222, + 36223, + 36224, + 36226, + 36227, + 36228, + 36229, + 36230, + 36231, + 36232, + 36233, + 36234, + 36235, + 36238, + 36239, + 36240, + 36241, + 36242, + 36243, + 36244, + 36245, + 36246, + 36247, + 36248, + 36249, + 36250, + 36252, + 36253, + 36254, + 36256, + 36257, + 36259, + 36260, + 36261, + 36262, + 36263, + 36264, + 36265, + 36266, + 36267, + 36268, + 36269, + 36270, + 36271, + 36272, + 36273, + 36274, + 36275, + 36276, + 36278, + 36279, + 36280, + 36281, + 36282, + 36283, + 36284, + 36285, + 36286, + 36287, + 36288, + 36289, + 36290, + 36291, + 36292, + 36293, + 36294, + 36295, + 36296, + 36297, + 36298, + 36299, + 36300, + 36301, + 36302, + 36303, + 36304, + 36305, + 36306, + 36307, + 36309, + 36310, + 36311, + 36312, + 36313, + 36315, + 36316, + 36317, + 36318, + 36319, + 36320, + 36323, + 36326, + 36327, + 36328, + 36329, + 36330, + 36331, + 36333, + 36334, + 36335, + 36336, + 36337, + 36338, + 36339, + 36340, + 36341, + 36342, + 36343, + 36344, + 36345, + 36346, + 36347, + 36348, + 36349, + 36350, + 36351, + 36352, + 36353, + 36354, + 36355, + 36356, + 36357, + 36358, + 36359, + 36360, + 36361, + 36362, + 36363, + 36364, + 36365, + 36366, + 36368, + 36369, + 36370, + 36371, + 36372, + 36373, + 36374, + 36375, + 36376, + 36378, + 36379, + 36380, + 36381, + 36382, + 36383, + 36384, + 36385, + 36386, + 36387, + 36388, + 36389, + 36390, + 36391, + 36392, + 36393, + 36394, + 36397, + 36398, + 36399, + 36400, + 36401, + 36402, + 36403, + 36404, + 36405, + 36406, + 36407, + 36408, + 36409, + 36410, + 36411, + 36412, + 36413, + 36414, + 36415, + 36416, + 36417, + 36418, + 36419, + 36421, + 36422, + 36423, + 36424, + 36425, + 36426, + 36427, + 36428, + 36429, + 36430, + 36431, + 36432, + 36433, + 36434, + 36435, + 36436, + 36437, + 36438, + 36439, + 36440, + 36442, + 36443, + 36444, + 36445, + 36446, + 36448, + 36449, + 36450, + 36451, + 36452, + 36453, + 36454, + 36455, + 36456, + 36457, + 36458, + 36459, + 36460, + 36461, + 36462, + 36464, + 36465, + 36466, + 36467, + 36468, + 36469, + 36470, + 36472, + 36473, + 36474, + 36475, + 36476, + 36477, + 36478, + 36479, + 36481, + 36482, + 36483, + 36484, + 36485, + 36486, + 36487, + 36488, + 36489, + 36490, + 36491, + 36492, + 36493, + 36494, + 36495, + 36496, + 36497, + 36498, + 36499, + 36500, + 36501, + 36502, + 36503, + 36504, + 36505, + 36506, + 36507, + 36508, + 36509, + 36510, + 36511, + 36512, + 36513, + 36514, + 36515, + 36516, + 36517, + 36518, + 36519, + 36521, + 36522, + 36523, + 36525, + 36526, + 36527, + 36528, + 36529, + 36530, + 36531, + 36532, + 36533, + 36534, + 36535, + 36536, + 36537, + 36538, + 36539, + 36540, + 36541, + 36542, + 36543, + 36544, + 36545, + 36546, + 36547, + 36548, + 36549, + 36551, + 36552, + 36553, + 36554, + 36555, + 36556, + 36557, + 36558, + 36559, + 36560, + 36561, + 36562, + 36563, + 36564, + 36565, + 36566, + 36567, + 36568, + 36569, + 36570, + 36571, + 36573, + 36574, + 36575, + 36576, + 36577, + 36578, + 36579, + 36580, + 36581, + 36582, + 36583, + 36584, + 36585, + 36586, + 36587, + 36588, + 36589, + 36590, + 36591, + 36592, + 36593, + 36595, + 36596, + 36597, + 36598, + 36600, + 36601, + 36602, + 36603, + 36604, + 36605, + 36606, + 36607, + 36608, + 36610, + 36611, + 36612, + 36613, + 36614, + 36615, + 36616, + 36617, + 36618, + 36619, + 36620, + 36622, + 36623, + 36624, + 36626, + 36627, + 36628, + 36629, + 36630, + 36631, + 36632, + 36633, + 36634, + 36635, + 36636, + 36637, + 36638, + 36639, + 36640, + 36641, + 36643, + 36644, + 36645, + 36646, + 36647, + 36649, + 36650, + 36651, + 36652, + 36653, + 36654, + 36655, + 36656, + 36657, + 36658, + 36659, + 36660, + 36661, + 36662, + 36663, + 36664, + 36665, + 36666, + 36667, + 36668, + 36669, + 36670, + 36671, + 36672, + 36673, + 36674, + 36675, + 36676, + 36677, + 36678, + 36679, + 36680, + 36681, + 36682, + 36683, + 36684, + 36685, + 36686, + 36687, + 36688, + 36689, + 36690, + 36691, + 36692, + 36693, + 36694, + 36695, + 36696, + 36697, + 36698, + 36699, + 36700, + 36701, + 36702, + 36703, + 36704, + 36705, + 36706, + 36707, + 36708, + 36709, + 36711, + 36712, + 36713, + 36714, + 36715, + 36716, + 36717, + 36718, + 36719, + 36720, + 36721, + 36722, + 36723, + 36724, + 36725, + 36726, + 36727, + 36728, + 36729, + 36730, + 36731, + 36732, + 36733, + 36735, + 36736, + 36737, + 36738, + 36739, + 36742, + 36743, + 36744, + 36745, + 36746, + 36747, + 36748, + 36749, + 36750, + 36751, + 36752, + 36753, + 36754, + 36755, + 36756, + 36757, + 36758, + 36759, + 36760, + 36761, + 36762, + 36763, + 36764, + 36765, + 36766, + 36767, + 36768, + 36769, + 36770, + 36771, + 36772, + 36773, + 36774, + 36775, + 36777, + 36778, + 36780, + 36781, + 36782, + 36783, + 36784, + 36785, + 36786, + 36787, + 36788, + 36789, + 36790, + 36791, + 36792, + 36793, + 36796, + 36798, + 36799, + 36800, + 36801, + 36803, + 36804, + 36805, + 36806, + 36807, + 36808, + 36809, + 36811, + 36813, + 36814, + 36815, + 36816, + 36819, + 36820, + 36821, + 36822, + 36823, + 36824, + 36825, + 36827, + 36828, + 36829, + 36830, + 36831, + 36832, + 36833, + 36834, + 36835, + 36836, + 36837, + 36838, + 36839, + 36840, + 36841, + 36842, + 36843, + 36844, + 36845, + 36846, + 36847, + 36848, + 36849, + 36850, + 36851, + 36852, + 36853, + 36854, + 36855, + 36856, + 36857, + 36858, + 36859, + 36860, + 36861, + 36862, + 36863, + 36864, + 36865, + 36866, + 36867, + 36868, + 36869, + 36870, + 36871, + 36872, + 36873, + 36874, + 36875, + 36876, + 36877, + 36878, + 36879, + 36880, + 36881, + 36882, + 36883, + 36885, + 36886, + 36887, + 36888, + 36889, + 36890, + 36891, + 36892, + 36894, + 36895, + 36896, + 36897, + 36898, + 36899, + 36900, + 36901, + 36902, + 36903, + 36904, + 36905, + 36907, + 36908, + 36909, + 36910, + 36911, + 36912, + 36913, + 36914, + 36916, + 36917, + 36918, + 36919, + 36920, + 36921, + 36922, + 36923, + 36924, + 36925, + 36926, + 36927, + 36928, + 36929, + 36930, + 36931, + 36932, + 36933, + 36934, + 36935, + 36936, + 36937, + 36938, + 36939, + 36940, + 36941, + 36942, + 36943, + 36944, + 36945, + 36946, + 36947, + 36948, + 36949, + 36950, + 36951, + 36952, + 36953, + 36954, + 36955, + 36956, + 36957, + 36958, + 36959, + 36961, + 36962, + 36963, + 36964, + 36965, + 36966, + 36967, + 36969, + 36970, + 36972, + 36973, + 36974, + 36975, + 36976, + 36977, + 36979, + 36980, + 36981, + 36982, + 36983, + 36985, + 36986, + 36987, + 36988, + 36989, + 36990, + 36991, + 36992, + 36993, + 36994, + 36995, + 36996, + 36997, + 36998, + 36999, + 37000, + 37001, + 37002, + 37003, + 37004, + 37005, + 37006, + 37007, + 37009, + 37010, + 37011, + 37012, + 37013, + 37014, + 37015, + 37016, + 37017, + 37018, + 37019, + 37020, + 37021, + 37022, + 37024, + 37025, + 37026, + 37027, + 37028, + 37029, + 37030, + 37031, + 37032, + 37033, + 37034, + 37035, + 37036, + 37038, + 37039, + 37040, + 37041, + 37042, + 37043, + 37044, + 37046, + 37047, + 37048, + 37049, + 37050, + 37051, + 37052, + 37053, + 37054, + 37055, + 37056, + 37057, + 37058, + 37059, + 37060, + 37061, + 37062, + 37063, + 37064, + 37065, + 37066, + 37067, + 37068, + 37069, + 37070, + 37071, + 37072, + 37073, + 37074, + 37075, + 37076, + 37077, + 37078, + 37079, + 37080, + 37081, + 37082, + 37083, + 37084, + 37086, + 37087, + 37088, + 37089, + 37091, + 37092, + 37093, + 37094, + 37095, + 37096, + 37097, + 37098, + 37100, + 37101, + 37102, + 37103, + 37104, + 37105, + 37106, + 37107, + 37108, + 37109, + 37110, + 37111, + 37113, + 37114, + 37115, + 37116, + 37117, + 37119, + 37120, + 37121, + 37123, + 37124, + 37125, + 37126, + 37127, + 37128, + 37129, + 37130, + 37131, + 37133, + 37134, + 37135, + 37136, + 37137, + 37138, + 37139, + 37140, + 37141, + 37142, + 37143, + 37144, + 37145, + 37146, + 37147, + 37148, + 37150, + 37152, + 37153, + 37154, + 37155, + 37156, + 37157, + 37158, + 37159, + 37160, + 37161, + 37162, + 37163, + 37164, + 37165, + 37166, + 37167, + 37168, + 37169, + 37170, + 37172, + 37173, + 37174, + 37175, + 37176, + 37178, + 37179, + 37180, + 37181, + 37182, + 37183, + 37184, + 37185, + 37186, + 37187, + 37188, + 37189, + 37190, + 37191, + 37192, + 37193, + 37194, + 37195, + 37196, + 37198, + 37199, + 37201, + 37202, + 37203, + 37204, + 37205, + 37206, + 37207, + 37208, + 37210, + 37211, + 37212, + 37213, + 37214, + 37215, + 37217, + 37218, + 37219, + 37220, + 37221, + 37222, + 37223, + 37225, + 37226, + 37227, + 37228, + 37229, + 37230, + 37231, + 37232, + 37233, + 37234, + 37235, + 37236, + 37237, + 37238, + 37239, + 37240, + 37241, + 37242, + 37243, + 37244, + 37245, + 37246, + 37247, + 37248, + 37250, + 37251, + 37252, + 37253, + 37254, + 37255, + 37256, + 37257, + 37258, + 37259, + 37260, + 37261, + 37262, + 37263, + 37264, + 37265, + 37266, + 37267, + 37268, + 37269, + 37271, + 37272, + 37273, + 37274, + 37276, + 37277, + 37278, + 37279, + 37280, + 37281, + 37282, + 37283, + 37284, + 37285, + 37286, + 37287, + 37288, + 37289, + 37290, + 37291, + 37292, + 37293, + 37294, + 37295, + 37296, + 37297, + 37298, + 37299, + 37300, + 37301, + 37302, + 37303, + 37304, + 37305, + 37306, + 37307, + 37308, + 37309, + 37310, + 37311, + 37312, + 37313, + 37314, + 37315, + 37316, + 37317, + 37318, + 37319, + 37320, + 37321, + 37322, + 37323, + 37324, + 37325, + 37326, + 37328, + 37329, + 37330, + 37331, + 37332, + 37333, + 37335, + 37336, + 37338, + 37339, + 37340, + 37341, + 37342, + 37343, + 37344, + 37345, + 37346, + 37348, + 37349, + 37350, + 37351, + 37352, + 37353, + 37354, + 37355, + 37356, + 37357, + 37358, + 37359, + 37360, + 37361, + 37362, + 37363, + 37364, + 37365, + 37366, + 37367, + 37368, + 37369, + 37370, + 37371, + 37372, + 37373, + 37374, + 37375, + 37376, + 37377, + 37378, + 37379, + 37380, + 37381, + 37382, + 37383, + 37384, + 37385, + 37386, + 37388, + 37389, + 37390, + 37391, + 37392, + 37393, + 37395, + 37396, + 37397, + 37398, + 37399, + 37400, + 37401, + 37402, + 37403, + 37404, + 37405, + 37406, + 37407, + 37408, + 37409, + 37410, + 37411, + 37412, + 37413, + 37416, + 37417, + 37418, + 37419, + 37420, + 37421, + 37422, + 37425, + 37426, + 37427, + 37428, + 37429, + 37430, + 37431, + 37432, + 37433, + 37435, + 37436, + 37437, + 37438, + 37439, + 37440, + 37441, + 37442, + 37443, + 37444, + 37446, + 37447, + 37448, + 37449, + 37450, + 37451, + 37452, + 37453, + 37454, + 37455, + 37456, + 37457, + 37458, + 37459, + 37460, + 37461, + 37462, + 37463, + 37464, + 37465, + 37466, + 37467, + 37469, + 37470, + 37471, + 37473, + 37474, + 37475, + 37476, + 37477, + 37478, + 37479, + 37480, + 37482, + 37483, + 37484, + 37486, + 37487, + 37488, + 37489, + 37490, + 37491, + 37492, + 37493, + 37494, + 37495, + 37496, + 37497, + 37498, + 37499, + 37501, + 37503, + 37504, + 37505, + 37506, + 37507, + 37508, + 37509, + 37510, + 37511, + 37512, + 37513, + 37514, + 37515, + 37516, + 37517, + 37518, + 37519, + 37520, + 37521, + 37522, + 37523, + 37524, + 37525, + 37526, + 37527, + 37528, + 37529, + 37530, + 37531, + 37532, + 37533, + 37534, + 37535, + 37536, + 37537, + 37538, + 37539, + 37540, + 37541, + 37542, + 37544, + 37545, + 37546, + 37547, + 37549, + 37551, + 37552, + 37553, + 37554, + 37555, + 37556, + 37557, + 37558, + 37559, + 37560, + 37562, + 37563, + 37564, + 37565, + 37566, + 37567, + 37570, + 37571, + 37572, + 37573, + 37574, + 37576, + 37577, + 37578, + 37580, + 37581, + 37582, + 37583, + 37584, + 37585, + 37586, + 37587, + 37588, + 37589, + 37590, + 37591, + 37592, + 37593, + 37594, + 37595, + 37596, + 37597, + 37598, + 37600, + 37601, + 37602, + 37603, + 37604, + 37605, + 37606, + 37607, + 37608, + 37609, + 37610, + 37611, + 37612, + 37613, + 37614, + 37615, + 37616, + 37617, + 37618, + 37619, + 37620, + 37621, + 37623, + 37624, + 37625, + 37626, + 37627, + 37628, + 37629, + 37630, + 37631, + 37632, + 37633, + 37634, + 37635, + 37637, + 37638, + 37639, + 37640, + 37641, + 37642, + 37643, + 37644, + 37645, + 37646, + 37647, + 37648, + 37650, + 37651, + 37652, + 37653, + 37654, + 37655, + 37656, + 37658, + 37659, + 37660, + 37661, + 37662, + 37663, + 37664, + 37665, + 37666, + 37667, + 37668, + 37669, + 37670, + 37671, + 37673, + 37674, + 37675, + 37676, + 37677, + 37678, + 37679, + 37680, + 37681, + 37683, + 37684, + 37685, + 37686, + 37687, + 37688, + 37689, + 37690, + 37691, + 37692, + 37693, + 37694, + 37696, + 37697, + 37698, + 37699, + 37700, + 37701, + 37702, + 37703, + 37704, + 37705, + 37706, + 37707, + 37708, + 37709, + 37710, + 37711, + 37713, + 37714, + 37715, + 37716, + 37717, + 37718, + 37719, + 37720, + 37721, + 37722, + 37723, + 37724, + 37725, + 37726, + 37727, + 37728, + 37729, + 37730, + 37731, + 37732, + 37733, + 37734, + 37735, + 37736, + 37737, + 37738, + 37739, + 37740, + 37741, + 37742, + 37743, + 37745, + 37746, + 37747, + 37748, + 37750, + 37751, + 37752, + 37753, + 37754, + 37755, + 37756, + 37757, + 37758, + 37759, + 37760, + 37761, + 37763, + 37764, + 37765, + 37766, + 37767, + 37768, + 37769, + 37770, + 37771, + 37772, + 37773, + 37774, + 37775, + 37776, + 37777, + 37778, + 37779, + 37780, + 37781, + 37782, + 37783, + 37784, + 37785, + 37786, + 37787, + 37788, + 37789, + 37790, + 37791, + 37792, + 37793, + 37794, + 37795, + 37796, + 37797, + 37798, + 37799, + 37800, + 37801, + 37803, + 37804, + 37805, + 37806, + 37807, + 37808, + 37809, + 37810, + 37811, + 37812, + 37813, + 37814, + 37815, + 37817, + 37818, + 37819, + 37820, + 37821, + 37822, + 37824, + 37825, + 37826, + 37827, + 37828, + 37829, + 37830, + 37831, + 37832, + 37833, + 37834, + 37835, + 37836, + 37837, + 37838, + 37839, + 37840, + 37841, + 37842, + 37843, + 37844, + 37845, + 37846, + 37847, + 37848, + 37849, + 37850, + 37851, + 37852, + 37853, + 37854, + 37855, + 37857, + 37858, + 37859, + 37861, + 37862, + 37864, + 37865, + 37866, + 37867, + 37868, + 37869, + 37870, + 37871, + 37872, + 37873, + 37874, + 37875, + 37876, + 37877, + 37878, + 37880, + 37881, + 37882, + 37883, + 37884, + 37885, + 37887, + 37888, + 37889, + 37890, + 37891, + 37892, + 37895, + 37896, + 37897, + 37898, + 37899, + 37900, + 37901, + 37903, + 37904, + 37905, + 37906, + 37907, + 37908, + 37909, + 37910, + 37911, + 37912, + 37913, + 37914, + 37915, + 37916, + 37917, + 37918, + 37919, + 37920, + 37921, + 37923, + 37924, + 37925, + 37926, + 37927, + 37928, + 37929, + 37930, + 37931, + 37933, + 37934, + 37935, + 37936, + 37937, + 37938, + 37939, + 37940, + 37941, + 37942, + 37943, + 37944, + 37945, + 37946, + 37947, + 37948, + 37949, + 37950, + 37951, + 37952, + 37953, + 37954, + 37955, + 37956, + 37957, + 37958, + 37959, + 37960, + 37961, + 37963, + 37964, + 37965, + 37966, + 37967, + 37968, + 37969, + 37970, + 37971, + 37973, + 37974, + 37975, + 37976, + 37977, + 37978, + 37981, + 37983, + 37984, + 37985, + 37986, + 37987, + 37988, + 37989, + 37990, + 37991, + 37992, + 37993, + 37994, + 37995, + 37996, + 37997, + 37998, + 37999, + 38000, + 38001, + 38002, + 38003, + 38004, + 38005, + 38006, + 38007, + 38008, + 38009, + 38010, + 38011, + 38012, + 38013, + 38014, + 38015, + 38016, + 38017, + 38018, + 38019, + 38020, + 38021, + 38022, + 38024, + 38025, + 38026, + 38027, + 38028, + 38029, + 38030, + 38031, + 38032, + 38033, + 38034, + 38035, + 38036, + 38037, + 38038, + 38039, + 38040, + 38041, + 38042, + 38043, + 38044, + 38045, + 38046, + 38047, + 38048, + 38049, + 38050, + 38051, + 38052, + 38053, + 38055, + 38056, + 38057, + 38058, + 38059, + 38060, + 38061, + 38062, + 38063, + 38064, + 38065, + 38066, + 38067, + 38068, + 38069, + 38070, + 38071, + 38072, + 38073, + 38074, + 38075, + 38076, + 38077, + 38078, + 38079, + 38080, + 38081, + 38082, + 38083, + 38084, + 38085, + 38086, + 38087, + 38088, + 38089, + 38090, + 38091, + 38092, + 38093, + 38094, + 38095, + 38096, + 38097, + 38098, + 38099, + 38100, + 38101, + 38102, + 38103, + 38104, + 38105, + 38106, + 38107, + 38108, + 38109, + 38110, + 38111, + 38113, + 38114, + 38115, + 38116, + 38117, + 38118, + 38119, + 38120, + 38121, + 38122, + 38123, + 38125, + 38126, + 38127, + 38128, + 38129, + 38130, + 38131, + 38133, + 38134, + 38135, + 38136, + 38137, + 38138, + 38139, + 38140, + 38141, + 38142, + 38143, + 38144, + 38145, + 38146, + 38147, + 38148, + 38149, + 38150, + 38151, + 38152, + 38153, + 38154, + 38155, + 38156, + 38157, + 38158, + 38159, + 38160, + 38161, + 38162, + 38163, + 38164, + 38165, + 38166, + 38167, + 38168, + 38169, + 38170, + 38171, + 38172, + 38173, + 38174, + 38175, + 38176, + 38177, + 38178, + 38179, + 38180, + 38181, + 38182, + 38183, + 38184, + 38185, + 38186, + 38187, + 38188, + 38189, + 38190, + 38191, + 38192, + 38195, + 38196, + 38197, + 38198, + 38199, + 38200, + 38201, + 38202, + 38203, + 38204, + 38205, + 38206, + 38207, + 38208, + 38209, + 38210, + 38212, + 38213, + 38214, + 38215, + 38216, + 38218, + 38219, + 38220, + 38222, + 38223, + 38225, + 38226, + 38227, + 38229, + 38230, + 38231, + 38232, + 38233, + 38234, + 38235, + 38236, + 38237, + 38238, + 38239, + 38240, + 38241, + 38242, + 38243, + 38244, + 38245, + 38246, + 38247, + 38248, + 38249, + 38250, + 38251, + 38252, + 38253, + 38254, + 38255, + 38256, + 38257, + 38258, + 38259, + 38260, + 38261, + 38262, + 38263, + 38264, + 38265, + 38267, + 38268, + 38269, + 38270, + 38271, + 38272, + 38273, + 38274, + 38275, + 38276, + 38278, + 38279, + 38280, + 38281, + 38282, + 38283, + 38284, + 38285, + 38286, + 38287, + 38288, + 38289, + 38290, + 38291, + 38292, + 38293, + 38294, + 38296, + 38298, + 38299, + 38300, + 38301, + 38302, + 38303, + 38304, + 38305, + 38306, + 38307, + 38308, + 38309, + 38310, + 38311, + 38312, + 38313, + 38314, + 38315, + 38316, + 38317, + 38318, + 38319, + 38321, + 38322, + 38323, + 38324, + 38326, + 38327, + 38328, + 38329, + 38330, + 38331, + 38332, + 38333, + 38334, + 38335, + 38336, + 38337, + 38338, + 38339, + 38340, + 38341, + 38342, + 38343, + 38344, + 38345, + 38346, + 38347, + 38348, + 38350, + 38351, + 38353, + 38354, + 38355, + 38356, + 38357, + 38358, + 38359, + 38360, + 38361, + 38362, + 38363, + 38364, + 38365, + 38366, + 38367, + 38368, + 38369, + 38370, + 38371, + 38372, + 38373, + 38375, + 38376, + 38377, + 38378, + 38379, + 38380, + 38381, + 38382, + 38383, + 38384, + 38385, + 38386, + 38387, + 38388, + 38389, + 38390, + 38391, + 38392, + 38393, + 38394, + 38395, + 38396, + 38397, + 38398, + 38399, + 38400, + 38401, + 38402, + 38403, + 38404, + 38405, + 38406, + 38407, + 38408, + 38410, + 38411, + 38412, + 38413, + 38414, + 38416, + 38417, + 38418, + 38419, + 38420, + 38421, + 38422, + 38423, + 38424, + 38425, + 38426, + 38427, + 38429, + 38430, + 38431, + 38432, + 38433, + 38434, + 38435, + 38436, + 38437, + 38438, + 38439, + 38440, + 38441, + 38442, + 38443, + 38444, + 38445, + 38446, + 38447, + 38449, + 38450, + 38451, + 38452, + 38453, + 38454, + 38455, + 38456, + 38457, + 38458, + 38459, + 38460, + 38461, + 38462, + 38463, + 38464, + 38466, + 38467, + 38468, + 38469, + 38470, + 38471, + 38472, + 38473, + 38474, + 38475, + 38476, + 38477, + 38478, + 38479, + 38480, + 38481, + 38482, + 38483, + 38484, + 38485, + 38486, + 38487, + 38488, + 38489, + 38490, + 38491, + 38492, + 38493, + 38494, + 38495, + 38496, + 38497, + 38498, + 38499, + 38500, + 38501, + 38502, + 38503, + 38504, + 38506, + 38507, + 38508, + 38509, + 38510, + 38511, + 38512, + 38513, + 38514, + 38515, + 38516, + 38517, + 38518, + 38519, + 38520, + 38521, + 38522, + 38523, + 38524, + 38525, + 38526, + 38527, + 38528, + 38530, + 38531, + 38532, + 38533, + 38534, + 38535, + 38536, + 38537, + 38538, + 38539, + 38540, + 38541, + 38542, + 38543, + 38544, + 38545, + 38546, + 38547, + 38548, + 38549, + 38550, + 38551, + 38553, + 38554, + 38555, + 38556, + 38557, + 38558, + 38559, + 38560, + 38561, + 38562, + 38563, + 38564, + 38565, + 38566, + 38567, + 38568, + 38569, + 38570, + 38571, + 38572, + 38573, + 38574, + 38575, + 38576, + 38577, + 38578, + 38579, + 38580, + 38581, + 38582, + 38583, + 38584, + 38585, + 38586, + 38587, + 38588, + 38589, + 38590, + 38591, + 38592, + 38593, + 38594, + 38595, + 38596, + 38597, + 38598, + 38599, + 38601, + 38602, + 38603, + 38604, + 38605, + 38606, + 38607, + 38608, + 38609, + 38610, + 38611, + 38612, + 38613, + 38614, + 38615, + 38616, + 38618, + 38619, + 38620, + 38621, + 38622, + 38623, + 38624, + 38625, + 38626, + 38627, + 38628, + 38630, + 38631, + 38632, + 38633, + 38634, + 38635, + 38636, + 38637, + 38638, + 38639, + 38640, + 38641, + 38642, + 38643, + 38644, + 38645, + 38646, + 38647, + 38648, + 38649, + 38650, + 38651, + 38652, + 38653, + 38654, + 38655, + 38656, + 38657, + 38659, + 38660, + 38661, + 38662, + 38663, + 38664, + 38665, + 38666, + 38667, + 38668, + 38669, + 38670, + 38671, + 38672, + 38673, + 38674, + 38675, + 38676, + 38677, + 38678, + 38679, + 38680, + 38681, + 38682, + 38683, + 38684, + 38685, + 38686, + 38687, + 38688, + 38689, + 38690, + 38691, + 38692, + 38693, + 38694, + 38695, + 38696, + 38697, + 38698, + 38699, + 38700, + 38701, + 38702, + 38703, + 38704, + 38705, + 38706, + 38707, + 38708, + 38710, + 38711, + 38712, + 38713, + 38714, + 38715, + 38716, + 38718, + 38719, + 38720, + 38721, + 38722, + 38724, + 38725, + 38726, + 38727, + 38728, + 38729, + 38730, + 38731, + 38732, + 38733, + 38734, + 38735, + 38736, + 38737, + 38738, + 38739, + 38740, + 38741, + 38742, + 38743, + 38744, + 38745, + 38746, + 38747, + 38748, + 38749, + 38750, + 38752, + 38753, + 38754, + 38755, + 38756, + 38757, + 38758, + 38759, + 38760, + 38761, + 38762, + 38763, + 38764, + 38765, + 38767, + 38768, + 38769, + 38770, + 38771, + 38772, + 38773, + 38774, + 38775, + 38776, + 38777, + 38779, + 38780, + 38781, + 38782, + 38784, + 38785, + 38787, + 38788, + 38789, + 38790, + 38791, + 38793, + 38795, + 38796, + 38798, + 38799, + 38800, + 38801, + 38802, + 38803, + 38804, + 38805, + 38806, + 38807, + 38808, + 38809, + 38810, + 38811, + 38812, + 38813, + 38814, + 38815, + 38816, + 38817, + 38818, + 38819, + 38820, + 38821, + 38822, + 38823, + 38824, + 38825, + 38826, + 38827, + 38828, + 38829, + 38830, + 38831, + 38832, + 38833, + 38834, + 38835, + 38836, + 38838, + 38839, + 38840, + 38841, + 38842, + 38843, + 38844, + 38845, + 38846, + 38847, + 38848, + 38849, + 38850, + 38851, + 38852, + 38853, + 38854, + 38855, + 38856, + 38858, + 38860, + 38861, + 38862, + 38863, + 38864, + 38867, + 38868, + 38869, + 38870, + 38871, + 38872, + 38873, + 38874, + 38875, + 38876, + 38877, + 38879, + 38880, + 38881, + 38882, + 38883, + 38885, + 38886, + 38891, + 38893, + 38894, + 38895, + 38896, + 38897, + 38899, + 38900, + 38901, + 38902, + 38903, + 38904, + 38905, + 38907, + 38908, + 38909, + 38910, + 38911, + 38914, + 38915, + 38916, + 38917, + 38918, + 38919, + 38920, + 38921, + 38922, + 38923, + 38924, + 38925, + 38926, + 38927, + 38928, + 38929, + 38930, + 38931, + 38932, + 38933, + 38934, + 38935, + 38936, + 38937, + 38938, + 38939, + 38940, + 38941, + 38942, + 38944, + 38945, + 38946, + 38947, + 38948, + 38949, + 38950, + 38951, + 38952, + 38953, + 38954, + 38955, + 38956, + 38957, + 38958, + 38959, + 38960, + 38961, + 38962, + 38963, + 38964, + 38965, + 38966, + 38967, + 38968, + 38970, + 38971, + 38972, + 38974, + 38975, + 38976, + 38977, + 38979, + 38980, + 38981, + 38982, + 38983, + 38984, + 38985, + 38986, + 38987, + 38988, + 38989, + 38990, + 38991, + 38992, + 38993, + 38994, + 38995, + 38996, + 38997, + 38998, + 38999, + 39000, + 39001, + 39002, + 39003, + 39004, + 39005, + 39006, + 39007, + 39008, + 39009, + 39010, + 39011, + 39012, + 39013, + 39016, + 39018, + 39019, + 39020, + 39021, + 39022, + 39023, + 39024, + 39025, + 39026, + 39027, + 39028, + 39029, + 39030, + 39032, + 39033, + 39034, + 39035, + 39036, + 39037, + 39038, + 39039, + 39040, + 39041, + 39042, + 39044, + 39045, + 39046, + 39047, + 39048, + 39049, + 39050, + 39052, + 39053, + 39054, + 39055, + 39056, + 39057, + 39058, + 39059, + 39060, + 39061, + 39062, + 39063, + 39064, + 39065, + 39066, + 39067, + 39068, + 39069, + 39070, + 39071, + 39072, + 39073, + 39074, + 39075, + 39076, + 39077, + 39078, + 39079, + 39080, + 39081, + 39082, + 39083, + 39084, + 39085, + 39086, + 39087, + 39088, + 39089, + 39090, + 39091, + 39092, + 39095, + 39096, + 39097, + 39098, + 39099, + 39100, + 39101, + 39102, + 39103, + 39104, + 39105, + 39106, + 39107, + 39108, + 39109, + 39110, + 39111, + 39113, + 39114, + 39115, + 39116, + 39117, + 39118, + 39119, + 39120, + 39121, + 39122, + 39123, + 39124, + 39125, + 39127, + 39129, + 39130, + 39131, + 39132, + 39133, + 39134, + 39135, + 39136, + 39137, + 39138, + 39139, + 39140, + 39141, + 39142, + 39143, + 39144, + 39145, + 39146, + 39148, + 39149, + 39150, + 39151, + 39152, + 39153, + 39154, + 39155, + 39156, + 39157, + 39158, + 39159, + 39161, + 39162, + 39163, + 39164, + 39165, + 39166, + 39167, + 39168, + 39169, + 39170, + 39171, + 39172, + 39173, + 39174, + 39175, + 39176, + 39177, + 39178, + 39179, + 39180, + 39181, + 39182, + 39183, + 39184, + 39185, + 39186, + 39187, + 39188, + 39189, + 39190, + 39191, + 39192, + 39193, + 39194, + 39195, + 39196, + 39197, + 39198, + 39199, + 39200, + 39201, + 39202, + 39203, + 39204, + 39205, + 39206, + 39207, + 39208, + 39209, + 39210, + 39211, + 39212, + 39213, + 39214, + 39216, + 39217, + 39218, + 39219, + 39220, + 39221, + 39222, + 39223, + 39224, + 39226, + 39228, + 39229, + 39230, + 39231, + 39232, + 39233, + 39234, + 39236, + 39237, + 39238, + 39239, + 39240, + 39241, + 39242, + 39243, + 39244, + 39245, + 39247, + 39248, + 39249, + 39250, + 39251, + 39252, + 39253, + 39254, + 39255, + 39256, + 39257, + 39258, + 39260, + 39261, + 39262, + 39263, + 39264, + 39265, + 39266, + 39267, + 39268, + 39269, + 39270, + 39271, + 39272, + 39273, + 39274, + 39275, + 39276, + 39277, + 39278, + 39279, + 39280, + 39281, + 39282, + 39283, + 39284, + 39286, + 39287, + 39288, + 39289, + 39290, + 39291, + 39292, + 39293, + 39294, + 39295, + 39296, + 39297, + 39298, + 39299, + 39300, + 39302, + 39303, + 39304, + 39305, + 39306, + 39307, + 39308, + 39309, + 39310, + 39311, + 39312, + 39313, + 39314, + 39315, + 39316, + 39317, + 39318, + 39319, + 39320, + 39321, + 39322, + 39323, + 39324, + 39326, + 39327, + 39328, + 39329, + 39330, + 39331, + 39332, + 39333, + 39335, + 39336, + 39337, + 39339, + 39340, + 39341, + 39342, + 39343, + 39345, + 39346, + 39348, + 39349, + 39350, + 39351, + 39352, + 39353, + 39354, + 39355, + 39356, + 39357, + 39358, + 39359, + 39360, + 39361, + 39362, + 39363, + 39364, + 39365, + 39367, + 39368, + 39369, + 39370, + 39371, + 39372, + 39373, + 39374, + 39375, + 39376, + 39377, + 39378, + 39379, + 39380, + 39381, + 39382, + 39384, + 39386, + 39387, + 39388, + 39389, + 39390, + 39392, + 39393, + 39394, + 39395, + 39396, + 39397, + 39398, + 39399, + 39400, + 39401, + 39402, + 39403, + 39405, + 39406, + 39407, + 39408, + 39409, + 39410, + 39412, + 39413, + 39414, + 39415, + 39416, + 39417, + 39418, + 39419, + 39420, + 39421, + 39422, + 39423, + 39424, + 39425, + 39426, + 39427, + 39428, + 39429, + 39430, + 39431, + 39432, + 39433, + 39434, + 39435, + 39436, + 39437, + 39439, + 39441, + 39442, + 39444, + 39445, + 39446, + 39447, + 39448, + 39449, + 39450, + 39451, + 39452, + 39453, + 39454, + 39455, + 39456, + 39457, + 39458, + 39459, + 39460, + 39461, + 39462, + 39463, + 39464, + 39465, + 39466, + 39467, + 39468, + 39469, + 39470, + 39471, + 39472, + 39473, + 39474, + 39475, + 39477, + 39478, + 39480, + 39481, + 39482, + 39483, + 39484, + 39485, + 39486, + 39487, + 39488, + 39489, + 39490, + 39491, + 39492, + 39493, + 39494, + 39495, + 39496, + 39497, + 39498, + 39499, + 39500, + 39501, + 39502, + 39504, + 39505, + 39506, + 39507, + 39508, + 39509, + 39510, + 39511, + 39512, + 39513, + 39514, + 39515, + 39516, + 39517, + 39518, + 39519, + 39520, + 39521, + 39522, + 39523, + 39524, + 39525, + 39526, + 39527, + 39528, + 39529, + 39530, + 39531, + 39533, + 39534, + 39535, + 39536, + 39537, + 39538, + 39539, + 39540, + 39541, + 39542, + 39543, + 39544, + 39545, + 39546, + 39548, + 39549, + 39550, + 39551, + 39552, + 39553, + 39554, + 39555, + 39556, + 39557, + 39558, + 39559, + 39560, + 39561, + 39562, + 39563, + 39564, + 39565, + 39566, + 39567, + 39568, + 39570, + 39573, + 39574, + 39575, + 39576, + 39577, + 39578, + 39580, + 39581, + 39582, + 39583, + 39584, + 39585, + 39586, + 39587, + 39588, + 39589, + 39590, + 39591, + 39592, + 39593, + 39594, + 39595, + 39596, + 39597, + 39598, + 39599, + 39600, + 39601, + 39603, + 39604, + 39605, + 39606, + 39607, + 39608, + 39609, + 39610, + 39611, + 39612, + 39613, + 39614, + 39615, + 39616, + 39617, + 39618, + 39619, + 39621, + 39622, + 39623, + 39624, + 39625, + 39626, + 39627, + 39629, + 39630, + 39632, + 39633, + 39634, + 39635, + 39636, + 39637, + 39638, + 39639, + 39640, + 39641, + 39642, + 39643, + 39644, + 39645, + 39646, + 39647, + 39648, + 39649, + 39650, + 39651, + 39652, + 39653, + 39654, + 39655, + 39656, + 39657, + 39658, + 39659, + 39660, + 39661, + 39662, + 39663, + 39664, + 39665, + 39666, + 39667, + 39668, + 39669, + 39670, + 39671, + 39672, + 39673, + 39674, + 39675, + 39676, + 39677, + 39678, + 39679, + 39680, + 39681, + 39682, + 39683, + 39684, + 39685, + 39686, + 39687, + 39689, + 39690, + 39691, + 39693, + 39694, + 39695, + 39696, + 39698, + 39699, + 39700, + 39701, + 39702, + 39703, + 39704, + 39705, + 39706, + 39707, + 39708, + 39709, + 39710, + 39711, + 39712, + 39713, + 39714, + 39715, + 39716, + 39717, + 39718, + 39719, + 39720, + 39721, + 39722, + 39723, + 39724, + 39725, + 39726, + 39727, + 39730, + 39731, + 39732, + 39733, + 39735, + 39736, + 39737, + 39738, + 39739, + 39740, + 39741, + 39742, + 39743, + 39744, + 39745, + 39746, + 39747, + 39748, + 39749, + 39751, + 39752, + 39753, + 39754, + 39755, + 39756, + 39757, + 39758, + 39759, + 39760, + 39761, + 39762, + 39763, + 39764, + 39766, + 39767, + 39768, + 39769, + 39770, + 39772, + 39773, + 39774, + 39775, + 39776, + 39777, + 39778, + 39779, + 39780, + 39781, + 39782, + 39783, + 39784, + 39785, + 39786, + 39787, + 39788, + 39789, + 39790, + 39791, + 39792, + 39793, + 39794, + 39795, + 39796, + 39797, + 39798, + 39799, + 39800, + 39802, + 39803, + 39805, + 39806, + 39807, + 39808, + 39809, + 39810, + 39812, + 39813, + 39814, + 39815, + 39816, + 39817, + 39819, + 39820, + 39821, + 39822, + 39823, + 39824, + 39825, + 39826, + 39827, + 39828, + 39829, + 39830, + 39831, + 39833, + 39834, + 39835, + 39836, + 39837, + 39839, + 39840, + 39841, + 39843, + 39844, + 39845, + 39846, + 39847, + 39848, + 39849, + 39850, + 39851, + 39852, + 39853, + 39854, + 39855, + 39856, + 39857, + 39858, + 39859, + 39860, + 39861, + 39862, + 39863, + 39864, + 39865, + 39866, + 39867, + 39868, + 39869, + 39870, + 39871, + 39872, + 39873, + 39874, + 39875, + 39876, + 39877, + 39878, + 39880, + 39881, + 39882, + 39883, + 39884, + 39885, + 39886, + 39887, + 39888, + 39889, + 39890, + 39891, + 39892, + 39893, + 39894, + 39895, + 39896, + 39897, + 39898, + 39899, + 39901, + 39902, + 39903, + 39904, + 39905, + 39906, + 39907, + 39908, + 39909, + 39910, + 39912, + 39915, + 39917, + 39918, + 39919, + 39920, + 39921, + 39922, + 39924, + 39925, + 39926, + 39927, + 39928, + 39929, + 39930, + 39931, + 39933, + 39934, + 39935, + 39936, + 39937, + 39938, + 39939, + 39941, + 39942, + 39943, + 39944, + 39945, + 39946, + 39947, + 39948, + 39949, + 39950, + 39951, + 39952, + 39953, + 39954, + 39955, + 39956, + 39957, + 39958, + 39959, + 39960, + 39961, + 39962, + 39963, + 39964, + 39965, + 39966, + 39967, + 39968, + 39970, + 39971, + 39972, + 39973, + 39974, + 39975, + 39977, + 39978, + 39979, + 39980, + 39982, + 39983, + 39985, + 39986, + 39987, + 39988, + 39989, + 39991, + 39992, + 39993, + 39994, + 39995, + 39996, + 39997, + 39998, + 39999, + 40000, + 40001, + 40002, + 40004, + 40005, + 40006, + 40007, + 40008, + 40009, + 40010, + 40012, + 40013, + 40014, + 40015, + 40016, + 40017, + 40018, + 40019, + 40020, + 40021, + 40023, + 40024, + 40025, + 40026, + 40027, + 40028, + 40029, + 40030, + 40031, + 40032, + 40033, + 40034, + 40035, + 40036, + 40037, + 40038, + 40039, + 40040, + 40041, + 40042, + 40043, + 40044, + 40045, + 40046, + 40047, + 40049, + 40050, + 40051, + 40052, + 40053, + 40054, + 40056, + 40057, + 40058, + 40059, + 40060, + 40061, + 40062, + 40063, + 40064, + 40065, + 40066, + 40067, + 40068, + 40069, + 40070, + 40072, + 40073, + 40074, + 40075, + 40076, + 40077, + 40078, + 40079, + 40080, + 40081, + 40082, + 40083, + 40084, + 40085, + 40086, + 40087, + 40088, + 40089, + 40090, + 40091, + 40092, + 40093, + 40094, + 40095, + 40096, + 40097, + 40098, + 40099, + 40100, + 40101, + 40102, + 40103, + 40104, + 40105, + 40107, + 40108, + 40109, + 40110, + 40111, + 40113, + 40114, + 40115, + 40116, + 40117, + 40118, + 40119, + 40120, + 40121, + 40122, + 40123, + 40124, + 40125, + 40127, + 40128, + 40129, + 40130, + 40131, + 40133, + 40134, + 40135, + 40136, + 40137, + 40138, + 40139, + 40140, + 40141, + 40142, + 40143, + 40144, + 40145, + 40146, + 40147, + 40148, + 40149, + 40150, + 40151, + 40152, + 40153, + 40154, + 40155, + 40158, + 40159, + 40160, + 40161, + 40162, + 40163, + 40164, + 40165, + 40166, + 40167, + 40168, + 40169, + 40170, + 40171, + 40172, + 40173, + 40174, + 40175, + 40176, + 40177, + 40178, + 40179, + 40180, + 40181, + 40182, + 40183, + 40184, + 40185, + 40186, + 40187, + 40188, + 40189, + 40192, + 40193, + 40194, + 40195, + 40196, + 40197, + 40198, + 40199, + 40200, + 40201, + 40202, + 40203, + 40204, + 40205, + 40206, + 40207, + 40208, + 40209, + 40210, + 40211, + 40212, + 40213, + 40214, + 40215, + 40216, + 40217, + 40219, + 40220, + 40221, + 40222, + 40223, + 40224, + 40225, + 40226, + 40228, + 40229, + 40230, + 40231, + 40232, + 40233, + 40235, + 40236, + 40237, + 40238, + 40239, + 40240, + 40241, + 40242, + 40243, + 40244, + 40245, + 40246, + 40247, + 40248, + 40249, + 40250, + 40251, + 40252, + 40253, + 40254, + 40256, + 40257, + 40258, + 40259, + 40260, + 40261, + 40262, + 40263, + 40264, + 40265, + 40266, + 40267, + 40268, + 40269, + 40270, + 40271, + 40272, + 40273, + 40274, + 40275, + 40276, + 40277, + 40278, + 40279, + 40280, + 40281, + 40282, + 40283, + 40284, + 40285, + 40286, + 40287, + 40288, + 40289, + 40290, + 40291, + 40292, + 40293, + 40294, + 40295, + 40296, + 40297, + 40298, + 40299, + 40300, + 40301, + 40302, + 40303, + 40304, + 40306, + 40307, + 40308, + 40309, + 40310, + 40311, + 40312, + 40313, + 40314, + 40315, + 40316, + 40317, + 40318, + 40319, + 40320, + 40321, + 40322, + 40323, + 40324, + 40325, + 40326, + 40327, + 40328, + 40329, + 40330, + 40331, + 40332, + 40333, + 40334, + 40335, + 40336, + 40337, + 40338, + 40339, + 40341, + 40343, + 40344, + 40345, + 40346, + 40348, + 40349, + 40350, + 40351, + 40352, + 40353, + 40354, + 40355, + 40356, + 40357, + 40358, + 40359, + 40360, + 40361, + 40362, + 40363, + 40364, + 40365, + 40366, + 40367, + 40368, + 40369, + 40371, + 40372, + 40373, + 40374, + 40375, + 40377, + 40378, + 40379, + 40380, + 40381, + 40382, + 40383, + 40384, + 40385, + 40386, + 40387, + 40388, + 40389, + 40390, + 40391, + 40392, + 40394, + 40395, + 40396, + 40397, + 40398, + 40399, + 40400, + 40402, + 40403, + 40404, + 40405, + 40406, + 40407, + 40408, + 40409, + 40411, + 40412, + 40413, + 40414, + 40416, + 40417, + 40418, + 40419, + 40420, + 40421, + 40422, + 40423, + 40424, + 40425, + 40426, + 40427, + 40428, + 40429, + 40430, + 40432, + 40433, + 40434, + 40435, + 40436, + 40437, + 40438, + 40439, + 40440, + 40441, + 40442, + 40443, + 40444, + 40445, + 40446, + 40447, + 40448, + 40449, + 40450, + 40451, + 40452, + 40453, + 40454, + 40455, + 40456, + 40457, + 40458, + 40459, + 40460, + 40461, + 40462, + 40464, + 40465, + 40466, + 40467, + 40468, + 40470, + 40471, + 40472, + 40473, + 40474, + 40475, + 40476, + 40477, + 40478, + 40479, + 40480, + 40481, + 40482, + 40483, + 40484, + 40485, + 40486, + 40487, + 40488, + 40489, + 40490, + 40491, + 40492, + 40493, + 40494, + 40495, + 40496, + 40497, + 40498, + 40499, + 40500, + 40501, + 40502, + 40503, + 40504, + 40505, + 40506, + 40507, + 40508, + 40509, + 40510, + 40511, + 40512, + 40513, + 40514, + 40516, + 40517, + 40518, + 40519, + 40520, + 40521, + 40522, + 40523, + 40524, + 40525, + 40526, + 40527, + 40528, + 40530, + 40531, + 40532, + 40533, + 40534, + 40535, + 40537, + 40538, + 40539, + 40540, + 40541, + 40543, + 40544, + 40545, + 40546, + 40547, + 40548, + 40549, + 40550, + 40551, + 40552, + 40554, + 40555, + 40557, + 40558, + 40559, + 40560, + 40561, + 40562, + 40563, + 40564, + 40565, + 40566, + 40567, + 40568, + 40569, + 40570, + 40571, + 40572, + 40573, + 40574, + 40575, + 40576, + 40577, + 40578, + 40579, + 40580, + 40581, + 40582, + 40583, + 40584, + 40585, + 40586, + 40587, + 40588, + 40589, + 40590, + 40591, + 40592, + 40593, + 40594, + 40595, + 40596, + 40597, + 40598, + 40600, + 40601, + 40602, + 40603, + 40606, + 40607, + 40608, + 40609, + 40610, + 40612, + 40613, + 40614, + 40615, + 40616, + 40617, + 40618, + 40619, + 40620, + 40621, + 40622, + 40623, + 40624, + 40625, + 40626, + 40627, + 40628, + 40629, + 40630, + 40631, + 40632, + 40633, + 40634, + 40635, + 40636, + 40637, + 40638, + 40640, + 40641, + 40642, + 40643, + 40644, + 40645, + 40647, + 40648, + 40649, + 40650, + 40651, + 40652, + 40653, + 40654, + 40655, + 40656, + 40657, + 40658, + 40659, + 40660, + 40661, + 40662, + 40663, + 40664, + 40665, + 40666, + 40667, + 40668, + 40669, + 40670, + 40671, + 40672, + 40673, + 40674, + 40675, + 40676, + 40677, + 40678, + 40679, + 40680, + 40681, + 40682, + 40683, + 40684, + 40685, + 40686, + 40687, + 40688, + 40689, + 40690, + 40691, + 40692, + 40693, + 40694, + 40695, + 40696, + 40697, + 40698, + 40699, + 40700, + 40701, + 40702, + 40703, + 40704, + 40705, + 40706, + 40708, + 40709, + 40710, + 40711, + 40712, + 40713, + 40714, + 40715, + 40717, + 40719, + 40720, + 40721, + 40722, + 40723, + 40724, + 40725, + 40726, + 40727, + 40728, + 40729, + 40730, + 40731, + 40732, + 40733, + 40734, + 40735, + 40736, + 40737, + 40738, + 40739, + 40740, + 40741, + 40742, + 40743, + 40744, + 40745, + 40746, + 40747, + 40748, + 40749, + 40750, + 40752, + 40753, + 40754, + 40755, + 40756, + 40757, + 40758, + 40759, + 40760, + 40761, + 40762, + 40763, + 40764, + 40766, + 40767, + 40768, + 40769, + 40771, + 40773, + 40775, + 40776, + 40777, + 40778, + 40779, + 40780, + 40782, + 40783, + 40784, + 40786, + 40787, + 40788, + 40789, + 40790, + 40791, + 40792, + 40793, + 40794, + 40795, + 40796, + 40797, + 40798, + 40799, + 40800, + 40801, + 40802, + 40804, + 40805, + 40808, + 40809, + 40810, + 40811, + 40812, + 40813, + 40814, + 40815, + 40816, + 40817, + 40818, + 40819, + 40820, + 40821, + 40822, + 40823, + 40824, + 40825, + 40826, + 40827, + 40828, + 40829, + 40830, + 40831, + 40832, + 40833, + 40834, + 40835, + 40836, + 40837, + 40838, + 40839, + 40840, + 40841, + 40842, + 40843, + 40844, + 40845, + 40846, + 40847, + 40848, + 40849, + 40850, + 40851, + 40852, + 40853, + 40854, + 40855, + 40856, + 40857, + 40858, + 40859, + 40860, + 40861, + 40862, + 40863, + 40864, + 40865, + 40866, + 40867, + 40868, + 40869, + 40870, + 40871, + 40872, + 40873, + 40874, + 40875, + 40876, + 40877, + 40878, + 40879, + 40880, + 40881, + 40882, + 40884, + 40885, + 40886, + 40887, + 40888, + 40889, + 40890, + 40891, + 40892, + 40893, + 40894, + 40895, + 40896, + 40897, + 40898, + 40899, + 40900, + 40901, + 40902, + 40903, + 40904, + 40905, + 40906, + 40907, + 40908, + 40909, + 40910, + 40911, + 40912, + 40913, + 40914, + 40915, + 40917, + 40918, + 40919, + 40920, + 40921, + 40923, + 40924, + 40925, + 40926, + 40927, + 40928, + 40929, + 40930, + 40931, + 40932, + 40933, + 40934, + 40935, + 40936, + 40937, + 40938, + 40940, + 40941, + 40942, + 40943, + 40944, + 40945, + 40946, + 40947, + 40948, + 40949, + 40950, + 40951, + 40952, + 40953, + 40954, + 40955, + 40956, + 40957, + 40958, + 40959, + 40960, + 40961, + 40962, + 40963, + 40964, + 40965, + 40966, + 40967, + 40968, + 40969, + 40970, + 40971, + 40972, + 40973, + 40974, + 40975, + 40976, + 40977, + 40978, + 40979, + 40980, + 40981, + 40982, + 40983, + 40984, + 40985, + 40986, + 40987, + 40988, + 40989, + 40990, + 40991, + 40992, + 40993, + 40994, + 40995, + 40996, + 40997, + 40998, + 40999, + 41000, + 41001, + 41002, + 41003, + 41004, + 41005, + 41006, + 41007, + 41009, + 41010, + 41011, + 41012, + 41013, + 41014, + 41015, + 41016, + 41017, + 41018, + 41019, + 41020, + 41021, + 41022, + 41023, + 41024, + 41025, + 41026, + 41027, + 41028, + 41029, + 41030, + 41031, + 41032, + 41033, + 41035, + 41036, + 41038, + 41039, + 41040, + 41041, + 41042, + 41043, + 41044, + 41045, + 41046, + 41047, + 41048, + 41049, + 41050, + 41051, + 41052, + 41053, + 41054, + 41055, + 41056, + 41057, + 41058, + 41059, + 41061, + 41062, + 41063, + 41064, + 41065, + 41066, + 41067, + 41068, + 41069, + 41070, + 41072, + 41073, + 41074, + 41075, + 41076, + 41078, + 41079, + 41080, + 41081, + 41082, + 41083, + 41084, + 41085, + 41087, + 41088, + 41089, + 41090, + 41091, + 41093, + 41094, + 41095, + 41096, + 41097, + 41098, + 41099, + 41100, + 41101, + 41102, + 41103, + 41104, + 41105, + 41106, + 41107, + 41108, + 41109, + 41111, + 41112, + 41113, + 41114, + 41115, + 41117, + 41118, + 41119, + 41120, + 41121, + 41122, + 41123, + 41124, + 41125, + 41126, + 41127, + 41128, + 41129, + 41130, + 41131, + 41132, + 41133, + 41134, + 41135, + 41136, + 41137, + 41138, + 41139, + 41140, + 41141, + 41142, + 41143, + 41144, + 41145, + 41147, + 41148, + 41149, + 41151, + 41152, + 41153, + 41154, + 41155, + 41156, + 41157, + 41158, + 41159, + 41160, + 41161, + 41162, + 41163, + 41164, + 41165, + 41166, + 41167, + 41168, + 41170, + 41171, + 41172, + 41173, + 41174, + 41175, + 41176, + 41177, + 41178, + 41179, + 41181, + 41182, + 41183, + 41184, + 41185, + 41186, + 41187, + 41188, + 41189, + 41190, + 41191, + 41192, + 41193, + 41194, + 41195, + 41196, + 41197, + 41198, + 41199, + 41200, + 41201, + 41202, + 41203, + 41204, + 41205, + 41207, + 41208, + 41209, + 41210, + 41211, + 41212, + 41213, + 41214, + 41215, + 41216, + 41217, + 41218, + 41219, + 41220, + 41221, + 41222, + 41224, + 41225, + 41226, + 41227, + 41228, + 41229, + 41230, + 41231, + 41232, + 41233, + 41234, + 41235, + 41236, + 41237, + 41238, + 41239, + 41241, + 41242, + 41243, + 41244, + 41245, + 41246, + 41247, + 41248, + 41249, + 41250, + 41251, + 41252, + 41253, + 41254, + 41255, + 41256, + 41257, + 41258, + 41259, + 41260, + 41261, + 41262, + 41263, + 41264, + 41265, + 41266, + 41267, + 41268, + 41270, + 41271, + 41272, + 41273, + 41274, + 41275, + 41276, + 41277, + 41279, + 41280, + 41281, + 41282, + 41283, + 41284, + 41285, + 41286, + 41287, + 41288, + 41289, + 41290, + 41292, + 41293, + 41294, + 41295, + 41296, + 41297, + 41298, + 41299, + 41301, + 41302, + 41303, + 41304, + 41305, + 41306, + 41307, + 41308, + 41309, + 41310, + 41311, + 41312, + 41313, + 41314, + 41315, + 41316, + 41317, + 41318, + 41319, + 41320, + 41321, + 41322, + 41323, + 41324, + 41325, + 41326, + 41327, + 41328, + 41329, + 41330, + 41331, + 41332, + 41333, + 41334, + 41335, + 41336, + 41337, + 41338, + 41339, + 41340, + 41341, + 41342, + 41343, + 41344, + 41345, + 41346, + 41347, + 41348, + 41349, + 41350, + 41351, + 41352, + 41353, + 41354, + 41355, + 41356, + 41357, + 41358, + 41359, + 41360, + 41361, + 41362, + 41363, + 41364, + 41365, + 41366, + 41367, + 41368, + 41369, + 41370, + 41371, + 41373, + 41374, + 41375, + 41377, + 41378, + 41379, + 41380, + 41381, + 41382, + 41383, + 41384, + 41385, + 41386, + 41387, + 41388, + 41389, + 41390, + 41391, + 41392, + 41393, + 41394, + 41395, + 41396, + 41397, + 41398, + 41399, + 41400, + 41402, + 41403, + 41404, + 41405, + 41406, + 41407, + 41408, + 41409, + 41410, + 41411, + 41412, + 41413, + 41414, + 41415, + 41417, + 41418, + 41419, + 41420, + 41421, + 41422, + 41423, + 41425, + 41426, + 41427, + 41428, + 41429, + 41430, + 41431, + 41432, + 41433, + 41434, + 41435, + 41436, + 41437, + 41438, + 41439, + 41440, + 41441, + 41442, + 41443, + 41444, + 41447, + 41448, + 41449, + 41450, + 41451, + 41452, + 41453, + 41454, + 41455, + 41456, + 41457, + 41458, + 41459, + 41460, + 41461, + 41462, + 41463, + 41464, + 41465, + 41466, + 41467, + 41468, + 41469, + 41470, + 41471, + 41472, + 41473, + 41474, + 41475, + 41476, + 41477, + 41478, + 41479, + 41480, + 41481, + 41482, + 41483, + 41484, + 41485, + 41486, + 41487, + 41488, + 41489, + 41490, + 41491, + 41492, + 41493, + 41494, + 41495, + 41496, + 41497, + 41498, + 41499, + 41500, + 41501, + 41502, + 41503, + 41504, + 41505, + 41506, + 41507, + 41508, + 41509, + 41510, + 41511, + 41512, + 41513, + 41514, + 41515, + 41517, + 41518, + 41519, + 41520, + 41521, + 41522, + 41523, + 41524, + 41525, + 41526, + 41527, + 41528, + 41529, + 41530, + 41531, + 41532, + 41533, + 41535, + 41536, + 41537, + 41538, + 41539, + 41540, + 41541, + 41542, + 41543, + 41544, + 41546, + 41547, + 41548, + 41549, + 41550, + 41551, + 41552, + 41553, + 41554, + 41555, + 41556, + 41557, + 41558, + 41559, + 41560, + 41561, + 41562, + 41563, + 41564, + 41565, + 41566, + 41567, + 41568, + 41569, + 41570, + 41571, + 41572, + 41573, + 41574, + 41575, + 41576, + 41577, + 41578, + 41580, + 41581, + 41582, + 41583, + 41584, + 41585, + 41586, + 41587, + 41588, + 41589, + 41590, + 41591, + 41592, + 41593, + 41595, + 41596, + 41597, + 41598, + 41599, + 41600, + 41602, + 41603, + 41605, + 41606, + 41607, + 41608, + 41609, + 41610, + 41612, + 41613, + 41614, + 41615, + 41616, + 41617, + 41618, + 41619, + 41620, + 41621, + 41622, + 41623, + 41624, + 41625, + 41626, + 41627, + 41628, + 41629, + 41630, + 41631, + 41632, + 41633, + 41634, + 41635, + 41636, + 41637, + 41638, + 41639, + 41640, + 41641, + 41642, + 41643, + 41644, + 41645, + 41646, + 41647, + 41648, + 41649, + 41650, + 41651, + 41652, + 41653, + 41654, + 41655, + 41656, + 41657, + 41658, + 41659, + 41660, + 41661, + 41662, + 41663, + 41664, + 41665, + 41666, + 41667, + 41668, + 41669, + 41670, + 41671, + 41672, + 41673, + 41674, + 41675, + 41676, + 41677, + 41678, + 41679, + 41681, + 41682, + 41683, + 41684, + 41685, + 41686, + 41687, + 41688, + 41689, + 41691, + 41692, + 41694, + 41695, + 41697, + 41698, + 41699, + 41701, + 41702, + 41703, + 41704, + 41705, + 41706, + 41707, + 41708, + 41709, + 41710, + 41711, + 41712, + 41713, + 41714, + 41715, + 41716, + 41717, + 41718, + 41719, + 41720, + 41721, + 41722, + 41723, + 41724, + 41725, + 41726, + 41727, + 41728, + 41729, + 41730, + 41731, + 41732, + 41733, + 41734, + 41735, + 41736, + 41737, + 41738, + 41739, + 41740, + 41741, + 41742, + 41743, + 41744, + 41745, + 41746, + 41747, + 41748, + 41749, + 41750, + 41751, + 41752, + 41753, + 41754, + 41755, + 41756, + 41757, + 41759, + 41760, + 41761, + 41762, + 41763, + 41764, + 41765, + 41766, + 41767, + 41768, + 41769, + 41770, + 41771, + 41773, + 41774, + 41776, + 41777, + 41778, + 41780, + 41781, + 41782, + 41783, + 41784, + 41785, + 41786, + 41787, + 41788, + 41789, + 41790, + 41791, + 41793, + 41794, + 41796, + 41797, + 41798, + 41799, + 41800, + 41801, + 41802, + 41803, + 41804, + 41805, + 41806, + 41808, + 41809, + 41810, + 41811, + 41812, + 41813, + 41814, + 41815, + 41816, + 41817, + 41818, + 41819, + 41821, + 41822, + 41823, + 41824, + 41825, + 41826, + 41827, + 41828, + 41829, + 41830, + 41831, + 41832, + 41833, + 41835, + 41836, + 41837, + 41838, + 41839, + 41840, + 41841, + 41843, + 41844, + 41845, + 41846, + 41847, + 41850, + 41852, + 41853, + 41855, + 41856, + 41857, + 41858, + 41859, + 41860, + 41861, + 41862, + 41863, + 41865, + 41866, + 41867, + 41868, + 41869, + 41870, + 41871, + 41873, + 41874, + 41875, + 41876, + 41877, + 41878, + 41879, + 41880, + 41881, + 41882, + 41883, + 41884, + 41885, + 41886, + 41887, + 41888, + 41889, + 41890, + 41891, + 41892, + 41893, + 41894, + 41895, + 41896, + 41897, + 41898, + 41899, + 41900, + 41901, + 41902, + 41903, + 41904, + 41905, + 41906, + 41907, + 41910, + 41911, + 41912, + 41913, + 41914, + 41915, + 41916, + 41917, + 41918, + 41919, + 41920, + 41921, + 41922, + 41923, + 41925, + 41926, + 41927, + 41928, + 41930, + 41931, + 41932, + 41933, + 41934, + 41935, + 41936, + 41937, + 41938, + 41939, + 41940, + 41941, + 41944, + 41945, + 41946, + 41947, + 41948, + 41950, + 41951, + 41952, + 41953, + 41955, + 41956, + 41957, + 41958, + 41959, + 41960, + 41961, + 41962, + 41963, + 41964, + 41965, + 41966, + 41967, + 41968, + 41969, + 41970, + 41971, + 41972, + 41974, + 41976, + 41977, + 41978, + 41979, + 41981, + 41982, + 41983, + 41984, + 41985, + 41986, + 41987, + 41988, + 41989, + 41990, + 41991, + 41992, + 41994, + 41995, + 41996, + 41997, + 41998, + 41999, + 42000, + 42001, + 42003, + 42004, + 42005, + 42006, + 42007, + 42008, + 42010, + 42011, + 42012, + 42013, + 42014, + 42015, + 42016, + 42017, + 42018, + 42019, + 42020, + 42021, + 42022, + 42023, + 42024, + 42025, + 42026, + 42027, + 42028, + 42029, + 42030, + 42031, + 42032, + 42033, + 42034, + 42035, + 42036, + 42037, + 42038, + 42039, + 42040, + 42041, + 42042, + 42043, + 42044, + 42045, + 42046, + 42047, + 42048, + 42049, + 42050, + 42051, + 42053, + 42054, + 42055, + 42056, + 42057, + 42058, + 42060, + 42061, + 42062, + 42063, + 42064, + 42065, + 42066, + 42067, + 42068, + 42069, + 42070, + 42071, + 42072, + 42074, + 42075, + 42076, + 42077, + 42078, + 42079, + 42080, + 42081, + 42084, + 42085, + 42086, + 42087, + 42088, + 42089, + 42090, + 42091, + 42092, + 42093, + 42094, + 42095, + 42096, + 42097, + 42099, + 42100, + 42101, + 42102, + 42103, + 42104, + 42105, + 42106, + 42107, + 42108, + 42110, + 42111, + 42112, + 42113, + 42114, + 42115, + 42116, + 42117, + 42118, + 42119, + 42120, + 42121, + 42122, + 42123, + 42124, + 42125, + 42126, + 42127, + 42128, + 42129, + 42130, + 42131, + 42132, + 42133, + 42134, + 42135, + 42136, + 42137, + 42138, + 42139, + 42140, + 42141, + 42142, + 42143, + 42144, + 42145, + 42147, + 42148, + 42149, + 42150, + 42151, + 42152, + 42153, + 42154, + 42155, + 42156, + 42157, + 42158, + 42159, + 42160, + 42161, + 42162, + 42163, + 42164, + 42165, + 42166, + 42168, + 42169, + 42170, + 42172, + 42173, + 42174, + 42175, + 42176, + 42177, + 42178, + 42179, + 42180, + 42181, + 42182, + 42183, + 42184, + 42186, + 42188, + 42189, + 42190, + 42191, + 42192, + 42193, + 42194, + 42196, + 42197, + 42198, + 42199, + 42200, + 42201, + 42202, + 42203, + 42204, + 42205, + 42206, + 42207, + 42208, + 42209, + 42210, + 42211, + 42212, + 42213, + 42214, + 42215, + 42216, + 42217, + 42218, + 42219, + 42220, + 42221, + 42222, + 42223, + 42224, + 42225, + 42226, + 42227, + 42228, + 42229, + 42230, + 42231, + 42232, + 42233, + 42234, + 42235, + 42236, + 42237, + 42238, + 42239, + 42240, + 42241, + 42242, + 42243, + 42244, + 42245, + 42246, + 42247, + 42248, + 42249, + 42250, + 42251, + 42252, + 42253, + 42254, + 42255, + 42256, + 42258, + 42259, + 42260, + 42261, + 42262, + 42264, + 42265, + 42266, + 42267, + 42268, + 42269, + 42270, + 42271, + 42273, + 42274, + 42275, + 42276, + 42277, + 42278, + 42279, + 42280, + 42281, + 42282, + 42283, + 42285, + 42286, + 42287, + 42288, + 42289, + 42290, + 42292, + 42293, + 42294, + 42295, + 42296, + 42297, + 42298, + 42300, + 42301, + 42302, + 42303, + 42304, + 42305, + 42306, + 42307, + 42308, + 42309, + 42310, + 42311, + 42312, + 42313, + 42314, + 42315, + 42316, + 42317, + 42318, + 42319, + 42320, + 42321, + 42322, + 42323, + 42324, + 42325, + 42326, + 42327, + 42328, + 42329, + 42330, + 42331, + 42332, + 42333, + 42334, + 42335, + 42336, + 42337, + 42338, + 42339, + 42340, + 42341, + 42343, + 42344, + 42345, + 42346, + 42347, + 42348, + 42349, + 42350, + 42351, + 42352, + 42353, + 42354, + 42355, + 42356, + 42357, + 42358, + 42359, + 42360, + 42361, + 42362, + 42363, + 42364, + 42365, + 42366, + 42367, + 42368, + 42369, + 42370, + 42371, + 42372, + 42373, + 42374, + 42375, + 42377, + 42378, + 42379, + 42380, + 42381, + 42382, + 42384, + 42385, + 42386, + 42387, + 42388, + 42389, + 42390, + 42392, + 42393, + 42394, + 42395, + 42396, + 42397, + 42398, + 42399, + 42401, + 42402, + 42403, + 42404, + 42405, + 42406, + 42407, + 42408, + 42409, + 42410, + 42411, + 42412, + 42413, + 42414, + 42415, + 42416, + 42417, + 42418, + 42419, + 42420, + 42421, + 42422, + 42423, + 42424, + 42426, + 42427, + 42428, + 42429, + 42430, + 42431, + 42432, + 42433, + 42435, + 42436, + 42437, + 42438, + 42439, + 42440, + 42441, + 42442, + 42444, + 42445, + 42446, + 42447, + 42448, + 42449, + 42451, + 42452, + 42453, + 42454, + 42455, + 42456, + 42457, + 42458, + 42459, + 42460, + 42461, + 42462, + 42463, + 42464, + 42465, + 42466, + 42467, + 42468, + 42469, + 42470, + 42471, + 42472, + 42473, + 42474, + 42475, + 42476, + 42477, + 42478, + 42479, + 42480, + 42481, + 42482, + 42483, + 42484, + 42485, + 42486, + 42487, + 42488, + 42490, + 42492, + 42493, + 42494, + 42495, + 42496, + 42497, + 42498, + 42499, + 42500, + 42501, + 42502, + 42503, + 42504, + 42505, + 42506, + 42507, + 42508, + 42509, + 42510, + 42511, + 42512, + 42513, + 42514, + 42515, + 42516, + 42517, + 42518, + 42519, + 42520, + 42521, + 42522, + 42523, + 42524, + 42525, + 42526, + 42527, + 42528, + 42529, + 42530, + 42532, + 42533, + 42534, + 42535, + 42536, + 42537, + 42539, + 42540, + 42541, + 42542, + 42543, + 42544, + 42545, + 42546, + 42547, + 42548, + 42549, + 42550, + 42551, + 42552, + 42553, + 42554, + 42555, + 42556, + 42557, + 42558, + 42559, + 42560, + 42561, + 42562, + 42563, + 42564, + 42565, + 42566, + 42567, + 42568, + 42569, + 42570, + 42571, + 42572, + 42573, + 42574, + 42575, + 42576, + 42577, + 42578, + 42579, + 42580, + 42582, + 42584, + 42585, + 42586, + 42587, + 42588, + 42589, + 42591, + 42592, + 42594, + 42595, + 42596, + 42597, + 42598, + 42599, + 42600, + 42601, + 42602, + 42603, + 42604, + 42605, + 42606, + 42607, + 42609, + 42610, + 42611, + 42612, + 42613, + 42614, + 42615, + 42616, + 42617, + 42618, + 42619, + 42620, + 42621, + 42622, + 42623, + 42624, + 42625, + 42626, + 42627, + 42628, + 42629, + 42630, + 42631, + 42632, + 42633, + 42634, + 42635, + 42636, + 42637, + 42638, + 42639, + 42640, + 42641, + 42643, + 42644, + 42645, + 42646, + 42647, + 42648, + 42649, + 42650, + 42651, + 42652, + 42653, + 42654, + 42655, + 42657, + 42660, + 42661, + 42662, + 42663, + 42664, + 42665, + 42666, + 42667, + 42668, + 42669, + 42670, + 42672, + 42673, + 42674, + 42675, + 42676, + 42677, + 42678, + 42679, + 42680, + 42681, + 42682, + 42683, + 42684, + 42685, + 42686, + 42687, + 42688, + 42689, + 42690, + 42691, + 42692, + 42693, + 42694, + 42695, + 42696, + 42697, + 42698, + 42699, + 42700, + 42701, + 42703, + 42704, + 42705, + 42706, + 42707, + 42708, + 42709, + 42710, + 42711, + 42712, + 42713, + 42714, + 42715, + 42716, + 42718, + 42719, + 42720, + 42721, + 42722, + 42723, + 42724, + 42725, + 42727, + 42728, + 42729, + 42730, + 42731, + 42732, + 42733, + 42734, + 42735, + 42736, + 42737, + 42738, + 42739, + 42740, + 42741, + 42742, + 42743, + 42744, + 42745, + 42746, + 42747, + 42748, + 42749, + 42750, + 42751, + 42752, + 42753, + 42754, + 42755, + 42756, + 42757, + 42759, + 42760, + 42761, + 42762, + 42763, + 42764, + 42765, + 42766, + 42767, + 42768, + 42769, + 42770, + 42771, + 42772, + 42773, + 42774, + 42775, + 42776, + 42777, + 42778, + 42779, + 42780, + 42781, + 42783, + 42784, + 42785, + 42786, + 42789, + 42790, + 42791, + 42792, + 42793, + 42794, + 42795, + 42796, + 42797, + 42798, + 42799, + 42800, + 42801, + 42802, + 42803, + 42804, + 42805, + 42806, + 42807, + 42808, + 42809, + 42810, + 42811, + 42812, + 42813, + 42814, + 42815, + 42816, + 42817, + 42819, + 42820, + 42821, + 42822, + 42823, + 42824, + 42825, + 42826, + 42827, + 42829, + 42830, + 42831, + 42832, + 42833, + 42834, + 42835, + 42836, + 42837, + 42838, + 42839, + 42840, + 42841, + 42842, + 42843, + 42844, + 42845, + 42846, + 42847, + 42848, + 42849, + 42850, + 42851, + 42852, + 42853, + 42854, + 42855, + 42856, + 42857, + 42859, + 42860, + 42861, + 42862, + 42863, + 42864, + 42865, + 42866, + 42867, + 42868, + 42869, + 42870, + 42871, + 42872, + 42873, + 42874, + 42875, + 42877, + 42879, + 42881, + 42882, + 42883, + 42884, + 42885, + 42886, + 42887, + 42888, + 42889, + 42890, + 42891, + 42892, + 42894, + 42895, + 42896, + 42897, + 42898, + 42899, + 42900, + 42901, + 42902, + 42903, + 42904, + 42905, + 42906, + 42907, + 42908, + 42909, + 42910, + 42911, + 42912, + 42913, + 42914, + 42915, + 42916, + 42917, + 42918, + 42919, + 42920, + 42921, + 42923, + 42924, + 42925, + 42926, + 42927, + 42928, + 42929, + 42930, + 42931, + 42932, + 42933, + 42934, + 42935, + 42936, + 42937, + 42938, + 42939, + 42941, + 42942, + 42943, + 42944, + 42945, + 42946, + 42947, + 42948, + 42949, + 42950, + 42951, + 42952, + 42953, + 42954, + 42955, + 42957, + 42958, + 42959, + 42960, + 42961, + 42962, + 42963, + 42965, + 42966, + 42967, + 42968, + 42969, + 42970, + 42971, + 42972, + 42973, + 42974, + 42975, + 42976, + 42977, + 42978, + 42979, + 42980, + 42981, + 42982, + 42983, + 42985, + 42986, + 42987, + 42988, + 42989, + 42990, + 42991, + 42992, + 42993, + 42994, + 42995, + 42996, + 42997, + 42998, + 42999, + 43000, + 43001, + 43002, + 43003, + 43004, + 43005, + 43006, + 43008, + 43009, + 43010, + 43011, + 43012, + 43015, + 43016, + 43017, + 43018, + 43019, + 43020, + 43021, + 43022, + 43024, + 43025, + 43026, + 43027, + 43028, + 43029, + 43030, + 43031, + 43032, + 43033, + 43034, + 43035, + 43036, + 43037, + 43038, + 43039, + 43040, + 43041, + 43043, + 43045, + 43047, + 43048, + 43049, + 43050, + 43051, + 43052, + 43053, + 43054, + 43055, + 43056, + 43057, + 43058, + 43059, + 43060, + 43061, + 43062, + 43063, + 43064, + 43065, + 43066, + 43067, + 43068, + 43069, + 43070, + 43071, + 43072, + 43073, + 43074, + 43076, + 43077, + 43078, + 43079, + 43080, + 43081, + 43082, + 43083, + 43084, + 43085, + 43086, + 43087, + 43088, + 43089, + 43090, + 43091, + 43092, + 43093, + 43094, + 43095, + 43096, + 43097, + 43098, + 43099, + 43100, + 43101, + 43103, + 43104, + 43105, + 43106, + 43107, + 43108, + 43110, + 43111, + 43112, + 43113, + 43114, + 43115, + 43116, + 43117, + 43118, + 43119, + 43120, + 43122, + 43123, + 43124, + 43126, + 43127, + 43128, + 43129, + 43130, + 43132, + 43133, + 43134, + 43135, + 43136, + 43137, + 43138, + 43139, + 43140, + 43141, + 43142, + 43143, + 43144, + 43145, + 43146, + 43147, + 43148, + 43149, + 43151, + 43152, + 43153, + 43154, + 43155, + 43156, + 43157, + 43158, + 43159, + 43160, + 43161, + 43162, + 43163, + 43164, + 43165, + 43166, + 43167, + 43168, + 43169, + 43170, + 43171, + 43172, + 43173, + 43174, + 43176, + 43177, + 43178, + 43179, + 43180, + 43181, + 43182, + 43184, + 43185, + 43187, + 43189, + 43190, + 43191, + 43192, + 43193, + 43194, + 43195, + 43196, + 43197, + 43198, + 43199, + 43200, + 43201, + 43202, + 43203, + 43204, + 43205, + 43206, + 43207, + 43208, + 43209, + 43210, + 43211, + 43212, + 43213, + 43214, + 43215, + 43216, + 43217, + 43219, + 43220, + 43221, + 43223, + 43224, + 43225, + 43226, + 43228, + 43229, + 43230, + 43231, + 43232, + 43233, + 43234, + 43235, + 43236, + 43237, + 43238, + 43241, + 43242, + 43243, + 43244, + 43245, + 43246, + 43247, + 43248, + 43249, + 43250, + 43251, + 43252, + 43253, + 43254, + 43255, + 43256, + 43257, + 43258, + 43259, + 43260, + 43261, + 43262, + 43263, + 43264, + 43265, + 43266, + 43267, + 43268, + 43269, + 43270, + 43271, + 43272, + 43273, + 43274, + 43275, + 43276, + 43277, + 43278, + 43279, + 43280, + 43281, + 43282, + 43283, + 43285, + 43286, + 43287, + 43288, + 43289, + 43290, + 43291, + 43292, + 43294, + 43295, + 43296, + 43297, + 43298, + 43299, + 43300, + 43301, + 43302, + 43303, + 43304, + 43305, + 43306, + 43307, + 43308, + 43309, + 43310, + 43311, + 43312, + 43313, + 43314, + 43316, + 43317, + 43318, + 43319, + 43321, + 43322, + 43323, + 43324, + 43325, + 43326, + 43327, + 43328, + 43329, + 43330, + 43331, + 43332, + 43333, + 43334, + 43335, + 43336, + 43337, + 43338, + 43339, + 43340, + 43341, + 43342, + 43343, + 43344, + 43345, + 43346, + 43347, + 43348, + 43349, + 43350, + 43351, + 43352, + 43354, + 43355, + 43356, + 43357, + 43358, + 43360, + 43361, + 43362, + 43363, + 43364, + 43365, + 43366, + 43367, + 43368, + 43369, + 43370, + 43371, + 43372, + 43373, + 43374, + 43375, + 43376, + 43377, + 43378, + 43379, + 43380, + 43381, + 43382, + 43383, + 43384, + 43385, + 43386, + 43387, + 43388, + 43389, + 43390, + 43392, + 43393, + 43394, + 43395, + 43396, + 43397, + 43398, + 43399, + 43400, + 43402, + 43403, + 43404, + 43405, + 43406, + 43407, + 43408, + 43409, + 43410, + 43411, + 43413, + 43414, + 43415, + 43416, + 43417, + 43418, + 43419, + 43420, + 43421, + 43422, + 43423, + 43424, + 43425, + 43426, + 43427, + 43428, + 43429, + 43430, + 43431, + 43432, + 43433, + 43434, + 43435, + 43436, + 43437, + 43438, + 43440, + 43441, + 43442, + 43443, + 43444, + 43445, + 43446, + 43447, + 43448, + 43449, + 43450, + 43451, + 43452, + 43453, + 43455, + 43457, + 43458, + 43459, + 43461, + 43462, + 43464, + 43465, + 43466, + 43467, + 43468, + 43469, + 43470, + 43471, + 43472, + 43474, + 43475, + 43476, + 43477, + 43478, + 43479, + 43480, + 43481, + 43482, + 43483, + 43484, + 43485, + 43486, + 43487, + 43488, + 43489, + 43490, + 43491, + 43492, + 43493, + 43494, + 43495, + 43496, + 43497, + 43498, + 43499, + 43500, + 43501, + 43502, + 43503, + 43504, + 43505, + 43506, + 43507, + 43508, + 43510, + 43511, + 43512, + 43513, + 43514, + 43515, + 43516, + 43517, + 43518, + 43519, + 43520, + 43521, + 43522, + 43524, + 43525, + 43526, + 43527, + 43528, + 43529, + 43530, + 43531, + 43532, + 43533, + 43534, + 43535, + 43536, + 43537, + 43538, + 43539, + 43540, + 43541, + 43542, + 43543, + 43544, + 43545, + 43546, + 43548, + 43549, + 43550, + 43551, + 43552, + 43553, + 43554, + 43555, + 43556, + 43557, + 43558, + 43559, + 43560, + 43561, + 43562, + 43563, + 43564, + 43565, + 43567, + 43568, + 43569, + 43570, + 43571, + 43572, + 43573, + 43574, + 43575, + 43576, + 43580, + 43581, + 43582, + 43583, + 43584, + 43585, + 43586, + 43587, + 43588, + 43589, + 43590, + 43591, + 43592, + 43593, + 43594, + 43595, + 43596, + 43597, + 43598, + 43599, + 43600, + 43601, + 43602, + 43603, + 43605, + 43607, + 43608, + 43609, + 43610, + 43611, + 43612, + 43614, + 43615, + 43616, + 43617, + 43618, + 43619, + 43620, + 43621, + 43623, + 43624, + 43625, + 43626, + 43627, + 43628, + 43629, + 43630, + 43631, + 43632, + 43633, + 43635, + 43636, + 43638, + 43639, + 43640, + 43641, + 43642, + 43644, + 43645, + 43646, + 43647, + 43648, + 43649, + 43650, + 43651, + 43652, + 43653, + 43654, + 43655, + 43656, + 43658, + 43659, + 43660, + 43661, + 43662, + 43663, + 43664, + 43665, + 43667, + 43668, + 43669, + 43670, + 43671, + 43672, + 43673, + 43674, + 43675, + 43676, + 43677, + 43678, + 43679, + 43680, + 43681, + 43682, + 43684, + 43685, + 43686, + 43687, + 43689, + 43690, + 43691, + 43692, + 43693, + 43694, + 43695, + 43696, + 43697, + 43698, + 43699, + 43700, + 43701, + 43702, + 43703, + 43704, + 43706, + 43707, + 43708, + 43709, + 43710, + 43711, + 43712, + 43713, + 43714, + 43716, + 43717, + 43718, + 43719, + 43720, + 43721, + 43722, + 43723, + 43724, + 43725, + 43726, + 43727, + 43728, + 43729, + 43730, + 43731, + 43732, + 43733, + 43734, + 43735, + 43736, + 43737, + 43738, + 43739, + 43740, + 43741, + 43742, + 43743, + 43744, + 43745, + 43746, + 43747, + 43748, + 43749, + 43750, + 43751, + 43752, + 43753, + 43754, + 43755, + 43756, + 43757, + 43758, + 43759, + 43760, + 43761, + 43764, + 43765, + 43766, + 43767, + 43768, + 43769, + 43770, + 43771, + 43772, + 43773, + 43774, + 43775, + 43776, + 43777, + 43778, + 43779, + 43780, + 43781, + 43782, + 43783, + 43784, + 43785, + 43786, + 43787, + 43788, + 43789, + 43790, + 43791, + 43792, + 43793, + 43794, + 43795, + 43796, + 43797, + 43798, + 43799, + 43800, + 43802, + 43803, + 43804, + 43805, + 43806, + 43807, + 43808, + 43809, + 43810, + 43811, + 43812, + 43813, + 43814, + 43815, + 43816, + 43817, + 43818, + 43819, + 43820, + 43821, + 43822, + 43823, + 43824, + 43825, + 43826, + 43827, + 43828, + 43829, + 43830, + 43831, + 43832, + 43833, + 43834, + 43836, + 43837, + 43838, + 43839, + 43840, + 43841, + 43842, + 43843, + 43844, + 43845, + 43846, + 43847, + 43848, + 43849, + 43850, + 43851, + 43852, + 43853, + 43854, + 43855, + 43857, + 43859, + 43860, + 43861, + 43862, + 43863, + 43864, + 43865, + 43867, + 43868, + 43869, + 43870, + 43871, + 43872, + 43873, + 43874, + 43875, + 43876, + 43877, + 43878, + 43879, + 43880, + 43881, + 43882, + 43883, + 43884, + 43885, + 43886, + 43887, + 43890, + 43891, + 43892, + 43893, + 43894, + 43895, + 43896, + 43898, + 43899, + 43900, + 43901, + 43902, + 43903, + 43904, + 43905, + 43906, + 43907, + 43908, + 43909, + 43910, + 43911, + 43912, + 43913, + 43914, + 43915, + 43916, + 43917, + 43918, + 43919, + 43920, + 43921, + 43922, + 43923, + 43924, + 43925, + 43927, + 43928, + 43929, + 43930, + 43931, + 43932, + 43933, + 43934, + 43935, + 43936, + 43938, + 43940, + 43941, + 43942, + 43943, + 43944, + 43945, + 43946, + 43947, + 43948, + 43949, + 43951, + 43952, + 43953, + 43954, + 43956, + 43957, + 43958, + 43959, + 43960, + 43961, + 43962, + 43963, + 43964, + 43966, + 43967, + 43969, + 43970, + 43971, + 43972, + 43974, + 43975, + 43976, + 43977, + 43978, + 43979, + 43980, + 43981, + 43982, + 43983, + 43985, + 43986, + 43988, + 43989, + 43990, + 43991, + 43992, + 43993, + 43994, + 43995, + 43996, + 43997, + 43998, + 43999, + 44000, + 44001, + 44002, + 44003, + 44004, + 44005, + 44007, + 44008, + 44009, + 44010, + 44011, + 44012, + 44013, + 44014, + 44015, + 44016, + 44017, + 44018, + 44019, + 44020, + 44021, + 44022, + 44023, + 44024, + 44025, + 44026, + 44027, + 44028, + 44029, + 44031, + 44032, + 44033, + 44034, + 44035, + 44036, + 44037, + 44038, + 44039, + 44041, + 44043, + 44044, + 44045, + 44046, + 44047, + 44048, + 44049, + 44050, + 44051, + 44052, + 44053, + 44054, + 44055, + 44056, + 44057, + 44058, + 44059, + 44060, + 44062, + 44063, + 44064, + 44065, + 44066, + 44067, + 44068, + 44069, + 44070, + 44071, + 44072, + 44073, + 44074, + 44075, + 44076, + 44077, + 44078, + 44079, + 44080, + 44081, + 44082, + 44083, + 44084, + 44085, + 44086, + 44087, + 44088, + 44089, + 44090, + 44091, + 44092, + 44093, + 44094, + 44095, + 44096, + 44097, + 44098, + 44099, + 44101, + 44102, + 44104, + 44105, + 44107, + 44108, + 44109, + 44110, + 44111, + 44112, + 44113, + 44114, + 44115, + 44116, + 44117, + 44118, + 44119, + 44120, + 44121, + 44123, + 44125, + 44126, + 44127, + 44128, + 44129, + 44130, + 44131, + 44132, + 44133, + 44134, + 44135, + 44136, + 44137, + 44139, + 44140, + 44141, + 44144, + 44145, + 44146, + 44147, + 44148, + 44149, + 44150, + 44151, + 44152, + 44153, + 44154, + 44155, + 44156, + 44157, + 44158, + 44159, + 44160, + 44161, + 44162, + 44163, + 44164, + 44165, + 44166, + 44167, + 44168, + 44169, + 44170, + 44171, + 44172, + 44173, + 44174, + 44175, + 44177, + 44178, + 44179, + 44180, + 44181, + 44182, + 44183, + 44184, + 44185, + 44186, + 44187, + 44188, + 44189, + 44190, + 44191, + 44193, + 44194, + 44195, + 44196, + 44197, + 44198, + 44199, + 44200, + 44201, + 44202, + 44203, + 44206, + 44207, + 44208, + 44209, + 44210, + 44211, + 44212, + 44213, + 44214, + 44215, + 44216, + 44217, + 44218, + 44219, + 44220, + 44221, + 44223, + 44224, + 44225, + 44226, + 44227, + 44228, + 44229, + 44230, + 44231, + 44232, + 44233, + 44234, + 44235, + 44236, + 44237, + 44238, + 44239, + 44240, + 44241, + 44242, + 44243, + 44244, + 44245, + 44246, + 44247, + 44248, + 44249, + 44250, + 44251, + 44252, + 44253, + 44254, + 44255, + 44256, + 44258, + 44260, + 44261, + 44262, + 44263, + 44264, + 44265, + 44266, + 44267, + 44268, + 44269, + 44270, + 44271, + 44272, + 44273, + 44274, + 44275, + 44276, + 44277, + 44278, + 44279, + 44280, + 44281, + 44282, + 44284, + 44285, + 44286, + 44287, + 44288, + 44289, + 44290, + 44291, + 44292, + 44293, + 44294, + 44295, + 44296, + 44297, + 44298, + 44299, + 44300, + 44301, + 44302, + 44303, + 44304, + 44305, + 44306, + 44307, + 44308, + 44309, + 44310, + 44311, + 44312, + 44313, + 44314, + 44315, + 44316, + 44317, + 44318, + 44319, + 44320, + 44321, + 44322, + 44323, + 44324, + 44325, + 44327, + 44328, + 44329, + 44330, + 44331, + 44332, + 44333, + 44334, + 44335, + 44336, + 44337, + 44338, + 44339, + 44340, + 44341, + 44342, + 44343, + 44344, + 44345, + 44346, + 44347, + 44348, + 44349, + 44350, + 44351, + 44352, + 44353, + 44355, + 44356, + 44357, + 44358, + 44359, + 44360, + 44361, + 44362, + 44363, + 44364, + 44366, + 44367, + 44368, + 44369, + 44370, + 44371, + 44372, + 44373, + 44374, + 44375, + 44376, + 44377, + 44378, + 44379, + 44380, + 44381, + 44382, + 44383, + 44384, + 44385, + 44386, + 44387, + 44388, + 44389, + 44390, + 44391, + 44392, + 44393, + 44395, + 44396, + 44397, + 44398, + 44399, + 44400, + 44401, + 44402, + 44403, + 44404, + 44405, + 44406, + 44407, + 44408, + 44409, + 44410, + 44411, + 44412, + 44413, + 44415, + 44416, + 44417, + 44418, + 44419, + 44420, + 44421, + 44422, + 44423, + 44424, + 44425, + 44426, + 44427, + 44429, + 44431, + 44432, + 44433, + 44434, + 44435, + 44436, + 44437, + 44438, + 44439, + 44440, + 44441, + 44442, + 44443, + 44444, + 44445, + 44446, + 44447, + 44448, + 44449, + 44450, + 44451, + 44452, + 44453, + 44454, + 44455, + 44456, + 44457, + 44458, + 44459, + 44460, + 44461, + 44462, + 44463, + 44464, + 44465, + 44466, + 44467, + 44468, + 44469, + 44470, + 44473, + 44474, + 44475, + 44476, + 44477, + 44478, + 44479, + 44480, + 44481, + 44482, + 44483, + 44484, + 44485, + 44486, + 44487, + 44488, + 44489, + 44490, + 44491, + 44492, + 44493, + 44494, + 44495, + 44497, + 44498, + 44499, + 44500, + 44501, + 44503, + 44504, + 44505, + 44506, + 44507, + 44508, + 44511, + 44512, + 44513, + 44514, + 44515, + 44516, + 44517, + 44518, + 44519, + 44521, + 44522, + 44523, + 44524, + 44525, + 44526, + 44528, + 44529, + 44530, + 44531, + 44532, + 44533, + 44534, + 44535, + 44536, + 44537, + 44538, + 44539, + 44540, + 44541, + 44542, + 44543, + 44544, + 44545, + 44546, + 44547, + 44548, + 44549, + 44550, + 44551, + 44552, + 44553, + 44554, + 44556, + 44557, + 44558, + 44559, + 44560, + 44561, + 44562, + 44564, + 44565, + 44566, + 44568, + 44570, + 44571, + 44572, + 44573, + 44574, + 44575, + 44576, + 44578, + 44579, + 44580, + 44581, + 44582, + 44583, + 44584, + 44585, + 44586, + 44587, + 44588, + 44589, + 44590, + 44591, + 44592, + 44593, + 44594, + 44595, + 44596, + 44597, + 44598, + 44599, + 44600, + 44601, + 44603, + 44604, + 44605, + 44607, + 44608, + 44609, + 44610, + 44611, + 44612, + 44613, + 44615, + 44617, + 44618, + 44619, + 44620, + 44621, + 44623, + 44624, + 44625, + 44626, + 44627, + 44628, + 44629, + 44630, + 44631, + 44632, + 44634, + 44635, + 44636, + 44637, + 44638, + 44639, + 44640, + 44641, + 44642, + 44643, + 44644, + 44645, + 44647, + 44648, + 44649, + 44650, + 44651, + 44652, + 44653, + 44654, + 44655, + 44656, + 44657, + 44658, + 44659, + 44660, + 44661, + 44662, + 44663, + 44664, + 44665, + 44668, + 44669, + 44670, + 44671, + 44672, + 44673, + 44674, + 44675, + 44677, + 44678, + 44679, + 44680, + 44681, + 44682, + 44683, + 44684, + 44685, + 44686, + 44687, + 44688, + 44689, + 44690, + 44691, + 44692, + 44693, + 44694, + 44695, + 44696, + 44697, + 44698, + 44699, + 44700, + 44701, + 44702, + 44703, + 44704, + 44706, + 44707, + 44708, + 44709, + 44710, + 44711, + 44712, + 44713, + 44714, + 44715, + 44716, + 44717, + 44718, + 44720, + 44721, + 44722, + 44723, + 44724, + 44725, + 44726, + 44728, + 44729, + 44731, + 44733, + 44734, + 44735, + 44736, + 44737, + 44738, + 44739, + 44740, + 44741, + 44742, + 44743, + 44744, + 44745, + 44746, + 44747, + 44748, + 44749, + 44750, + 44751, + 44752, + 44753, + 44754, + 44755, + 44756, + 44757, + 44758, + 44759, + 44760, + 44761, + 44762, + 44763, + 44764, + 44765, + 44766, + 44767, + 44768, + 44769, + 44770, + 44771, + 44772, + 44773, + 44774, + 44775, + 44776, + 44777, + 44778, + 44779, + 44780, + 44781, + 44782, + 44783, + 44784, + 44785, + 44786, + 44787, + 44788, + 44789, + 44790, + 44791, + 44792, + 44793, + 44794, + 44795, + 44797, + 44799, + 44800, + 44801, + 44802, + 44803, + 44804, + 44805, + 44806, + 44807, + 44808, + 44809, + 44810, + 44811, + 44812, + 44813, + 44815, + 44816, + 44817, + 44818, + 44819, + 44821, + 44822, + 44823, + 44824, + 44825, + 44826, + 44827, + 44828, + 44829, + 44830, + 44831, + 44832, + 44833, + 44834, + 44835, + 44836, + 44838, + 44839, + 44840, + 44841, + 44842, + 44843, + 44845, + 44846, + 44847, + 44848, + 44849, + 44850, + 44851, + 44852, + 44853, + 44854, + 44855, + 44856, + 44857, + 44858, + 44859, + 44860, + 44861, + 44862, + 44863, + 44864, + 44865, + 44866, + 44867, + 44869, + 44870, + 44871, + 44872, + 44874, + 44875, + 44876, + 44877, + 44878, + 44879, + 44880, + 44881, + 44882, + 44883, + 44884, + 44885, + 44886, + 44887, + 44888, + 44889, + 44890, + 44891, + 44892, + 44893, + 44894, + 44895, + 44896, + 44897, + 44899, + 44900, + 44901, + 44902, + 44903, + 44905, + 44906, + 44907, + 44908, + 44910, + 44912, + 44913, + 44914, + 44916, + 44917, + 44918, + 44919, + 44920, + 44921, + 44922, + 44923, + 44925, + 44926, + 44928, + 44929, + 44930, + 44932, + 44933, + 44934, + 44935, + 44936, + 44937, + 44938, + 44939, + 44940, + 44941, + 44942, + 44943, + 44944, + 44946, + 44947, + 44948, + 44949, + 44950, + 44952, + 44956, + 44957, + 44958, + 44959, + 44960, + 44961, + 44963, + 44964, + 44965, + 44966, + 44967, + 44968, + 44969, + 44970, + 44971, + 44972, + 44974, + 44976, + 44977, + 44978, + 44979, + 44980, + 44981, + 44982, + 44983, + 44984, + 44985, + 44986, + 44987, + 44988, + 44989, + 44990, + 44991, + 44992, + 44993, + 44994, + 44995, + 44996, + 44997, + 44998, + 45000, + 45001, + 45002, + 45003, + 45004, + 45005, + 45006, + 45007, + 45008, + 45009, + 45010, + 45011, + 45012, + 45013, + 45015, + 45016, + 45017, + 45018, + 45019, + 45020, + 45021, + 45022, + 45023, + 45024, + 45025, + 45026, + 45027, + 45029, + 45031, + 45032, + 45033, + 45034, + 45035, + 45036, + 45037, + 45039, + 45040, + 45041, + 45042, + 45043, + 45044, + 45045, + 45046, + 45047, + 45048, + 45049, + 45050, + 45051, + 45052, + 45053, + 45054, + 45055, + 45056, + 45057, + 45058, + 45059, + 45060, + 45061, + 45062, + 45064, + 45065, + 45066, + 45067, + 45068, + 45069, + 45070, + 45071, + 45072, + 45073, + 45074, + 45075, + 45077, + 45079, + 45080, + 45081, + 45082, + 45083, + 45084, + 45085, + 45086, + 45087, + 45088, + 45089, + 45090, + 45091, + 45092, + 45093, + 45094, + 45095, + 45096, + 45097, + 45098, + 45099, + 45100, + 45101, + 45102, + 45104, + 45105, + 45106, + 45107, + 45108, + 45110, + 45111, + 45112, + 45115, + 45116, + 45117, + 45118, + 45119, + 45120, + 45121, + 45122, + 45123, + 45124, + 45125, + 45126, + 45127, + 45128, + 45129, + 45130, + 45131, + 45132, + 45133, + 45134, + 45135, + 45136, + 45137, + 45138, + 45139, + 45140, + 45141, + 45143, + 45144, + 45145, + 45146, + 45148, + 45149, + 45150, + 45151, + 45152, + 45153, + 45154, + 45155, + 45156, + 45157, + 45158, + 45159, + 45160, + 45161, + 45162, + 45165, + 45166, + 45167, + 45168, + 45169, + 45170, + 45171, + 45172, + 45173, + 45174, + 45175, + 45176, + 45177, + 45178, + 45179, + 45180, + 45181, + 45182, + 45183, + 45184, + 45185, + 45186, + 45187, + 45188, + 45189, + 45190, + 45192, + 45194, + 45195, + 45196, + 45197, + 45198, + 45199, + 45200, + 45201, + 45202, + 45203, + 45204, + 45205, + 45206, + 45207, + 45208, + 45209, + 45210, + 45211, + 45212, + 45213, + 45214, + 45215, + 45217, + 45219, + 45220, + 45221, + 45222, + 45223, + 45224, + 45225, + 45226, + 45227, + 45228, + 45229, + 45230, + 45231, + 45232, + 45233, + 45234, + 45235, + 45236, + 45237, + 45238, + 45239, + 45240, + 45241, + 45242, + 45243, + 45245, + 45246, + 45247, + 45248, + 45249, + 45250, + 45251, + 45252, + 45253, + 45254, + 45255, + 45256, + 45257, + 45258, + 45259, + 45260, + 45261, + 45262, + 45263, + 45264, + 45265, + 45267, + 45268, + 45269, + 45270, + 45271, + 45272, + 45273, + 45274, + 45275, + 45276, + 45277, + 45278, + 45279, + 45280, + 45281, + 45282, + 45284, + 45285, + 45286, + 45287, + 45288, + 45289, + 45290, + 45291, + 45292, + 45293, + 45294, + 45295, + 45296, + 45297, + 45298, + 45299, + 45301, + 45302, + 45303, + 45305, + 45306, + 45307, + 45308, + 45309, + 45311, + 45312, + 45313, + 45314, + 45315, + 45316, + 45317, + 45318, + 45319, + 45320, + 45321, + 45322, + 45323, + 45324, + 45325, + 45326, + 45327, + 45328, + 45329, + 45330, + 45331, + 45332, + 45333, + 45334, + 45336, + 45337, + 45338, + 45339, + 45340, + 45341, + 45342, + 45343, + 45344, + 45345, + 45346, + 45347, + 45348, + 45349, + 45350, + 45351, + 45352, + 45353, + 45354, + 45355, + 45356, + 45357, + 45358, + 45359, + 45360, + 45361, + 45362, + 45364, + 45365, + 45366, + 45367, + 45368, + 45369, + 45370, + 45371, + 45372, + 45373, + 45374, + 45375, + 45376, + 45377, + 45378, + 45379, + 45380, + 45381, + 45382, + 45383, + 45384, + 45385, + 45386, + 45387, + 45388, + 45389, + 45390, + 45391, + 45392, + 45393, + 45394, + 45395, + 45396, + 45397, + 45398, + 45399, + 45401, + 45402, + 45403, + 45404, + 45405, + 45406, + 45407, + 45408, + 45409, + 45410, + 45411, + 45412, + 45413, + 45414, + 45415, + 45416, + 45417, + 45418, + 45419, + 45420, + 45421, + 45422, + 45423, + 45424, + 45425, + 45426, + 45427, + 45428, + 45429, + 45430, + 45431, + 45432, + 45433, + 45434, + 45435, + 45436, + 45437, + 45438, + 45439, + 45440, + 45441, + 45442, + 45443, + 45445, + 45446, + 45447, + 45448, + 45449, + 45450, + 45451, + 45452, + 45453, + 45454, + 45455, + 45456, + 45457, + 45458, + 45459, + 45460, + 45461, + 45462, + 45463, + 45464, + 45465, + 45466, + 45467, + 45468, + 45469, + 45470, + 45471, + 45472, + 45473, + 45475, + 45476, + 45477, + 45478, + 45479, + 45480, + 45481, + 45482, + 45483, + 45484, + 45485, + 45486, + 45488, + 45489, + 45490, + 45491, + 45492, + 45493, + 45495, + 45496, + 45497, + 45498, + 45499, + 45500, + 45501, + 45502, + 45504, + 45505, + 45506, + 45507, + 45508, + 45509, + 45510, + 45511, + 45512, + 45513, + 45514, + 45516, + 45517, + 45518, + 45519, + 45520, + 45521, + 45522, + 45523, + 45524, + 45525, + 45527, + 45528, + 45529, + 45530, + 45531, + 45532, + 45533, + 45534, + 45535, + 45536, + 45537, + 45538, + 45539, + 45541, + 45542, + 45543, + 45544, + 45545, + 45546, + 45547, + 45549, + 45550, + 45551, + 45552, + 45553, + 45554, + 45556, + 45557, + 45558, + 45559, + 45560, + 45561, + 45562, + 45563, + 45564, + 45565, + 45566, + 45567, + 45568, + 45569, + 45571, + 45572, + 45573, + 45574, + 45575, + 45576, + 45577, + 45578, + 45579, + 45580, + 45581, + 45582, + 45583, + 45584, + 45585, + 45586, + 45587, + 45588, + 45590, + 45591, + 45592, + 45593, + 45594, + 45595, + 45596, + 45597, + 45598, + 45599, + 45600, + 45601, + 45602, + 45603, + 45604, + 45606, + 45608, + 45609, + 45610, + 45611, + 45612, + 45613, + 45614, + 45615, + 45616, + 45617, + 45618, + 45619, + 45620, + 45621, + 45622, + 45623, + 45624, + 45625, + 45626, + 45627, + 45628, + 45629, + 45630, + 45631, + 45632, + 45633, + 45634, + 45635, + 45637, + 45638, + 45639, + 45640, + 45641, + 45642, + 45643, + 45644, + 45645, + 45646, + 45647, + 45648, + 45649, + 45650, + 45651, + 45652, + 45653, + 45654, + 45655, + 45656, + 45657, + 45658, + 45659, + 45660, + 45661, + 45662, + 45665, + 45666, + 45667, + 45668, + 45669, + 45670, + 45671, + 45672, + 45673, + 45674, + 45675, + 45676, + 45677, + 45678, + 45679, + 45680, + 45681, + 45682, + 45684, + 45685, + 45686, + 45687, + 45688, + 45689, + 45690, + 45691, + 45692, + 45693, + 45694, + 45695, + 45696, + 45697, + 45698, + 45699, + 45701, + 45702, + 45704, + 45705, + 45706, + 45707, + 45708, + 45709, + 45710, + 45712, + 45713, + 45714, + 45715, + 45716, + 45717, + 45718, + 45719, + 45720, + 45721, + 45722, + 45723, + 45724, + 45725, + 45726, + 45728, + 45729, + 45730, + 45731, + 45732, + 45734, + 45735, + 45736, + 45737, + 45739, + 45740, + 45741, + 45742, + 45743, + 45744, + 45745, + 45746, + 45747, + 45748, + 45749, + 45750, + 45751, + 45752, + 45753, + 45754, + 45755, + 45756, + 45757, + 45758, + 45760, + 45761, + 45762, + 45763, + 45764, + 45765, + 45766, + 45767, + 45768, + 45770, + 45771, + 45772, + 45773, + 45774, + 45775, + 45776, + 45777, + 45778, + 45779, + 45780, + 45781, + 45782, + 45783, + 45784, + 45785, + 45786, + 45787, + 45788, + 45790, + 45791, + 45792, + 45793, + 45794, + 45795, + 45796, + 45797, + 45798, + 45799, + 45800, + 45801, + 45802, + 45803, + 45804, + 45805, + 45806, + 45807, + 45808, + 45809, + 45810, + 45811, + 45812, + 45813, + 45814, + 45815, + 45816, + 45817, + 45818, + 45819, + 45820, + 45821, + 45823, + 45824, + 45825, + 45826, + 45827, + 45828, + 45829, + 45830, + 45831, + 45832, + 45833, + 45834, + 45835, + 45836, + 45837, + 45838, + 45839, + 45840, + 45842, + 45843, + 45844, + 45845, + 45846, + 45847, + 45848, + 45849, + 45850, + 45851, + 45852, + 45853, + 45855, + 45856, + 45857, + 45858, + 45859, + 45860, + 45861, + 45862, + 45863, + 45864, + 45865, + 45866, + 45867, + 45868, + 45869, + 45870, + 45871, + 45872, + 45873, + 45874, + 45876, + 45877, + 45878, + 45879, + 45880, + 45881, + 45882, + 45883, + 45884, + 45885, + 45886, + 45887, + 45888, + 45889, + 45890, + 45891, + 45892, + 45893, + 45894, + 45895, + 45896, + 45897, + 45898, + 45899, + 45900, + 45901, + 45902, + 45904, + 45905, + 45906, + 45907, + 45908, + 45909, + 45910, + 45911, + 45912, + 45913, + 45914, + 45916, + 45917, + 45918, + 45919, + 45920, + 45921, + 45922, + 45924, + 45926, + 45927, + 45928, + 45929, + 45930, + 45931, + 45932, + 45933, + 45934, + 45935, + 45936, + 45937, + 45938, + 45939, + 45940, + 45941, + 45942, + 45943, + 45944, + 45945, + 45946, + 45947, + 45948, + 45949, + 45950, + 45951, + 45952, + 45953, + 45954, + 45955, + 45956, + 45957, + 45958, + 45959, + 45961, + 45962, + 45963, + 45964, + 45965, + 45966, + 45967, + 45968, + 45969, + 45970, + 45971, + 45972, + 45973, + 45974, + 45976, + 45977, + 45978, + 45979, + 45980, + 45981, + 45982, + 45983, + 45984, + 45985, + 45986, + 45987, + 45988, + 45990, + 45991, + 45992, + 45994, + 45995, + 45996, + 45997, + 45998, + 45999, + 46001, + 46002, + 46003, + 46004, + 46005, + 46006, + 46007, + 46008, + 46009, + 46010, + 46011, + 46012, + 46013, + 46014, + 46015, + 46016, + 46017, + 46018, + 46021, + 46022, + 46023, + 46024, + 46025, + 46026, + 46028, + 46029, + 46030, + 46031, + 46032, + 46033, + 46035, + 46036, + 46037, + 46039, + 46040, + 46041, + 46042, + 46043, + 46044, + 46046, + 46047, + 46048, + 46050, + 46051, + 46052, + 46053, + 46054, + 46055, + 46056, + 46058, + 46059, + 46060, + 46061, + 46062, + 46063, + 46064, + 46065, + 46066, + 46068, + 46069, + 46070, + 46071, + 46072, + 46073, + 46074, + 46075, + 46077, + 46078, + 46079, + 46080, + 46081, + 46082, + 46083, + 46084, + 46085, + 46086, + 46087, + 46088, + 46089, + 46090, + 46091, + 46093, + 46094, + 46095, + 46097, + 46098, + 46100, + 46101, + 46102, + 46103, + 46104, + 46105, + 46106, + 46108, + 46109, + 46110, + 46111, + 46112, + 46113, + 46114, + 46115, + 46116, + 46117, + 46119, + 46120, + 46121, + 46122, + 46123, + 46124, + 46125, + 46127, + 46128, + 46129, + 46130, + 46132, + 46134, + 46135, + 46136, + 46137, + 46138, + 46139, + 46140, + 46141, + 46142, + 46143, + 46144, + 46145, + 46146, + 46147, + 46148, + 46149, + 46150, + 46151, + 46152, + 46153, + 46154, + 46156, + 46157, + 46158, + 46159, + 46160, + 46161, + 46162, + 46163, + 46164, + 46165, + 46166, + 46167, + 46168, + 46169, + 46170, + 46171, + 46172, + 46173, + 46174, + 46175, + 46177, + 46178, + 46179, + 46180, + 46181, + 46182, + 46183, + 46184, + 46185, + 46186, + 46187, + 46188, + 46189, + 46190, + 46191, + 46192, + 46193, + 46194, + 46195, + 46196, + 46197, + 46198, + 46199, + 46200, + 46201, + 46202, + 46203, + 46204, + 46205, + 46206, + 46207, + 46208, + 46209, + 46210, + 46211, + 46212, + 46213, + 46214, + 46215, + 46216, + 46217, + 46218, + 46219, + 46220, + 46221, + 46222, + 46223, + 46225, + 46226, + 46227, + 46229, + 46230, + 46231, + 46234, + 46235, + 46238, + 46239, + 46240, + 46241, + 46242, + 46243, + 46244, + 46245, + 46246, + 46247, + 46248, + 46249, + 46250, + 46251, + 46252, + 46253, + 46254, + 46255, + 46256, + 46259, + 46260, + 46261, + 46262, + 46263, + 46265, + 46266, + 46267, + 46268, + 46269, + 46270, + 46271, + 46272, + 46273, + 46274, + 46275, + 46276, + 46277, + 46278, + 46280, + 46281, + 46282, + 46283, + 46284, + 46285, + 46286, + 46287, + 46288, + 46289, + 46290, + 46292, + 46293, + 46294, + 46295, + 46296, + 46297, + 46298, + 46299, + 46300, + 46301, + 46302, + 46303, + 46304, + 46305, + 46306, + 46307, + 46308, + 46309, + 46310, + 46311, + 46312, + 46313, + 46314, + 46315, + 46316, + 46317, + 46318, + 46319, + 46320, + 46321, + 46322, + 46323, + 46324, + 46325, + 46326, + 46327, + 46328, + 46329, + 46331, + 46332, + 46333, + 46334, + 46335, + 46336, + 46337, + 46338, + 46339, + 46340, + 46341, + 46342, + 46343, + 46344, + 46345, + 46346, + 46348, + 46349, + 46350, + 46351, + 46352, + 46353, + 46354, + 46355, + 46356, + 46358, + 46359, + 46360, + 46361, + 46362, + 46363, + 46364, + 46366, + 46367, + 46368, + 46369, + 46370, + 46371, + 46372, + 46373, + 46374, + 46375, + 46377, + 46378, + 46379, + 46380, + 46382, + 46383, + 46385, + 46386, + 46387, + 46388, + 46389, + 46390, + 46391, + 46392, + 46393, + 46394, + 46395, + 46396, + 46399, + 46400, + 46401, + 46402, + 46403, + 46404, + 46405, + 46406, + 46407, + 46408, + 46409, + 46410, + 46411, + 46412, + 46413, + 46415, + 46416, + 46417, + 46418, + 46419, + 46420, + 46421, + 46422, + 46423, + 46425, + 46426, + 46427, + 46428, + 46429, + 46430, + 46433, + 46434, + 46435, + 46436, + 46437, + 46438, + 46439, + 46440, + 46441, + 46444, + 46445, + 46446, + 46447, + 46448, + 46449, + 46450, + 46451, + 46452, + 46453, + 46454, + 46455, + 46457, + 46458, + 46459, + 46460, + 46461, + 46463, + 46464, + 46465, + 46466, + 46468, + 46469, + 46470, + 46471, + 46472, + 46473, + 46474, + 46475, + 46476, + 46477, + 46478, + 46479, + 46481, + 46482, + 46483, + 46484, + 46485, + 46486, + 46487, + 46488, + 46489, + 46490, + 46491, + 46492, + 46493, + 46494, + 46495, + 46496, + 46497, + 46498, + 46499, + 46500, + 46501, + 46502, + 46503, + 46505, + 46506, + 46507, + 46508, + 46509, + 46510, + 46511, + 46512, + 46513, + 46514, + 46515, + 46516, + 46517, + 46518, + 46519, + 46520, + 46521, + 46522, + 46523, + 46527, + 46528, + 46530, + 46531, + 46533, + 46534, + 46535, + 46536, + 46537, + 46538, + 46539, + 46540, + 46541, + 46542, + 46543, + 46544, + 46545, + 46546, + 46547, + 46548, + 46549, + 46550, + 46552, + 46553, + 46554, + 46555, + 46556, + 46557, + 46558, + 46559, + 46560, + 46561, + 46562, + 46563, + 46564, + 46565, + 46566, + 46567, + 46568, + 46569, + 46570, + 46571, + 46572, + 46574, + 46575, + 46576, + 46577, + 46578, + 46579, + 46580, + 46581, + 46582, + 46583, + 46584, + 46585, + 46586, + 46587, + 46588, + 46589, + 46590, + 46591, + 46592, + 46593, + 46595, + 46597, + 46598, + 46599, + 46600, + 46601, + 46602, + 46604, + 46605, + 46606, + 46607, + 46608, + 46609, + 46610, + 46611, + 46612, + 46614, + 46615, + 46616, + 46617, + 46618, + 46619, + 46620, + 46621, + 46622, + 46623, + 46624, + 46625, + 46626, + 46627, + 46628, + 46629, + 46630, + 46631, + 46632, + 46633, + 46634, + 46635, + 46636, + 46638, + 46639, + 46640, + 46641, + 46642, + 46644, + 46646, + 46648, + 46649, + 46651, + 46652, + 46653, + 46654, + 46655, + 46656, + 46657, + 46658, + 46659, + 46661, + 46662, + 46664, + 46666, + 46668, + 46669, + 46670, + 46671, + 46673, + 46674, + 46675, + 46677, + 46678, + 46679, + 46680, + 46681, + 46682, + 46683, + 46684, + 46685, + 46686, + 46687, + 46688, + 46689, + 46690, + 46691, + 46692, + 46693, + 46694, + 46696, + 46697, + 46698, + 46699, + 46700, + 46701, + 46702, + 46703, + 46704, + 46705, + 46706, + 46707, + 46708, + 46709, + 46710, + 46711, + 46712, + 46713, + 46714, + 46716, + 46717, + 46718, + 46719, + 46721, + 46722, + 46723, + 46724, + 46725, + 46726, + 46727, + 46728, + 46729, + 46730, + 46731, + 46732, + 46733, + 46734, + 46735, + 46736, + 46737, + 46738, + 46739, + 46740, + 46741, + 46742, + 46743, + 46744, + 46745, + 46746, + 46747, + 46748, + 46749, + 46750, + 46751, + 46752, + 46755, + 46756, + 46759, + 46760, + 46762, + 46763, + 46764, + 46765, + 46766, + 46767, + 46768, + 46769, + 46770, + 46771, + 46772, + 46773, + 46774, + 46775, + 46776, + 46778, + 46779, + 46781, + 46782, + 46783, + 46785, + 46786, + 46787, + 46788, + 46789, + 46790, + 46791, + 46792, + 46793, + 46794, + 46795, + 46796, + 46797, + 46799, + 46800, + 46801, + 46802, + 46803, + 46804, + 46806, + 46807, + 46809, + 46810, + 46811, + 46812, + 46813, + 46814, + 46816, + 46817, + 46818, + 46819, + 46820, + 46821, + 46822, + 46823, + 46824, + 46825, + 46826, + 46827, + 46828, + 46829, + 46830, + 46831, + 46832, + 46833, + 46834, + 46835, + 46836, + 46837, + 46838, + 46839, + 46841, + 46842, + 46843, + 46844, + 46845, + 46846, + 46847, + 46848, + 46849, + 46850, + 46851, + 46852, + 46853, + 46854, + 46855, + 46856, + 46857, + 46858, + 46859, + 46860, + 46861, + 46862, + 46863, + 46864, + 46865, + 46866, + 46867, + 46868, + 46869, + 46870, + 46871, + 46872, + 46873, + 46874, + 46875, + 46876, + 46877, + 46878, + 46879, + 46881, + 46882, + 46883, + 46885, + 46886, + 46887, + 46888, + 46889, + 46890, + 46891, + 46892, + 46893, + 46894, + 46895, + 46896, + 46897, + 46898, + 46899, + 46901, + 46902, + 46903, + 46904, + 46906, + 46907, + 46908, + 46909, + 46910, + 46911, + 46912, + 46913, + 46915, + 46916, + 46917, + 46918, + 46920, + 46921, + 46922, + 46924, + 46925, + 46926, + 46927, + 46929, + 46930, + 46931, + 46932, + 46933, + 46934, + 46936, + 46937, + 46938, + 46939, + 46941, + 46942, + 46943, + 46944, + 46945, + 46946, + 46947, + 46948, + 46950, + 46951, + 46953, + 46954, + 46955, + 46956, + 46957, + 46958, + 46959, + 46960, + 46961, + 46962, + 46963, + 46964, + 46965, + 46966, + 46967, + 46969, + 46970, + 46971, + 46972, + 46973, + 46974, + 46975, + 46976, + 46977, + 46978, + 46979, + 46980, + 46981, + 46982, + 46983, + 46984, + 46985, + 46986, + 46987, + 46988, + 46990, + 46991, + 46992, + 46993, + 46994, + 46995, + 46996, + 46997, + 46998, + 46999, + 47000, + 47001, + 47002, + 47003, + 47004, + 47005, + 47006, + 47007, + 47008, + 47009, + 47011, + 47012, + 47013, + 47014, + 47015, + 47016, + 47017, + 47018, + 47019, + 47020, + 47021, + 47022, + 47023, + 47024, + 47025, + 47026, + 47027, + 47028, + 47029, + 47030, + 47031, + 47032, + 47033, + 47034, + 47035, + 47036, + 47037, + 47038, + 47039, + 47040, + 47041, + 47042, + 47043, + 47044, + 47045, + 47046, + 47047, + 47048, + 47049, + 47050, + 47051, + 47052, + 47053, + 47055, + 47057, + 47058, + 47059, + 47060, + 47061, + 47062, + 47063, + 47064, + 47066, + 47067, + 47068, + 47069, + 47070, + 47071, + 47072, + 47073, + 47074, + 47075, + 47076, + 47077, + 47079, + 47080, + 47081, + 47082, + 47083, + 47084, + 47085, + 47086, + 47087, + 47088, + 47089, + 47090, + 47092, + 47093, + 47094, + 47095, + 47096, + 47097, + 47098, + 47099, + 47100, + 47101, + 47102, + 47103, + 47104, + 47105, + 47106, + 47107, + 47108, + 47109, + 47110, + 47111, + 47112, + 47114, + 47116, + 47117, + 47118, + 47119, + 47120, + 47121, + 47122, + 47124, + 47125, + 47126, + 47127, + 47128, + 47129, + 47130, + 47131, + 47133, + 47134, + 47135, + 47136, + 47137, + 47138, + 47139, + 47140, + 47141, + 47142, + 47143, + 47144, + 47145, + 47146, + 47147, + 47148, + 47149, + 47150, + 47151, + 47152, + 47153, + 47154, + 47155, + 47156, + 47157, + 47158, + 47159, + 47160, + 47161, + 47162, + 47163, + 47164, + 47165, + 47166, + 47167, + 47169, + 47171, + 47172, + 47173, + 47174, + 47175, + 47176, + 47179, + 47180, + 47181, + 47182, + 47183, + 47184, + 47185, + 47186, + 47188, + 47189, + 47190, + 47191, + 47192, + 47193, + 47194, + 47195, + 47196, + 47197, + 47199, + 47200, + 47201, + 47202, + 47203, + 47204, + 47205, + 47207, + 47208, + 47209, + 47210, + 47211, + 47212, + 47214, + 47215, + 47216, + 47217, + 47218, + 47220, + 47221, + 47222, + 47223, + 47224, + 47225, + 47226, + 47227, + 47228, + 47229, + 47230, + 47231, + 47232, + 47233, + 47234, + 47236, + 47237, + 47238, + 47239, + 47240, + 47241, + 47242, + 47243, + 47244, + 47245, + 47246, + 47247, + 47248, + 47249, + 47252, + 47253, + 47254, + 47255, + 47256, + 47257, + 47258, + 47259, + 47260, + 47261, + 47262, + 47263, + 47264, + 47266, + 47267, + 47268, + 47269, + 47270, + 47271, + 47272, + 47273, + 47274, + 47275, + 47276, + 47277, + 47278, + 47279, + 47281, + 47282, + 47283, + 47284, + 47285, + 47286, + 47287, + 47288, + 47289, + 47291, + 47292, + 47293, + 47295, + 47296, + 47297, + 47298, + 47299, + 47300, + 47301, + 47302, + 47303, + 47305, + 47306, + 47307, + 47308, + 47309, + 47310, + 47311, + 47312, + 47313, + 47314, + 47315, + 47316, + 47317, + 47318, + 47319, + 47320, + 47321, + 47322, + 47323, + 47324, + 47325, + 47326, + 47327, + 47329, + 47330, + 47331, + 47332, + 47333, + 47334, + 47335, + 47336, + 47337, + 47338, + 47339, + 47340, + 47341, + 47342, + 47343, + 47344, + 47345, + 47346, + 47347, + 47348, + 47349, + 47351, + 47352, + 47353, + 47354, + 47355, + 47356, + 47357, + 47358, + 47359, + 47360, + 47361, + 47362, + 47363, + 47364, + 47365, + 47366, + 47367, + 47368, + 47369, + 47370, + 47371, + 47372, + 47373, + 47374, + 47375, + 47377, + 47378, + 47379, + 47380, + 47381, + 47382, + 47383, + 47384, + 47386, + 47387, + 47389, + 47390, + 47391, + 47392, + 47393, + 47394, + 47395, + 47396, + 47397, + 47398, + 47399, + 47400, + 47401, + 47402, + 47403, + 47404, + 47405, + 47406, + 47407, + 47408, + 47409, + 47411, + 47412, + 47413, + 47414, + 47415, + 47417, + 47418, + 47419, + 47420, + 47421, + 47422, + 47423, + 47424, + 47425, + 47426, + 47427, + 47429, + 47430, + 47431, + 47432, + 47433, + 47434, + 47435, + 47436, + 47437, + 47438, + 47439, + 47440, + 47442, + 47444, + 47445, + 47446, + 47448, + 47451, + 47452, + 47453, + 47455, + 47457, + 47458, + 47459, + 47460, + 47461, + 47462, + 47463, + 47464, + 47465, + 47466, + 47469, + 47470, + 47471, + 47472, + 47473, + 47474, + 47475, + 47476, + 47477, + 47478, + 47479, + 47480, + 47481, + 47483, + 47484, + 47485, + 47486, + 47487, + 47488, + 47489, + 47490, + 47491, + 47492, + 47493, + 47494, + 47495, + 47496, + 47497, + 47498, + 47499, + 47500, + 47501, + 47502, + 47503, + 47504, + 47505, + 47506, + 47507, + 47509, + 47510, + 47511, + 47512, + 47513, + 47514, + 47515, + 47517, + 47518, + 47519, + 47520, + 47521, + 47522, + 47523, + 47524, + 47525, + 47527, + 47528, + 47529, + 47530, + 47531, + 47532, + 47535, + 47536, + 47537, + 47538, + 47539, + 47540, + 47541, + 47542, + 47543, + 47544, + 47545, + 47546, + 47547, + 47548, + 47549, + 47550, + 47551, + 47552, + 47553, + 47554, + 47555, + 47556, + 47557, + 47558, + 47559, + 47560, + 47561, + 47562, + 47563, + 47564, + 47565, + 47566, + 47567, + 47568, + 47569, + 47570, + 47571, + 47572, + 47573, + 47574, + 47575, + 47576, + 47577, + 47578, + 47579, + 47580, + 47581, + 47582, + 47583, + 47584, + 47585, + 47586, + 47587, + 47588, + 47589, + 47590, + 47591, + 47592, + 47593, + 47594, + 47595, + 47596, + 47597, + 47599, + 47601, + 47602, + 47603, + 47604, + 47606, + 47607, + 47608, + 47609, + 47610, + 47611, + 47612, + 47613, + 47614, + 47615, + 47616, + 47617, + 47618, + 47620, + 47621, + 47622, + 47623, + 47626, + 47627, + 47628, + 47629, + 47630, + 47631, + 47632, + 47633, + 47634, + 47635, + 47637, + 47638, + 47639, + 47641, + 47642, + 47643, + 47644, + 47645, + 47646, + 47647, + 47648, + 47650, + 47651, + 47652, + 47653, + 47654, + 47655, + 47656, + 47657, + 47659, + 47661, + 47662, + 47663, + 47664, + 47665, + 47666, + 47667, + 47668, + 47671, + 47672, + 47673, + 47674, + 47675, + 47676, + 47677, + 47678, + 47679, + 47680, + 47681, + 47682, + 47683, + 47684, + 47686, + 47687, + 47688, + 47689, + 47690, + 47691, + 47692, + 47693, + 47694, + 47695, + 47696, + 47697, + 47698, + 47699, + 47700, + 47701, + 47702, + 47704, + 47705, + 47706, + 47707, + 47708, + 47709, + 47710, + 47712, + 47713, + 47714, + 47715, + 47716, + 47717, + 47718, + 47719, + 47720, + 47721, + 47722, + 47723, + 47724, + 47725, + 47726, + 47727, + 47728, + 47729, + 47730, + 47732, + 47733, + 47734, + 47735, + 47736, + 47738, + 47739, + 47741, + 47742, + 47743, + 47744, + 47745, + 47746, + 47747, + 47748, + 47749, + 47750, + 47751, + 47752, + 47753, + 47754, + 47755, + 47756, + 47757, + 47758, + 47759, + 47760, + 47761, + 47762, + 47763, + 47764, + 47765, + 47766, + 47767, + 47768, + 47769, + 47770, + 47771, + 47772, + 47773, + 47774, + 47775, + 47776, + 47777, + 47778, + 47779, + 47781, + 47782, + 47783, + 47784, + 47785, + 47786, + 47787, + 47788, + 47789, + 47790, + 47791, + 47792, + 47793, + 47794, + 47795, + 47796, + 47797, + 47798, + 47799, + 47800, + 47801, + 47803, + 47804, + 47805, + 47806, + 47807, + 47808, + 47810, + 47811, + 47813, + 47814, + 47815, + 47816, + 47817, + 47818, + 47819, + 47820, + 47821, + 47822, + 47823, + 47824, + 47825, + 47826, + 47827, + 47828, + 47829, + 47830, + 47831, + 47832, + 47833, + 47834, + 47835, + 47837, + 47838, + 47839, + 47840, + 47841, + 47843, + 47845, + 47846, + 47847, + 47848, + 47849, + 47850, + 47851, + 47852, + 47854, + 47855, + 47856, + 47857, + 47858, + 47859, + 47861, + 47862, + 47863, + 47864, + 47865, + 47866, + 47867, + 47868, + 47869, + 47870, + 47871, + 47872, + 47875, + 47876, + 47877, + 47878, + 47879, + 47880, + 47881, + 47882, + 47883, + 47884, + 47885, + 47886, + 47887, + 47888, + 47889, + 47890, + 47891, + 47893, + 47894, + 47895, + 47896, + 47897, + 47899, + 47900, + 47901, + 47902, + 47903, + 47904, + 47905, + 47907, + 47908, + 47909, + 47912, + 47913, + 47915, + 47916, + 47917, + 47918, + 47919, + 47920, + 47921, + 47922, + 47923, + 47924, + 47925, + 47926, + 47927, + 47928, + 47929, + 47930, + 47931, + 47932, + 47933, + 47934, + 47935, + 47936, + 47937, + 47938, + 47939, + 47940, + 47941, + 47942, + 47943, + 47944, + 47945, + 47946, + 47947, + 47948, + 47949, + 47950, + 47951, + 47953, + 47955, + 47956, + 47957, + 47958, + 47960, + 47961, + 47962, + 47963, + 47964, + 47965, + 47966, + 47967, + 47968, + 47969, + 47970, + 47971, + 47972, + 47973, + 47975, + 47977, + 47978, + 47979, + 47980, + 47981, + 47982, + 47983, + 47984, + 47985, + 47986, + 47987, + 47988, + 47990, + 47991, + 47992, + 47993, + 47994, + 47995, + 47996, + 47997, + 47998, + 48000, + 48001, + 48002, + 48003, + 48004, + 48005, + 48006, + 48007, + 48008, + 48009, + 48010, + 48011, + 48012, + 48013, + 48014, + 48015, + 48016, + 48017, + 48018, + 48019, + 48021, + 48022, + 48023, + 48024, + 48025, + 48026, + 48027, + 48029, + 48030, + 48031, + 48032, + 48033, + 48034, + 48035, + 48036, + 48037, + 48038, + 48039, + 48040, + 48041, + 48043, + 48044, + 48045, + 48046, + 48047, + 48048, + 48049, + 48050, + 48051, + 48052, + 48053, + 48054, + 48055, + 48056, + 48057, + 48058, + 48060, + 48061, + 48062, + 48063, + 48064, + 48065, + 48066, + 48067, + 48068, + 48069, + 48070, + 48072, + 48073, + 48074, + 48075, + 48076, + 48077, + 48078, + 48079, + 48080, + 48081, + 48082, + 48083, + 48084, + 48085, + 48086, + 48087, + 48088, + 48089, + 48090, + 48091, + 48092, + 48093, + 48094, + 48095, + 48096, + 48097, + 48098, + 48099, + 48100, + 48101, + 48102, + 48103, + 48104, + 48105, + 48106, + 48107, + 48109, + 48110, + 48111, + 48112, + 48114, + 48115, + 48116, + 48117, + 48118, + 48119, + 48120, + 48121, + 48122, + 48124, + 48125, + 48126, + 48127, + 48128, + 48129, + 48130, + 48131, + 48132, + 48133, + 48134, + 48135, + 48136, + 48137, + 48138, + 48139, + 48140, + 48141, + 48142, + 48143, + 48144, + 48145, + 48146, + 48147, + 48148, + 48149, + 48151, + 48152, + 48153, + 48154, + 48155, + 48156, + 48157, + 48158, + 48160, + 48161, + 48162, + 48163, + 48164, + 48166, + 48167, + 48168, + 48169, + 48172, + 48173, + 48174, + 48175, + 48176, + 48177, + 48178, + 48179, + 48181, + 48182, + 48183, + 48184, + 48185, + 48186, + 48187, + 48189, + 48190, + 48192, + 48193, + 48194, + 48195, + 48196, + 48197, + 48198, + 48199, + 48201, + 48202, + 48203, + 48204, + 48205, + 48206, + 48207, + 48208, + 48210, + 48211, + 48212, + 48213, + 48214, + 48215, + 48216, + 48217, + 48218, + 48219, + 48220, + 48221, + 48222, + 48223, + 48224, + 48226, + 48227, + 48228, + 48230, + 48231, + 48232, + 48233, + 48234, + 48235, + 48236, + 48237, + 48238, + 48239, + 48240, + 48241, + 48242, + 48243, + 48245, + 48246, + 48247, + 48248, + 48249, + 48250, + 48251, + 48252, + 48253, + 48254, + 48255, + 48256, + 48257, + 48258, + 48259, + 48260, + 48262, + 48263, + 48264, + 48265, + 48266, + 48267, + 48268, + 48270, + 48271, + 48272, + 48273, + 48274, + 48275, + 48276, + 48277, + 48278, + 48279, + 48280, + 48281, + 48282, + 48284, + 48285, + 48286, + 48287, + 48288, + 48289, + 48290, + 48291, + 48292, + 48293, + 48294, + 48295, + 48296, + 48297, + 48298, + 48299, + 48301, + 48302, + 48303, + 48304, + 48305, + 48306, + 48307, + 48309, + 48310, + 48311, + 48313, + 48314, + 48315, + 48316, + 48318, + 48319, + 48320, + 48321, + 48322, + 48323, + 48324, + 48325, + 48326, + 48328, + 48329, + 48330, + 48331, + 48332, + 48333, + 48334, + 48335, + 48336, + 48337, + 48338, + 48339, + 48341, + 48342, + 48343, + 48344, + 48345, + 48346, + 48347, + 48348, + 48349, + 48350, + 48351, + 48352, + 48353, + 48354, + 48355, + 48356, + 48357, + 48358, + 48359, + 48360, + 48361, + 48362, + 48363, + 48364, + 48365, + 48366, + 48367, + 48368, + 48369, + 48370, + 48371, + 48372, + 48373, + 48374, + 48375, + 48376, + 48377, + 48378, + 48379, + 48380, + 48381, + 48383, + 48385, + 48386, + 48387, + 48388, + 48389, + 48390, + 48391, + 48392, + 48393, + 48394, + 48395, + 48396, + 48397, + 48399, + 48400, + 48401, + 48402, + 48403, + 48404, + 48405, + 48406, + 48407, + 48408, + 48409, + 48411, + 48412, + 48413, + 48414, + 48415, + 48416, + 48417, + 48418, + 48419, + 48420, + 48421, + 48422, + 48423, + 48424, + 48425, + 48426, + 48427, + 48428, + 48429, + 48430, + 48431, + 48432, + 48434, + 48435, + 48436, + 48438, + 48439, + 48440, + 48442, + 48443, + 48444, + 48445, + 48446, + 48448, + 48449, + 48450, + 48451, + 48453, + 48454, + 48455, + 48456, + 48457, + 48459, + 48460, + 48461, + 48462, + 48463, + 48464, + 48465, + 48466, + 48467, + 48468, + 48469, + 48470, + 48471, + 48473, + 48474, + 48475, + 48476, + 48477, + 48479, + 48480, + 48481, + 48483, + 48484, + 48486, + 48487, + 48488, + 48489, + 48490, + 48491, + 48492, + 48493, + 48494, + 48495, + 48496, + 48497, + 48498, + 48499, + 48500, + 48501, + 48502, + 48503, + 48504, + 48505, + 48506, + 48507, + 48508, + 48509, + 48510, + 48511, + 48512, + 48513, + 48514, + 48515, + 48516, + 48517, + 48518, + 48520, + 48521, + 48522, + 48523, + 48524, + 48525, + 48526, + 48527, + 48528, + 48529, + 48530, + 48532, + 48534, + 48535, + 48536, + 48537, + 48538, + 48539, + 48540, + 48541, + 48542, + 48543, + 48544, + 48545, + 48546, + 48547, + 48549, + 48550, + 48551, + 48552, + 48553, + 48554, + 48556, + 48557, + 48558, + 48559, + 48560, + 48561, + 48562, + 48564, + 48565, + 48566, + 48567, + 48568, + 48570, + 48571, + 48572, + 48573, + 48574, + 48575, + 48576, + 48577, + 48578, + 48579, + 48581, + 48582, + 48583, + 48584, + 48585, + 48586, + 48587, + 48588, + 48589, + 48591, + 48592, + 48593, + 48594, + 48595, + 48596, + 48597, + 48598, + 48599, + 48600, + 48601, + 48602, + 48603, + 48604, + 48605, + 48606, + 48607, + 48608, + 48609, + 48610, + 48611, + 48612, + 48613, + 48614, + 48615, + 48616, + 48617, + 48618, + 48619, + 48620, + 48621, + 48622, + 48623, + 48624, + 48625, + 48626, + 48627, + 48629, + 48630, + 48631, + 48632, + 48633, + 48634, + 48635, + 48636, + 48637, + 48638, + 48639, + 48640, + 48641, + 48642, + 48643, + 48644, + 48645, + 48646, + 48647, + 48648, + 48650, + 48651, + 48652, + 48653, + 48654, + 48655, + 48656, + 48657, + 48658, + 48659, + 48660, + 48661, + 48662, + 48663, + 48664, + 48665, + 48666, + 48667, + 48668, + 48669, + 48670, + 48671, + 48672, + 48673, + 48674, + 48675, + 48676, + 48677, + 48678, + 48679, + 48680, + 48681, + 48683, + 48684, + 48685, + 48686, + 48687, + 48688, + 48689, + 48690, + 48691, + 48692, + 48693, + 48694, + 48695, + 48696, + 48697, + 48698, + 48699, + 48700, + 48701, + 48702, + 48703, + 48704, + 48706, + 48707, + 48708, + 48709, + 48710, + 48711, + 48712, + 48713, + 48715, + 48716, + 48717, + 48718, + 48719, + 48720, + 48721, + 48722, + 48723, + 48724, + 48725, + 48726, + 48727, + 48728, + 48729, + 48730, + 48731, + 48732, + 48734, + 48735, + 48736, + 48737, + 48738, + 48739, + 48740, + 48741, + 48742, + 48743, + 48744, + 48745, + 48746, + 48747, + 48748, + 48749, + 48750, + 48751, + 48752, + 48753, + 48756, + 48757, + 48758, + 48759, + 48760, + 48761, + 48764, + 48765, + 48766, + 48767, + 48769, + 48770, + 48771, + 48772, + 48773, + 48775, + 48776, + 48777, + 48778, + 48780, + 48781, + 48782, + 48783, + 48784, + 48785, + 48786, + 48787, + 48788, + 48789, + 48790, + 48791, + 48792, + 48793, + 48794, + 48795, + 48796, + 48797, + 48798, + 48800, + 48801, + 48802, + 48803, + 48804, + 48805, + 48806, + 48807, + 48808, + 48809, + 48810, + 48811, + 48812, + 48813, + 48814, + 48815, + 48816, + 48817, + 48819, + 48820, + 48822, + 48823, + 48824, + 48825, + 48826, + 48827, + 48828, + 48829, + 48830, + 48831, + 48832, + 48833, + 48834, + 48835, + 48836, + 48837, + 48838, + 48839, + 48840, + 48841, + 48842, + 48843, + 48844, + 48845, + 48846, + 48847, + 48848, + 48849, + 48850, + 48851, + 48852, + 48853, + 48854, + 48855, + 48856, + 48857, + 48858, + 48859, + 48860, + 48861, + 48862, + 48863, + 48864, + 48867, + 48868, + 48869, + 48870, + 48871, + 48872, + 48873, + 48874, + 48875, + 48876, + 48877, + 48878, + 48879, + 48880, + 48881, + 48882, + 48883, + 48884, + 48885, + 48886, + 48887, + 48888, + 48889, + 48890, + 48891, + 48892, + 48893, + 48894, + 48895, + 48896, + 48897, + 48898, + 48899, + 48900, + 48902, + 48903, + 48904, + 48905, + 48906, + 48907, + 48908, + 48909, + 48910, + 48911, + 48912, + 48913, + 48915, + 48916, + 48918, + 48919, + 48920, + 48921, + 48922, + 48923, + 48924, + 48925, + 48926, + 48927, + 48928, + 48929, + 48930, + 48931, + 48932, + 48934, + 48935, + 48936, + 48937, + 48938, + 48939, + 48940, + 48941, + 48942, + 48943, + 48944, + 48945, + 48946, + 48947, + 48949, + 48950, + 48951, + 48952, + 48954, + 48955, + 48956, + 48958, + 48959, + 48960, + 48961, + 48962, + 48964, + 48965, + 48966, + 48967, + 48968, + 48969, + 48970, + 48971, + 48972, + 48973, + 48974, + 48975, + 48976, + 48977, + 48978, + 48979, + 48980, + 48982, + 48983, + 48984, + 48985, + 48986, + 48987, + 48988, + 48989, + 48990, + 48991, + 48992, + 48993, + 48994, + 48995, + 48996, + 48997, + 48998, + 48999, + 49000, + 49001, + 49002, + 49003, + 49004, + 49005, + 49006, + 49007, + 49008, + 49009, + 49010, + 49011, + 49012, + 49013, + 49014, + 49015, + 49016, + 49017, + 49018, + 49019, + 49020, + 49021, + 49022, + 49023, + 49024, + 49025, + 49027, + 49028, + 49029, + 49030, + 49032, + 49033, + 49034, + 49036, + 49037, + 49038, + 49039, + 49040, + 49041, + 49042, + 49043, + 49044, + 49045, + 49046, + 49047, + 49048, + 49049, + 49050, + 49051, + 49052, + 49053, + 49054, + 49055, + 49056, + 49057, + 49058, + 49059, + 49060, + 49061, + 49062, + 49063, + 49065, + 49066, + 49067, + 49068, + 49069, + 49070, + 49071, + 49072, + 49073, + 49074, + 49075, + 49076, + 49077, + 49078, + 49079, + 49080, + 49081, + 49082, + 49083, + 49084, + 49085, + 49086, + 49087, + 49088, + 49089, + 49091, + 49092, + 49093, + 49094, + 49095, + 49096, + 49097, + 49098, + 49099, + 49100, + 49101, + 49102, + 49103, + 49105, + 49106, + 49108, + 49109, + 49110, + 49111, + 49112, + 49113, + 49114, + 49115, + 49116, + 49117, + 49118, + 49119, + 49120, + 49121, + 49122, + 49123, + 49124, + 49125, + 49126, + 49127, + 49128, + 49129, + 49130, + 49131, + 49132, + 49133, + 49134, + 49135, + 49136, + 49137, + 49138, + 49139, + 49141, + 49142, + 49143, + 49144, + 49146, + 49147, + 49148, + 49149, + 49150, + 49151, + 49152, + 49153, + 49154, + 49155, + 49156, + 49157, + 49158, + 49159, + 49160, + 49161, + 49162, + 49163, + 49164, + 49165, + 49166, + 49168, + 49169, + 49170, + 49171, + 49172, + 49173, + 49174, + 49175, + 49176, + 49177, + 49178, + 49180, + 49182, + 49183, + 49184, + 49185, + 49186, + 49187, + 49188, + 49189, + 49191, + 49192, + 49193, + 49194, + 49195, + 49196, + 49197, + 49198, + 49200, + 49201, + 49202, + 49203, + 49204, + 49205, + 49206, + 49207, + 49208, + 49209, + 49210, + 49211, + 49212, + 49213, + 49215, + 49216, + 49217, + 49218, + 49219, + 49220, + 49221, + 49222, + 49223, + 49224, + 49225, + 49226, + 49227, + 49228, + 49229, + 49230, + 49231, + 49232, + 49233, + 49234, + 49235, + 49236, + 49237, + 49238, + 49239, + 49240, + 49241, + 49242, + 49243, + 49244, + 49245, + 49246, + 49247, + 49248, + 49249, + 49250, + 49251, + 49253, + 49254, + 49255, + 49256, + 49257, + 49258, + 49259, + 49260, + 49262, + 49263, + 49264, + 49265, + 49266, + 49267, + 49268, + 49269, + 49270, + 49271, + 49272, + 49273, + 49274, + 49275, + 49276, + 49277, + 49278, + 49279, + 49280, + 49281, + 49282, + 49283, + 49284, + 49285, + 49286, + 49287, + 49288, + 49289, + 49290, + 49291, + 49292, + 49293, + 49294, + 49295, + 49296, + 49297, + 49298, + 49299, + 49300, + 49301, + 49303, + 49305, + 49306, + 49307, + 49308, + 49309, + 49310, + 49311, + 49312, + 49314, + 49315, + 49316, + 49317, + 49318, + 49319, + 49320, + 49321, + 49322, + 49323, + 49324, + 49325, + 49326, + 49327, + 49328, + 49329, + 49330, + 49331, + 49333, + 49334, + 49335, + 49338, + 49339, + 49340, + 49341, + 49342, + 49343, + 49344, + 49345, + 49346, + 49347, + 49348, + 49349, + 49350, + 49351, + 49352, + 49353, + 49354, + 49355, + 49356, + 49357, + 49358, + 49359, + 49360, + 49361, + 49362, + 49363, + 49364, + 49365, + 49366, + 49367, + 49368, + 49369, + 49370, + 49371, + 49372, + 49373, + 49375, + 49376, + 49377, + 49378, + 49379, + 49380, + 49381, + 49382, + 49383, + 49384, + 49385, + 49387, + 49388, + 49389, + 49390, + 49391, + 49392, + 49393, + 49394, + 49395, + 49396, + 49397, + 49400, + 49401, + 49402, + 49403, + 49404, + 49405, + 49406, + 49407, + 49408, + 49409, + 49410, + 49411, + 49412, + 49413, + 49414, + 49415, + 49416, + 49418, + 49420, + 49421, + 49422, + 49423, + 49424, + 49425, + 49426, + 49427, + 49428, + 49429, + 49430, + 49431, + 49432, + 49433, + 49434, + 49435, + 49436, + 49437, + 49438, + 49439, + 49440, + 49441, + 49442, + 49443, + 49444, + 49446, + 49447, + 49448, + 49449, + 49450, + 49451, + 49452, + 49453, + 49454, + 49455, + 49456, + 49457, + 49458, + 49459, + 49460, + 49461, + 49463, + 49464, + 49465, + 49466, + 49467, + 49468, + 49469, + 49471, + 49472, + 49474, + 49475, + 49477, + 49478, + 49479, + 49480, + 49481, + 49482, + 49483, + 49484, + 49485, + 49487, + 49488, + 49489, + 49490, + 49491, + 49492, + 49493, + 49494, + 49495, + 49496, + 49497, + 49498, + 49499, + 49500, + 49501, + 49502, + 49503, + 49504, + 49505, + 49506, + 49507, + 49508, + 49509, + 49510, + 49511, + 49512, + 49513, + 49514, + 49515, + 49516, + 49517, + 49518, + 49519, + 49520, + 49521, + 49522, + 49523, + 49524, + 49525, + 49526, + 49527, + 49528, + 49529, + 49530, + 49531, + 49532, + 49533, + 49534, + 49535, + 49536, + 49537, + 49539, + 49540, + 49541, + 49542, + 49543, + 49544, + 49545, + 49546, + 49547, + 49549, + 49550, + 49551, + 49552, + 49553, + 49555, + 49556, + 49557, + 49558, + 49559, + 49560, + 49561, + 49562, + 49563, + 49564, + 49565, + 49566, + 49567, + 49568, + 49569, + 49570, + 49571, + 49572, + 49573, + 49574, + 49575, + 49576, + 49577, + 49578, + 49579, + 49580, + 49581, + 49582, + 49583, + 49584, + 49585, + 49586, + 49587, + 49588, + 49589, + 49590, + 49591, + 49592, + 49593, + 49594, + 49595, + 49596, + 49597, + 49598, + 49599, + 49600, + 49601, + 49602, + 49603, + 49604, + 49605, + 49606, + 49608, + 49609, + 49610, + 49611, + 49612, + 49613, + 49614, + 49615, + 49616, + 49617, + 49618, + 49619, + 49620, + 49622, + 49623, + 49625, + 49626, + 49627, + 49628, + 49629, + 49630, + 49631, + 49632, + 49633, + 49634, + 49635, + 49637, + 49638, + 49639, + 49642, + 49643, + 49644, + 49645, + 49646, + 49647, + 49648, + 49649, + 49650, + 49651, + 49652, + 49653, + 49654, + 49655, + 49658, + 49659, + 49660, + 49661, + 49662, + 49663, + 49664, + 49665, + 49666, + 49667, + 49668, + 49669, + 49670, + 49671, + 49672, + 49673, + 49675, + 49677, + 49678, + 49679, + 49680, + 49681, + 49682, + 49683, + 49684, + 49685, + 49686, + 49687, + 49689, + 49690, + 49691, + 49692, + 49693, + 49694, + 49695, + 49696, + 49697, + 49698, + 49699, + 49700, + 49701, + 49702, + 49703, + 49704, + 49706, + 49707, + 49708, + 49709, + 49710, + 49711, + 49712, + 49713, + 49714, + 49715, + 49716, + 49717, + 49718, + 49719, + 49720, + 49721, + 49723, + 49724, + 49725, + 49726, + 49727, + 49728, + 49729, + 49730, + 49731, + 49732, + 49733, + 49734, + 49735, + 49736, + 49737, + 49738, + 49739, + 49740, + 49741, + 49742, + 49743, + 49744, + 49745, + 49746, + 49747, + 49748, + 49749, + 49752, + 49753, + 49754, + 49755, + 49756, + 49757, + 49758, + 49759, + 49760, + 49761, + 49762, + 49763, + 49765, + 49766, + 49767, + 49768, + 49769, + 49771, + 49772, + 49774, + 49775, + 49776, + 49777, + 49778, + 49779, + 49780, + 49781, + 49782, + 49783, + 49785, + 49786, + 49787, + 49789, + 49790, + 49791, + 49792, + 49793, + 49795, + 49796, + 49797, + 49798, + 49799, + 49800, + 49801, + 49802, + 49803, + 49804, + 49805, + 49806, + 49807, + 49808, + 49809, + 49811, + 49812, + 49813, + 49814, + 49815, + 49816, + 49817, + 49818, + 49819, + 49820, + 49821, + 49822, + 49823, + 49824, + 49825, + 49826, + 49827, + 49828, + 49829, + 49830, + 49831, + 49832, + 49833, + 49834, + 49835, + 49836, + 49837, + 49838, + 49839, + 49840, + 49841, + 49842, + 49843, + 49844, + 49846, + 49847, + 49848, + 49849, + 49850, + 49851, + 49852, + 49853, + 49854, + 49855, + 49856, + 49857, + 49858, + 49859, + 49860, + 49861, + 49862, + 49863, + 49864, + 49865, + 49867, + 49868, + 49869, + 49871, + 49872, + 49873, + 49874, + 49875, + 49876, + 49877, + 49878, + 49879, + 49880, + 49881, + 49882, + 49883, + 49884, + 49885, + 49886, + 49887, + 49888, + 49889, + 49890, + 49891, + 49892, + 49893, + 49894, + 49896, + 49897, + 49898, + 49899, + 49900, + 49902, + 49903, + 49904, + 49905, + 49906, + 49907, + 49908, + 49909, + 49910, + 49911, + 49912, + 49914, + 49915, + 49917, + 49918, + 49919, + 49920, + 49921, + 49922, + 49923, + 49924, + 49926, + 49927, + 49928, + 49929, + 49930, + 49931, + 49932, + 49933, + 49934, + 49935, + 49936, + 49937, + 49938, + 49939, + 49940, + 49941, + 49942, + 49943, + 49944, + 49945, + 49946, + 49947, + 49948, + 49950, + 49951, + 49952, + 49954, + 49955, + 49956, + 49957, + 49958, + 49959, + 49960, + 49961, + 49962, + 49963, + 49964, + 49965, + 49966, + 49967, + 49968, + 49969, + 49970, + 49971, + 49972, + 49973, + 49974, + 49975, + 49976, + 49977, + 49978, + 49979, + 49980, + 49981, + 49982, + 49983, + 49984, + 49985, + 49986, + 49987, + 49988, + 49989, + 49990, + 49991, + 49992, + 49993, + 49994, + 49995, + 49996, + 49997, + 49999, + 50000, + 50001, + 50002, + 50003, + 50004, + 50005, + 50006, + 50007, + 50008, + 50009, + 50011, + 50012, + 50015, + 50016, + 50017, + 50018, + 50019, + 50020, + 50023, + 50024, + 50025, + 50026, + 50027, + 50028, + 50029, + 50030, + 50031, + 50032, + 50033, + 50034, + 50036, + 50038, + 50039, + 50040, + 50041, + 50042, + 50043, + 50044, + 50045, + 50047, + 50048, + 50049, + 50050, + 50052, + 50053, + 50054, + 50055, + 50056, + 50057, + 50059, + 50060, + 50061, + 50062, + 50063, + 50064, + 50065, + 50066, + 50067, + 50068, + 50070, + 50071, + 50073, + 50075, + 50076, + 50077, + 50078, + 50079, + 50080, + 50081, + 50082, + 50083, + 50084, + 50085, + 50087, + 50088, + 50089, + 50090, + 50091, + 50092, + 50093, + 50094, + 50095, + 50096, + 50097, + 50098, + 50099, + 50100, + 50101, + 50102, + 50104, + 50105, + 50106, + 50107, + 50108, + 50109, + 50110, + 50111, + 50112, + 50113, + 50114, + 50115, + 50116, + 50117, + 50118, + 50119, + 50121, + 50122, + 50123, + 50124, + 50125, + 50126, + 50127, + 50128, + 50129, + 50130, + 50131, + 50132, + 50133, + 50135, + 50136, + 50137, + 50138, + 50139, + 50140, + 50141, + 50143, + 50144, + 50146, + 50147, + 50148, + 50149, + 50150, + 50151, + 50152, + 50153, + 50154, + 50156, + 50157, + 50158, + 50159, + 50160, + 50161, + 50162, + 50163, + 50164, + 50165, + 50166, + 50167, + 50168, + 50169, + 50170, + 50171, + 50172, + 50173, + 50174, + 50175, + 50176, + 50177, + 50178, + 50179, + 50180, + 50181, + 50182, + 50183, + 50184, + 50185, + 50187, + 50188, + 50189, + 50190, + 50191, + 50192, + 50193, + 50194, + 50195, + 50196, + 50197, + 50198, + 50199, + 50200, + 50201, + 50202, + 50203, + 50204, + 50205, + 50206, + 50207, + 50208, + 50209, + 50211, + 50212, + 50213, + 50215, + 50217, + 50218, + 50219, + 50220, + 50221, + 50222, + 50223, + 50224, + 50226, + 50227, + 50228, + 50229, + 50230, + 50231, + 50232, + 50233, + 50234, + 50235, + 50237, + 50238, + 50239, + 50240, + 50241, + 50242, + 50243, + 50244, + 50245, + 50246, + 50247, + 50248, + 50249, + 50250, + 50251, + 50252, + 50253, + 50254, + 50255, + 50256, + 50257, + 50259, + 50260, + 50261, + 50262, + 50263, + 50264, + 50266, + 50268, + 50269, + 50270, + 50271, + 50272, + 50273, + 50274, + 50275, + 50276, + 50277, + 50278, + 50279, + 50280, + 50281, + 50283, + 50284, + 50285, + 50286, + 50287, + 50288, + 50290, + 50291, + 50292, + 50293, + 50294, + 50295, + 50296, + 50297, + 50298, + 50299, + 50300, + 50301, + 50302, + 50303, + 50304, + 50305, + 50307, + 50308, + 50309, + 50310, + 50311, + 50313, + 50314, + 50315, + 50316, + 50317, + 50318, + 50321, + 50322, + 50323, + 50324, + 50325, + 50326, + 50327, + 50328, + 50329, + 50330, + 50331, + 50332, + 50333, + 50334, + 50335, + 50336, + 50337, + 50338, + 50339, + 50340, + 50342, + 50343, + 50344, + 50345, + 50346, + 50347, + 50348, + 50349, + 50350, + 50351, + 50352, + 50353, + 50354, + 50355, + 50356, + 50357, + 50358, + 50359, + 50360, + 50361, + 50362, + 50363, + 50364, + 50365, + 50366, + 50367, + 50368, + 50369, + 50370, + 50371, + 50372, + 50373, + 50374, + 50375, + 50376, + 50377, + 50378, + 50379, + 50380, + 50381, + 50382, + 50383, + 50385, + 50386, + 50387, + 50388, + 50389, + 50390, + 50391, + 50393, + 50394, + 50395, + 50396, + 50397, + 50398, + 50399, + 50400, + 50401, + 50402, + 50403, + 50404, + 50405, + 50406, + 50408, + 50409, + 50410, + 50411, + 50412, + 50413, + 50414, + 50415, + 50416, + 50417, + 50418, + 50419, + 50420, + 50422, + 50423, + 50424, + 50425, + 50426, + 50427, + 50428, + 50429, + 50431, + 50432, + 50433, + 50434, + 50435, + 50437, + 50438, + 50439, + 50440, + 50441, + 50442, + 50443, + 50444, + 50445, + 50446, + 50447, + 50448, + 50449, + 50450, + 50451, + 50452, + 50453, + 50454, + 50455, + 50456, + 50457, + 50458, + 50459, + 50460, + 50461, + 50462, + 50463, + 50464, + 50465, + 50466, + 50467, + 50468, + 50469, + 50470, + 50471, + 50472, + 50473, + 50474, + 50475, + 50476, + 50477, + 50478, + 50479, + 50480, + 50481, + 50482, + 50483, + 50485, + 50486, + 50487, + 50488, + 50489, + 50490, + 50491, + 50493, + 50494, + 50495, + 50496, + 50497, + 50498, + 50499, + 50500, + 50501, + 50502, + 50503, + 50504, + 50505, + 50506, + 50507, + 50508, + 50509, + 50510, + 50511, + 50512, + 50514, + 50515, + 50516, + 50517, + 50519, + 50520, + 50521, + 50523, + 50524, + 50525, + 50526, + 50527, + 50528, + 50529, + 50530, + 50531, + 50532, + 50533, + 50534, + 50535, + 50536, + 50537, + 50538, + 50539, + 50540, + 50541, + 50542, + 50543, + 50544, + 50545, + 50546, + 50548, + 50549, + 50550, + 50551, + 50552, + 50553, + 50554, + 50555, + 50556, + 50557, + 50558, + 50559, + 50560, + 50561, + 50562, + 50563, + 50564, + 50565, + 50566, + 50567, + 50568, + 50569, + 50570, + 50572, + 50573, + 50574, + 50575, + 50576, + 50577, + 50578, + 50579, + 50580, + 50581, + 50582, + 50583, + 50584, + 50586, + 50587, + 50588, + 50589, + 50590, + 50591, + 50592, + 50593, + 50594, + 50595, + 50596, + 50597, + 50598, + 50599, + 50600, + 50601, + 50602, + 50603, + 50604, + 50605, + 50606, + 50607, + 50608, + 50609, + 50610, + 50611, + 50612, + 50613, + 50614, + 50615, + 50617, + 50618, + 50619, + 50620, + 50621, + 50622, + 50623, + 50624, + 50625, + 50626, + 50627, + 50628, + 50629, + 50630, + 50631, + 50632, + 50633, + 50634, + 50635, + 50637, + 50638, + 50639, + 50640, + 50641, + 50642, + 50643, + 50644, + 50645, + 50647, + 50648, + 50649, + 50650, + 50651, + 50652, + 50653, + 50656, + 50657, + 50659, + 50661, + 50662, + 50663, + 50664, + 50665, + 50666, + 50667, + 50668, + 50669, + 50670, + 50671, + 50672, + 50674, + 50675, + 50678, + 50679, + 50680, + 50681, + 50683, + 50684, + 50685, + 50686, + 50687, + 50688, + 50689, + 50690, + 50691, + 50692, + 50693, + 50694, + 50695, + 50697, + 50698, + 50699, + 50700, + 50701, + 50702, + 50703, + 50704, + 50705, + 50706, + 50707, + 50708, + 50709, + 50710, + 50711, + 50712, + 50713, + 50714, + 50715, + 50716, + 50717, + 50718, + 50719, + 50720, + 50721, + 50722, + 50723, + 50724, + 50725, + 50726, + 50727, + 50728, + 50729, + 50730, + 50731, + 50732, + 50733, + 50734, + 50735, + 50736, + 50737, + 50738, + 50739, + 50740, + 50741, + 50742, + 50743, + 50744, + 50745, + 50746, + 50747, + 50748, + 50749, + 50750, + 50751, + 50752, + 50753, + 50754, + 50755, + 50756, + 50757, + 50758, + 50759, + 50760, + 50762, + 50763, + 50764, + 50765, + 50766, + 50767, + 50768, + 50769, + 50770, + 50771, + 50772, + 50773, + 50774, + 50775, + 50776, + 50777, + 50778, + 50779, + 50781, + 50782, + 50783, + 50784, + 50785, + 50786, + 50787, + 50788, + 50789, + 50790, + 50792, + 50793, + 50794, + 50795, + 50796, + 50797, + 50798, + 50799, + 50800, + 50801, + 50802, + 50803, + 50804, + 50805, + 50806, + 50807, + 50808, + 50810, + 50811, + 50812, + 50813, + 50814, + 50815, + 50816, + 50817, + 50819, + 50820, + 50821, + 50822, + 50823, + 50824, + 50825, + 50826, + 50827, + 50829, + 50830, + 50831, + 50832, + 50833, + 50834, + 50835, + 50836, + 50837, + 50838, + 50839, + 50840, + 50841, + 50842, + 50843, + 50844, + 50845, + 50846, + 50847, + 50849, + 50850, + 50851, + 50852, + 50853, + 50854, + 50855, + 50856, + 50857, + 50858, + 50859, + 50860, + 50861, + 50863, + 50864, + 50865, + 50866, + 50867, + 50869, + 50870, + 50871, + 50872, + 50873, + 50875, + 50876, + 50877, + 50878, + 50879, + 50880, + 50881, + 50882, + 50883, + 50885, + 50886, + 50887, + 50888, + 50889, + 50890, + 50891, + 50892, + 50893, + 50894, + 50895, + 50896, + 50897, + 50898, + 50899, + 50900, + 50901, + 50902, + 50904, + 50905, + 50906, + 50907, + 50909, + 50910, + 50911, + 50912, + 50913, + 50914, + 50915, + 50916, + 50917, + 50918, + 50919, + 50920, + 50921, + 50922, + 50923, + 50924, + 50926, + 50927, + 50928, + 50929, + 50930, + 50931, + 50932, + 50933, + 50934, + 50935, + 50937, + 50940, + 50941, + 50942, + 50943, + 50944, + 50945, + 50946, + 50947, + 50948, + 50950, + 50951, + 50952, + 50953, + 50954, + 50955, + 50957, + 50958, + 50959, + 50960, + 50961, + 50962, + 50963, + 50964, + 50965, + 50966, + 50967, + 50968, + 50969, + 50970, + 50971, + 50972, + 50973, + 50974, + 50975, + 50976, + 50977, + 50978, + 50979, + 50980, + 50981, + 50982, + 50983, + 50985, + 50986, + 50987, + 50988, + 50989, + 50990, + 50991, + 50992, + 50993, + 50994, + 50995, + 50996, + 50997, + 50998, + 50999, + 51000, + 51001, + 51002, + 51003, + 51004, + 51005, + 51006, + 51007, + 51008, + 51009, + 51010, + 51011, + 51012, + 51013, + 51014, + 51015, + 51016, + 51017, + 51018, + 51019, + 51020, + 51021, + 51022, + 51023, + 51024, + 51025, + 51026, + 51027, + 51028, + 51030, + 51031, + 51032, + 51033, + 51034, + 51035, + 51036, + 51037, + 51038, + 51039, + 51040, + 51041, + 51042, + 51043, + 51044, + 51045, + 51046, + 51047, + 51048, + 51049, + 51050, + 51051, + 51052, + 51053, + 51054, + 51055, + 51056, + 51057, + 51058, + 51059, + 51060, + 51061, + 51062, + 51063, + 51064, + 51065, + 51066, + 51067, + 51068, + 51070, + 51071, + 51072, + 51073, + 51074, + 51075, + 51076, + 51077, + 51078, + 51079, + 51080, + 51081, + 51082, + 51083, + 51084, + 51085, + 51086, + 51087, + 51088, + 51089, + 51090, + 51091, + 51092, + 51093, + 51094, + 51095, + 51096, + 51097, + 51098, + 51099, + 51100, + 51101, + 51102, + 51103, + 51104, + 51105, + 51106, + 51107, + 51108, + 51109, + 51110, + 51111, + 51112, + 51113, + 51114, + 51115, + 51116, + 51118, + 51119, + 51120, + 51121, + 51122, + 51123, + 51124, + 51126, + 51127, + 51128, + 51129, + 51130, + 51131, + 51132, + 51133, + 51134, + 51135, + 51136, + 51137, + 51138, + 51139, + 51140, + 51141, + 51143, + 51144, + 51145, + 51146, + 51147, + 51148, + 51149, + 51150, + 51151, + 51152, + 51153, + 51154, + 51155, + 51156, + 51157, + 51158, + 51159, + 51160, + 51161, + 51162, + 51163, + 51164, + 51165, + 51166, + 51167, + 51168, + 51169, + 51170, + 51171, + 51172, + 51173, + 51174, + 51175, + 51177, + 51178, + 51180, + 51181, + 51182, + 51183, + 51184, + 51185, + 51186, + 51187, + 51189, + 51190, + 51191, + 51192, + 51193, + 51194, + 51195, + 51196, + 51197, + 51198, + 51199, + 51200, + 51201, + 51203, + 51205, + 51206, + 51207, + 51208, + 51209, + 51210, + 51211, + 51212, + 51213, + 51214, + 51215, + 51216, + 51217, + 51218, + 51219, + 51220, + 51221, + 51222, + 51223, + 51224, + 51225, + 51226, + 51227, + 51228, + 51229, + 51230, + 51231, + 51232, + 51233, + 51234, + 51236, + 51237, + 51240, + 51241, + 51242, + 51243, + 51244, + 51246, + 51247, + 51248, + 51249, + 51250, + 51251, + 51252, + 51253, + 51254, + 51255, + 51256, + 51257, + 51258, + 51259, + 51260, + 51261, + 51262, + 51264, + 51265, + 51266, + 51267, + 51268, + 51269, + 51270, + 51271, + 51272, + 51273, + 51275, + 51276, + 51277, + 51278, + 51279, + 51280, + 51281, + 51282, + 51283, + 51284, + 51286, + 51287, + 51288, + 51289, + 51290, + 51291, + 51292, + 51293, + 51294, + 51295, + 51296, + 51298, + 51300, + 51301, + 51302, + 51303, + 51304, + 51305, + 51306, + 51307, + 51309, + 51310, + 51311, + 51312, + 51313, + 51314, + 51315, + 51316, + 51317, + 51318, + 51319, + 51320, + 51321, + 51322, + 51323, + 51324, + 51325, + 51326, + 51327, + 51328, + 51329, + 51330, + 51331, + 51332, + 51333, + 51334, + 51335, + 51336, + 51337, + 51338, + 51339, + 51340, + 51341, + 51342, + 51343, + 51344, + 51345, + 51347, + 51349, + 51350, + 51351, + 51352, + 51353, + 51354, + 51355, + 51356, + 51357, + 51358, + 51359, + 51360, + 51361, + 51362, + 51363, + 51364, + 51365, + 51366, + 51368, + 51369, + 51370, + 51371, + 51372, + 51373, + 51374, + 51375, + 51376, + 51377, + 51378, + 51379, + 51380, + 51381, + 51382, + 51383, + 51385, + 51386, + 51387, + 51388, + 51389, + 51390, + 51391, + 51392, + 51394, + 51395, + 51396, + 51397, + 51398, + 51399, + 51400, + 51401, + 51402, + 51403, + 51404, + 51407, + 51408, + 51409, + 51410, + 51411, + 51412, + 51413, + 51414, + 51415, + 51416, + 51417, + 51418, + 51419, + 51420, + 51421, + 51422, + 51423, + 51424, + 51425, + 51426, + 51427, + 51428, + 51429, + 51430, + 51431, + 51432, + 51433, + 51434, + 51435, + 51436, + 51437, + 51438, + 51439, + 51440, + 51441, + 51442, + 51443, + 51444, + 51445, + 51446, + 51447, + 51448, + 51449, + 51450, + 51451, + 51452, + 51453, + 51454, + 51455, + 51456, + 51457, + 51458, + 51459, + 51460, + 51461, + 51462, + 51463, + 51464, + 51465, + 51466, + 51467, + 51468, + 51469, + 51470, + 51471, + 51472, + 51473, + 51474, + 51475, + 51476, + 51477, + 51478, + 51479, + 51480, + 51481, + 51482, + 51483, + 51484, + 51485, + 51487, + 51488, + 51489, + 51490, + 51491, + 51492, + 51493, + 51494, + 51495, + 51496, + 51497, + 51498, + 51501, + 51502, + 51503, + 51504, + 51505, + 51506, + 51507, + 51508, + 51509, + 51510, + 51511, + 51512, + 51513, + 51514, + 51515, + 51516, + 51517, + 51518, + 51519, + 51520, + 51521, + 51522, + 51523, + 51524, + 51525, + 51526, + 51527, + 51529, + 51530, + 51531, + 51532, + 51533, + 51535, + 51536, + 51537, + 51538, + 51539, + 51540, + 51541, + 51542, + 51543, + 51545, + 51546, + 51547, + 51548, + 51549, + 51550, + 51551, + 51552, + 51553, + 51554, + 51555, + 51556, + 51557, + 51558, + 51559, + 51560, + 51561, + 51562, + 51563, + 51564, + 51565, + 51566, + 51567, + 51568, + 51570, + 51571, + 51572, + 51573, + 51574, + 51575, + 51576, + 51577, + 51578, + 51579, + 51581, + 51582, + 51583, + 51584, + 51585, + 51586, + 51587, + 51589, + 51590, + 51591, + 51592, + 51593, + 51594, + 51595, + 51596, + 51597, + 51598, + 51599, + 51600, + 51603, + 51604, + 51605, + 51607, + 51608, + 51609, + 51611, + 51612, + 51613, + 51614, + 51615, + 51616, + 51617, + 51618, + 51619, + 51620, + 51621, + 51622, + 51623, + 51624, + 51625, + 51626, + 51627, + 51628, + 51629, + 51630, + 51631, + 51632, + 51633, + 51634, + 51635, + 51636, + 51637, + 51638, + 51639, + 51640, + 51641, + 51642, + 51643, + 51644, + 51645, + 51646, + 51647, + 51648, + 51649, + 51650, + 51651, + 51652, + 51653, + 51654, + 51655, + 51656, + 51657, + 51658, + 51659, + 51660, + 51661, + 51662, + 51663, + 51664, + 51665, + 51667, + 51668, + 51669, + 51670, + 51671, + 51672, + 51673, + 51674, + 51675, + 51677, + 51678, + 51679, + 51680, + 51682, + 51683, + 51684, + 51685, + 51686, + 51687, + 51688, + 51689, + 51690, + 51691, + 51692, + 51693, + 51695, + 51696, + 51697, + 51698, + 51699, + 51700, + 51701, + 51702, + 51703, + 51704, + 51705, + 51706, + 51707, + 51708, + 51709, + 51711, + 51712, + 51713, + 51714, + 51715, + 51716, + 51717, + 51718, + 51719, + 51720, + 51721, + 51722, + 51723, + 51724, + 51725, + 51726, + 51727, + 51729, + 51730, + 51731, + 51732, + 51733, + 51734, + 51735, + 51736, + 51737, + 51738, + 51739, + 51740, + 51741, + 51742, + 51743, + 51744, + 51745, + 51746, + 51747, + 51748, + 51750, + 51751, + 51752, + 51753, + 51754, + 51756, + 51757, + 51758, + 51760, + 51761, + 51762, + 51763, + 51764, + 51765, + 51766, + 51767, + 51768, + 51769, + 51770, + 51771, + 51772, + 51774, + 51775, + 51776, + 51777, + 51778, + 51779, + 51780, + 51781, + 51782, + 51783, + 51784, + 51785, + 51786, + 51787, + 51788, + 51789, + 51791, + 51792, + 51793, + 51794, + 51795, + 51796, + 51797, + 51798, + 51799, + 51800, + 51801, + 51802, + 51803, + 51804, + 51805, + 51806, + 51807, + 51808, + 51809, + 51810, + 51811, + 51812, + 51813, + 51814, + 51815, + 51816, + 51817, + 51818, + 51819, + 51820, + 51821, + 51822, + 51823, + 51824, + 51825, + 51826, + 51827, + 51828, + 51829, + 51830, + 51831, + 51832, + 51833, + 51834, + 51835, + 51836, + 51837, + 51838, + 51841, + 51843, + 51844, + 51845, + 51846, + 51847, + 51848, + 51849, + 51850, + 51851, + 51852, + 51853, + 51854, + 51855, + 51856, + 51857, + 51858, + 51859, + 51860, + 51861, + 51862, + 51863, + 51864, + 51865, + 51866, + 51867, + 51868, + 51869, + 51871, + 51872, + 51873, + 51874, + 51876, + 51877, + 51878, + 51879, + 51880, + 51881, + 51882, + 51883, + 51884, + 51885, + 51886, + 51887, + 51888, + 51889, + 51890, + 51892, + 51893, + 51894, + 51895, + 51896, + 51897, + 51898, + 51899, + 51900, + 51901, + 51902, + 51903, + 51905, + 51906, + 51908, + 51909, + 51910, + 51911, + 51912, + 51913, + 51914, + 51915, + 51916, + 51917, + 51918, + 51919, + 51920, + 51921, + 51922, + 51923, + 51924, + 51925, + 51926, + 51927, + 51928, + 51929, + 51930, + 51931, + 51932, + 51933, + 51934, + 51935, + 51936, + 51938, + 51939, + 51940, + 51941, + 51942, + 51943, + 51944, + 51945, + 51946, + 51947, + 51948, + 51949, + 51950, + 51951, + 51953, + 51955, + 51956, + 51957, + 51958, + 51959, + 51960, + 51961, + 51962, + 51963, + 51964, + 51965, + 51966, + 51967, + 51968, + 51969, + 51970, + 51971, + 51972, + 51973, + 51974, + 51975, + 51976, + 51977, + 51978, + 51979, + 51980, + 51981, + 51982, + 51983, + 51984, + 51985, + 51987, + 51988, + 51989, + 51991, + 51992, + 51993, + 51994, + 51995, + 51996, + 51997, + 51998, + 51999, + 52000, + 52001, + 52002, + 52003, + 52004, + 52005, + 52006, + 52007, + 52008, + 52009, + 52010, + 52011, + 52012, + 52013, + 52014, + 52015, + 52016, + 52017, + 52019, + 52020, + 52021, + 52022, + 52024, + 52025, + 52027, + 52028, + 52029, + 52030, + 52031, + 52032, + 52033, + 52034, + 52035, + 52036, + 52037, + 52038, + 52039, + 52040, + 52041, + 52042, + 52043, + 52044, + 52045, + 52046, + 52047, + 52048, + 52049, + 52050, + 52051, + 52052, + 52053, + 52054, + 52055, + 52057, + 52058, + 52059, + 52060, + 52061, + 52062, + 52063, + 52064, + 52065, + 52066, + 52067, + 52068, + 52069, + 52071, + 52072, + 52073, + 52074, + 52075, + 52076, + 52077, + 52078, + 52079, + 52080, + 52081, + 52082, + 52083, + 52084, + 52085, + 52086, + 52087, + 52088, + 52089, + 52090, + 52091, + 52092, + 52093, + 52094, + 52095, + 52096, + 52098, + 52099, + 52100, + 52101, + 52102, + 52104, + 52105, + 52106, + 52108, + 52109, + 52110, + 52111, + 52113, + 52114, + 52115, + 52117, + 52118, + 52119, + 52120, + 52121, + 52122, + 52123, + 52124, + 52125, + 52126, + 52127, + 52128, + 52129, + 52130, + 52131, + 52132, + 52133, + 52134, + 52135, + 52136, + 52137, + 52139, + 52140, + 52141, + 52142, + 52143, + 52144, + 52145, + 52146, + 52147, + 52148, + 52149, + 52150, + 52152, + 52153, + 52154, + 52155, + 52156, + 52157, + 52158, + 52159, + 52160, + 52161, + 52162, + 52163, + 52164, + 52165, + 52166, + 52167, + 52168, + 52169, + 52170, + 52171, + 52172, + 52173, + 52174, + 52175, + 52176, + 52177, + 52178, + 52179, + 52180, + 52181, + 52182, + 52183, + 52184, + 52185, + 52186, + 52187, + 52188, + 52189, + 52190, + 52191, + 52192, + 52193, + 52194, + 52195, + 52196, + 52197, + 52198, + 52199, + 52200, + 52201, + 52202, + 52203, + 52204, + 52205, + 52206, + 52207, + 52208, + 52209, + 52210, + 52211, + 52212, + 52213, + 52214, + 52215, + 52216, + 52217, + 52218, + 52220, + 52222, + 52223, + 52224, + 52225, + 52226, + 52227, + 52228, + 52230, + 52231, + 52232, + 52233, + 52234, + 52235, + 52236, + 52237, + 52238, + 52239, + 52240, + 52241, + 52242, + 52243, + 52244, + 52245, + 52246, + 52247, + 52248, + 52249, + 52250, + 52251, + 52252, + 52253, + 52254, + 52255, + 52256, + 52257, + 52258, + 52259, + 52260, + 52261, + 52262, + 52263, + 52265, + 52266, + 52267, + 52268, + 52269, + 52271, + 52273, + 52274, + 52276, + 52277, + 52278, + 52279, + 52280, + 52281, + 52282, + 52283, + 52284, + 52285, + 52286, + 52287, + 52288, + 52289, + 52290, + 52291, + 52292, + 52293, + 52294, + 52296, + 52297, + 52298, + 52299, + 52300, + 52301, + 52302, + 52303, + 52304, + 52305, + 52306, + 52307, + 52308, + 52309, + 52310, + 52311, + 52312, + 52313, + 52314, + 52315, + 52316, + 52317, + 52319, + 52320, + 52321, + 52322, + 52323, + 52324, + 52325, + 52326, + 52327, + 52328, + 52331, + 52332, + 52333, + 52334, + 52335, + 52336, + 52337, + 52339, + 52340, + 52341, + 52342, + 52343, + 52344, + 52345, + 52346, + 52347, + 52348, + 52349, + 52351, + 52353, + 52354, + 52355, + 52356, + 52357, + 52358, + 52359, + 52360, + 52361, + 52362, + 52363, + 52364, + 52365, + 52366, + 52367, + 52368, + 52371, + 52372, + 52373, + 52374, + 52375, + 52376, + 52377, + 52378, + 52379, + 52380, + 52381, + 52382, + 52383, + 52384, + 52385, + 52386, + 52387, + 52388, + 52389, + 52390, + 52391, + 52392, + 52393, + 52394, + 52395, + 52396, + 52397, + 52398, + 52399, + 52400, + 52401, + 52402, + 52403, + 52404, + 52405, + 52406, + 52407, + 52408, + 52409, + 52410, + 52411, + 52412, + 52413, + 52414, + 52415, + 52416, + 52417, + 52418, + 52419, + 52420, + 52421, + 52424, + 52425, + 52426, + 52427, + 52428, + 52429, + 52430, + 52431, + 52432, + 52433, + 52434, + 52435, + 52436, + 52437, + 52438, + 52439, + 52440, + 52441, + 52442, + 52444, + 52445, + 52446, + 52447, + 52448, + 52450, + 52451, + 52452, + 52453, + 52454, + 52455, + 52456, + 52457, + 52458, + 52459, + 52460, + 52461, + 52462, + 52463, + 52464, + 52465, + 52466, + 52467, + 52468, + 52469, + 52471, + 52472, + 52473, + 52474, + 52475, + 52476, + 52477, + 52478, + 52479, + 52480, + 52481, + 52482, + 52483, + 52484, + 52485, + 52486, + 52487, + 52488, + 52489, + 52490, + 52491, + 52493, + 52495, + 52496, + 52497, + 52498, + 52499, + 52500, + 52501, + 52502, + 52503, + 52504, + 52505, + 52506, + 52507, + 52508, + 52509, + 52510, + 52511, + 52512, + 52513, + 52514, + 52515, + 52516, + 52517, + 52518, + 52519, + 52520, + 52521, + 52522, + 52523, + 52524, + 52525, + 52526, + 52527, + 52528, + 52529, + 52530, + 52531, + 52532, + 52533, + 52534, + 52535, + 52537, + 52538, + 52539, + 52540, + 52541, + 52542, + 52543, + 52545, + 52546, + 52547, + 52548, + 52549, + 52550, + 52551, + 52552, + 52553, + 52554, + 52555, + 52556, + 52557, + 52558, + 52559, + 52560, + 52561, + 52562, + 52563, + 52564, + 52565, + 52566, + 52567, + 52569, + 52570, + 52571, + 52572, + 52573, + 52574, + 52575, + 52576, + 52577, + 52578, + 52579, + 52580, + 52581, + 52582, + 52583, + 52584, + 52585, + 52586, + 52587, + 52588, + 52589, + 52590, + 52591, + 52592, + 52593, + 52594, + 52596, + 52597, + 52599, + 52600, + 52601, + 52602, + 52603, + 52604, + 52605, + 52606, + 52607, + 52608, + 52609, + 52610, + 52611, + 52612, + 52613, + 52614, + 52615, + 52616, + 52618, + 52619, + 52620, + 52621, + 52622, + 52623, + 52624, + 52625, + 52626, + 52627, + 52629, + 52630, + 52631, + 52632, + 52633, + 52634, + 52635, + 52636, + 52637, + 52638, + 52639, + 52641, + 52642, + 52644, + 52645, + 52646, + 52647, + 52648, + 52649, + 52650, + 52651, + 52652, + 52653, + 52654, + 52655, + 52656, + 52657, + 52658, + 52659, + 52660, + 52661, + 52662, + 52663, + 52664, + 52665, + 52666, + 52667, + 52668, + 52669, + 52670, + 52671, + 52672, + 52673, + 52674, + 52675, + 52676, + 52677, + 52678, + 52679, + 52681, + 52682, + 52683, + 52684, + 52686, + 52687, + 52688, + 52689, + 52690, + 52691, + 52692, + 52693, + 52694, + 52695, + 52696, + 52698, + 52699, + 52700, + 52702, + 52703, + 52704, + 52705, + 52706, + 52707, + 52708, + 52709, + 52710, + 52711, + 52712, + 52713, + 52714, + 52715, + 52716, + 52717, + 52718, + 52719, + 52720, + 52721, + 52722, + 52723, + 52724, + 52725, + 52726, + 52727, + 52728, + 52729, + 52730, + 52731, + 52732, + 52733, + 52734, + 52735, + 52736, + 52737, + 52738, + 52740, + 52741, + 52742, + 52743, + 52744, + 52745, + 52746, + 52747, + 52748, + 52749, + 52750, + 52751, + 52752, + 52753, + 52754, + 52755, + 52756, + 52757, + 52758, + 52760, + 52761, + 52762, + 52763, + 52764, + 52765, + 52766, + 52767, + 52768, + 52769, + 52770, + 52771, + 52772, + 52773, + 52774, + 52775, + 52776, + 52777, + 52778, + 52779, + 52780, + 52781, + 52782, + 52783, + 52784, + 52785, + 52786, + 52787, + 52788, + 52789, + 52790, + 52791, + 52792, + 52793, + 52794, + 52795, + 52796, + 52797, + 52798, + 52799, + 52800, + 52802, + 52803, + 52804, + 52805, + 52806, + 52807, + 52808, + 52809, + 52810, + 52811, + 52812, + 52813, + 52814, + 52815, + 52816, + 52817, + 52818, + 52819, + 52820, + 52821, + 52822, + 52823, + 52824, + 52825, + 52826, + 52827, + 52828, + 52829, + 52830, + 52831, + 52832, + 52833, + 52834, + 52835, + 52836, + 52838, + 52839, + 52841, + 52842, + 52843, + 52844, + 52845, + 52846, + 52847, + 52848, + 52850, + 52851, + 52852, + 52853, + 52854, + 52855, + 52857, + 52858, + 52859, + 52860, + 52861, + 52862, + 52863, + 52864, + 52865, + 52866, + 52867, + 52869, + 52870, + 52871, + 52872, + 52873, + 52875, + 52876, + 52877, + 52878, + 52879, + 52880, + 52881, + 52882, + 52883, + 52884, + 52886, + 52887, + 52888, + 52889, + 52890, + 52891, + 52892, + 52893, + 52895, + 52896, + 52897, + 52898, + 52899, + 52900, + 52901, + 52902, + 52903, + 52904, + 52905, + 52906, + 52907, + 52908, + 52909, + 52910, + 52911, + 52912, + 52913, + 52914, + 52915, + 52916, + 52917, + 52918, + 52919, + 52920, + 52921, + 52922, + 52923, + 52924, + 52925, + 52926, + 52927, + 52928, + 52929, + 52930, + 52931, + 52932, + 52933, + 52934, + 52935, + 52936, + 52937, + 52938, + 52939, + 52940, + 52942, + 52943, + 52944, + 52945, + 52946, + 52947, + 52948, + 52949, + 52950, + 52951, + 52952, + 52953, + 52954, + 52955, + 52956, + 52957, + 52958, + 52959, + 52960, + 52962, + 52963, + 52964, + 52965, + 52966, + 52967, + 52968, + 52969, + 52970, + 52971, + 52972, + 52973, + 52974, + 52975, + 52976, + 52977, + 52978, + 52979, + 52981, + 52982, + 52983, + 52985, + 52986, + 52987, + 52988, + 52989, + 52990, + 52991, + 52992, + 52993, + 52994, + 52995, + 52996, + 52997, + 52998, + 52999, + 53000, + 53001, + 53002, + 53003, + 53004, + 53006, + 53007, + 53008, + 53009, + 53010, + 53011, + 53013, + 53014, + 53015, + 53016, + 53017, + 53018, + 53019, + 53020, + 53021, + 53022, + 53023, + 53024, + 53025, + 53026, + 53027, + 53028, + 53030, + 53031, + 53032, + 53033, + 53034, + 53035, + 53036, + 53037, + 53038, + 53039, + 53040, + 53041, + 53042, + 53044, + 53045, + 53046, + 53048, + 53049, + 53050, + 53051, + 53052, + 53053, + 53054, + 53055, + 53056, + 53057, + 53058, + 53059, + 53060, + 53061, + 53062, + 53063, + 53064, + 53065, + 53066, + 53067, + 53068, + 53069, + 53070, + 53071, + 53072, + 53073, + 53074, + 53075, + 53076, + 53077, + 53078, + 53079, + 53080, + 53081, + 53082, + 53084, + 53085, + 53086, + 53087, + 53089, + 53090, + 53092, + 53094, + 53095, + 53096, + 53097, + 53098, + 53099, + 53101, + 53102, + 53103, + 53104, + 53105, + 53106, + 53107, + 53108, + 53109, + 53110, + 53111, + 53112, + 53113, + 53114, + 53115, + 53116, + 53117, + 53118, + 53119, + 53120, + 53121, + 53122, + 53124, + 53125, + 53126, + 53127, + 53128, + 53129, + 53130, + 53132, + 53134, + 53135, + 53136, + 53137, + 53138, + 53139, + 53140, + 53141, + 53142, + 53143, + 53144, + 53145, + 53146, + 53147, + 53148, + 53149, + 53150, + 53151, + 53152, + 53153, + 53154, + 53155, + 53156, + 53157, + 53158, + 53159, + 53160, + 53161, + 53162, + 53163, + 53164, + 53165, + 53166, + 53167, + 53170, + 53171, + 53172, + 53173, + 53174, + 53175, + 53176, + 53177, + 53178, + 53179, + 53180, + 53181, + 53183, + 53184, + 53185, + 53186, + 53187, + 53188, + 53189, + 53190, + 53191 + ], + "validation_episode_ids": [ + 124, + 162, + 228, + 275, + 362, + 374, + 458, + 505, + 554, + 597, + 618, + 647, + 669, + 725, + 791, + 842, + 909, + 1040, + 1045, + 1052, + 1064, + 1089, + 1102, + 1166, + 1184, + 1216, + 1229, + 1257, + 1260, + 1262, + 1420, + 1441, + 1520, + 1549, + 1571, + 1625, + 1728, + 1860, + 2000, + 2082, + 2095, + 2154, + 2191, + 2238, + 2347, + 2381, + 2391, + 2412, + 2418, + 2432, + 2488, + 2511, + 2846, + 3172, + 3176, + 3195, + 3323, + 3451, + 3599, + 3611, + 3614, + 3660, + 3758, + 3800, + 3826, + 3873, + 3921, + 3959, + 3987, + 4042, + 4264, + 4299, + 4314, + 4399, + 4582, + 4604, + 4659, + 4677, + 4681, + 4699, + 4706, + 4715, + 4731, + 4744, + 4875, + 4944, + 4994, + 5138, + 5141, + 5157, + 5249, + 5371, + 5449, + 5456, + 5583, + 5589, + 5595, + 5607, + 5609, + 5664, + 5690, + 5730, + 5875, + 5919, + 5990, + 6005, + 6039, + 6197, + 6245, + 6357, + 6383, + 6411, + 6433, + 6458, + 6524, + 6541, + 6545, + 6566, + 6693, + 6716, + 6824, + 6912, + 6932, + 7011, + 7023, + 7078, + 7111, + 7156, + 7185, + 7266, + 7310, + 7381, + 7502, + 7674, + 7735, + 7761, + 7806, + 7814, + 7815, + 7820, + 7839, + 7942, + 7962, + 8014, + 8094, + 8157, + 8201, + 8250, + 8341, + 8396, + 8498, + 8551, + 8560, + 8616, + 8627, + 8679, + 8717, + 8729, + 8764, + 8783, + 8885, + 8983, + 9004, + 9154, + 9417, + 9529, + 9541, + 9543, + 9582, + 9615, + 9629, + 9667, + 9673, + 9707, + 9709, + 9713, + 9715, + 9730, + 9751, + 9877, + 9884, + 9988, + 10014, + 10015, + 10024, + 10026, + 10064, + 10083, + 10119, + 10155, + 10200, + 10301, + 10378, + 10422, + 10469, + 10518, + 10557, + 10614, + 10633, + 10638, + 10665, + 10674, + 10817, + 10946, + 10966, + 11159, + 11166, + 11251, + 11294, + 11433, + 11440, + 11474, + 11499, + 11503, + 11511, + 11530, + 11580, + 11671, + 11678, + 11760, + 11865, + 11941, + 11952, + 12022, + 12094, + 12098, + 12223, + 12343, + 12386, + 12426, + 12457, + 12477, + 12484, + 12527, + 12571, + 12594, + 12595, + 12676, + 12747, + 12799, + 12834, + 12848, + 12861, + 12932, + 12965, + 13013, + 13050, + 13116, + 13183, + 13314, + 13363, + 13527, + 13616, + 13622, + 13649, + 13696, + 13744, + 13781, + 13816, + 13848, + 13998, + 14009, + 14018, + 14032, + 14198, + 14248, + 14273, + 14283, + 14315, + 14328, + 14405, + 14434, + 14437, + 14476, + 14496, + 14583, + 14595, + 14620, + 14657, + 14704, + 14743, + 14788, + 14792, + 14812, + 14865, + 14899, + 14907, + 14945, + 14980, + 14993, + 15000, + 15024, + 15035, + 15142, + 15169, + 15210, + 15271, + 15377, + 15425, + 15579, + 15605, + 15625, + 15715, + 15888, + 15894, + 15925, + 16013, + 16109, + 16166, + 16284, + 16433, + 16444, + 16531, + 16554, + 16585, + 16664, + 16707, + 16760, + 16791, + 16823, + 16855, + 16924, + 16993, + 17009, + 17030, + 17059, + 17116, + 17131, + 17141, + 17234, + 17239, + 17246, + 17252, + 17436, + 17450, + 17457, + 17490, + 17511, + 17512, + 17535, + 17567, + 17591, + 17601, + 17613, + 17616, + 17619, + 17711, + 17970, + 18002, + 18031, + 18032, + 18033, + 18038, + 18047, + 18078, + 18110, + 18250, + 18281, + 18315, + 18418, + 18429, + 18450, + 18457, + 18565, + 18605, + 18665, + 18739, + 18778, + 18780, + 18877, + 18948, + 19012, + 19126, + 19229, + 19298, + 19365, + 19398, + 19480, + 19534, + 19579, + 19733, + 19751, + 19851, + 19954, + 20098, + 20131, + 20173, + 20206, + 20211, + 20316, + 20333, + 20352, + 20417, + 20450, + 20482, + 20557, + 20624, + 20722, + 20731, + 20741, + 20753, + 20820, + 20827, + 20837, + 20839, + 20874, + 20969, + 20986, + 21050, + 21153, + 21162, + 21165, + 21193, + 21248, + 21259, + 21279, + 21284, + 21321, + 21392, + 21440, + 21453, + 21587, + 21611, + 21662, + 21709, + 21790, + 21793, + 21827, + 21954, + 21982, + 22104, + 22110, + 22185, + 22197, + 22213, + 22229, + 22245, + 22279, + 22435, + 22492, + 22518, + 22539, + 22609, + 22664, + 22690, + 22755, + 22780, + 22821, + 22829, + 22946, + 22950, + 22960, + 22973, + 22999, + 23077, + 23090, + 23138, + 23153, + 23246, + 23395, + 23421, + 23555, + 23591, + 23604, + 23732, + 23774, + 23796, + 23833, + 23944, + 23976, + 23981, + 24021, + 24123, + 24153, + 24224, + 24251, + 24278, + 24382, + 24425, + 24426, + 24456, + 24527, + 24533, + 24653, + 24657, + 24688, + 24730, + 24756, + 24757, + 24803, + 24830, + 24845, + 24925, + 24971, + 25177, + 25259, + 25384, + 25439, + 25443, + 25459, + 25532, + 25540, + 25552, + 25570, + 25573, + 25619, + 25622, + 25764, + 25815, + 25819, + 26021, + 26042, + 26109, + 26167, + 26227, + 26304, + 26355, + 26371, + 26396, + 26411, + 26457, + 26503, + 26507, + 26521, + 26527, + 26619, + 26708, + 26733, + 26749, + 26884, + 26995, + 27010, + 27026, + 27031, + 27092, + 27181, + 27197, + 27260, + 27325, + 27329, + 27349, + 27369, + 27376, + 27422, + 27479, + 27572, + 27592, + 27621, + 27678, + 27716, + 27761, + 27778, + 27809, + 27845, + 27848, + 27857, + 27932, + 27954, + 28003, + 28004, + 28174, + 28204, + 28208, + 28230, + 28242, + 28250, + 28264, + 28278, + 28300, + 28331, + 28333, + 28340, + 28342, + 28367, + 28416, + 28436, + 28474, + 28481, + 28494, + 28598, + 28739, + 28792, + 28820, + 28867, + 28947, + 28953, + 28964, + 28991, + 29053, + 29098, + 29182, + 29189, + 29218, + 29366, + 29383, + 29441, + 29509, + 29536, + 29688, + 29823, + 29832, + 29837, + 29862, + 29866, + 29890, + 29897, + 29944, + 29963, + 30003, + 30082, + 30096, + 30104, + 30123, + 30170, + 30214, + 30377, + 30380, + 30414, + 30468, + 30478, + 30510, + 30537, + 30625, + 30647, + 30666, + 30734, + 30793, + 30796, + 30815, + 30837, + 30838, + 30922, + 30948, + 30953, + 30988, + 31001, + 31042, + 31091, + 31190, + 31241, + 31261, + 31279, + 31431, + 31457, + 31458, + 31485, + 31509, + 31558, + 31590, + 31723, + 31734, + 31770, + 31812, + 31821, + 31874, + 32093, + 32102, + 32120, + 32121, + 32130, + 32146, + 32309, + 32345, + 32402, + 32406, + 32504, + 32585, + 32611, + 32704, + 32762, + 32822, + 32841, + 32896, + 32902, + 32979, + 33013, + 33026, + 33141, + 33169, + 33208, + 33244, + 33308, + 33368, + 33393, + 33458, + 33469, + 33474, + 33551, + 33668, + 33671, + 33711, + 33777, + 33788, + 33790, + 33806, + 33816, + 33879, + 33904, + 33997, + 34036, + 34078, + 34181, + 34353, + 34385, + 34467, + 34551, + 34622, + 34783, + 34814, + 34815, + 34844, + 34888, + 34889, + 34980, + 35197, + 35260, + 35312, + 35368, + 35373, + 35419, + 35431, + 35437, + 35452, + 35485, + 35508, + 35548, + 35563, + 35575, + 35623, + 35639, + 35648, + 35706, + 35719, + 35767, + 35899, + 35918, + 35944, + 35953, + 36007, + 36129, + 36169, + 36197, + 36236, + 36255, + 36277, + 36324, + 36332, + 36367, + 36377, + 36463, + 36471, + 36740, + 36802, + 36884, + 36960, + 37099, + 37112, + 37122, + 37132, + 37270, + 37334, + 37347, + 37394, + 37434, + 37485, + 37548, + 37561, + 37575, + 37649, + 37712, + 37823, + 37856, + 37893, + 37894, + 37922, + 37932, + 37962, + 37982, + 38023, + 38054, + 38124, + 38194, + 38266, + 38295, + 38297, + 38409, + 38428, + 38552, + 38600, + 38709, + 38766, + 38786, + 38794, + 38878, + 38913, + 39015, + 39017, + 39112, + 39147, + 39215, + 39227, + 39259, + 39301, + 39347, + 39391, + 39404, + 39411, + 39443, + 39503, + 39547, + 39569, + 39572, + 39620, + 39801, + 39804, + 39842, + 39879, + 39940, + 39969, + 39981, + 40022, + 40126, + 40190, + 40218, + 40227, + 40234, + 40255, + 40340, + 40347, + 40401, + 40410, + 40415, + 40529, + 40553, + 40604, + 40716, + 40770, + 40916, + 41060, + 41116, + 41278, + 41445, + 41604, + 41779, + 41807, + 41849, + 41854, + 41929, + 41942, + 41943, + 42002, + 42009, + 42073, + 42082, + 42167, + 42187, + 42257, + 42342, + 42489, + 42590, + 42593, + 42642, + 42658, + 42659, + 42717, + 42818, + 42956, + 43007, + 43013, + 43023, + 43109, + 43125, + 43222, + 43320, + 43359, + 43391, + 43401, + 43454, + 43606, + 43622, + 43683, + 43763, + 43856, + 43937, + 43939, + 43950, + 43965, + 43984, + 44103, + 44142, + 44143, + 44205, + 44257, + 44259, + 44428, + 44502, + 44509, + 44577, + 44606, + 44796, + 44820, + 44837, + 44868, + 44909, + 44911, + 44915, + 44954, + 45063, + 45191, + 45266, + 45300, + 45304, + 45310, + 45444, + 45474, + 45515, + 45607, + 45683, + 45700, + 45854, + 45875, + 45925, + 45993, + 46019, + 46057, + 46131, + 46155, + 46176, + 46232, + 46257, + 46330, + 46376, + 46414, + 46424, + 46456, + 46524, + 46525, + 46526, + 46529, + 46532, + 46573, + 46594, + 46613, + 46676, + 46695, + 46754, + 46777, + 46815, + 46840, + 46880, + 46989, + 47054, + 47065, + 47078, + 47091, + 47123, + 47132, + 47280, + 47294, + 47376, + 47443, + 47447, + 47508, + 47711, + 47737, + 47842, + 47873, + 47892, + 47989, + 48028, + 48042, + 48165, + 48229, + 48317, + 48327, + 48382, + 48384, + 48458, + 48478, + 48482, + 48519, + 48531, + 48569, + 48590, + 48705, + 48714, + 48763, + 48799, + 48957, + 48981, + 49026, + 49035, + 49199, + 49302, + 49332, + 49336, + 49337, + 49417, + 49462, + 49470, + 49548, + 49641, + 49657, + 49676, + 49751, + 49764, + 49794, + 49845, + 49925, + 49953, + 50010, + 50021, + 50035, + 50037, + 50120, + 50134, + 50155, + 50236, + 50258, + 50267, + 50306, + 50312, + 50319, + 50320, + 50341, + 50392, + 50436, + 50571, + 50585, + 50654, + 50676, + 50677, + 50696, + 50828, + 50848, + 50862, + 50868, + 51204, + 51346, + 51528, + 51588, + 51610, + 51749, + 51759, + 51842, + 51952, + 51954, + 52018, + 52097, + 52103, + 52219, + 52272, + 52275, + 52369, + 52370, + 52443, + 52568, + 52628, + 52680, + 52697, + 52874, + 52980, + 52984, + 53133 + ], + "requirement": "Future query loaders must exclude support IDs, even if query features are causal.", + "development_note": "Existing pilot development remains held out by its own manifest." +} diff --git a/releases/bridge-native-v3/memory/static_bank_3000/selection.json b/releases/bridge-native-v3/memory/static_bank_3000/selection.json new file mode 100644 index 0000000000000000000000000000000000000000..d7dd997744c8618c4f905e517c3dc34f797b36cd --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/selection.json @@ -0,0 +1,27066 @@ +{ + "version": "bridge_independent_support_selection_v1", + "seed": 20260925, + "count": 3000, + "strategy": "uniform_without_replacement_from_original_stage1_train", + "filters": "one nonempty canonical instruction; raw_length >= 17; exclude all pilot partitions", + "eligible_count": 36434, + "exclusions": [ + { + "path": "/home/gpu4/tianyi/Zeva/.artifacts/bridge_stage2_pilot_v2/manifest.json", + "sha256": "2171fbef015535a70868056d51c188480e4b56579a3d3c06410430bc233565d0", + "episode_ids": [ + 784, + 1007, + 1756, + 2033, + 3508, + 4433, + 5257, + 8950, + 9476, + 9859, + 10878, + 12575, + 12582, + 16123, + 18020, + 18480, + 19413, + 19452, + 19654, + 21155, + 22825, + 23163, + 26087, + 26116, + 27239, + 29961, + 32852, + 34396, + 36444, + 37316, + 39379, + 40371, + 41154, + 41799, + 41948, + 42409, + 42906, + 43421, + 45509, + 45758, + 45783, + 48306, + 48887, + 49100, + 50544, + 50816, + 50859, + 53171 + ] + } + ], + "episodes": [ + { + "episode_id": 6220, + "source_index": 6220, + "raw_length": 46, + "instruction": "Place the corn into the steel pan.", + "canonical_instruction": "place the corn into the steel pan", + "parquet": "data/chunk-006/episode_006220.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006220.mp4" + }, + { + "episode_id": 18112, + "source_index": 18112, + "raw_length": 25, + "instruction": "moved the cloth right to left", + "canonical_instruction": "moved the cloth right to left", + "parquet": "data/chunk-018/episode_018112.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018112.mp4" + }, + { + "episode_id": 14082, + "source_index": 14082, + "raw_length": 31, + "instruction": "Pick the pineapple out of pot and move to lower right corner.", + "canonical_instruction": "pick the pineapple out of pot and move to lower right corner", + "parquet": "data/chunk-014/episode_014082.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014082.mp4" + }, + { + "episode_id": 10529, + "source_index": 10529, + "raw_length": 44, + "instruction": "Put the silver bowl to the bottom right of the table.", + "canonical_instruction": "put the silver bowl to the bottom right of the table", + "parquet": "data/chunk-010/episode_010529.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010529.mp4" + }, + { + "episode_id": 36609, + "source_index": 36609, + "raw_length": 40, + "instruction": "Place the pot to the bottom right corner of the table.", + "canonical_instruction": "place the pot to the bottom right corner of the table", + "parquet": "data/chunk-036/episode_036609.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036609.mp4" + }, + { + "episode_id": 2429, + "source_index": 2429, + "raw_length": 27, + "instruction": "Move the yellow spoon to the far left edge of the table", + "canonical_instruction": "move the yellow spoon to the far left edge of the table", + "parquet": "data/chunk-002/episode_002429.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002429.mp4" + }, + { + "episode_id": 8139, + "source_index": 8139, + "raw_length": 34, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-008/episode_008139.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008139.mp4" + }, + { + "episode_id": 38884, + "source_index": 38884, + "raw_length": 33, + "instruction": "pick up the carrot and place it on bottom right side of napkin", + "canonical_instruction": "pick up the carrot and place it on bottom right side of napkin", + "parquet": "data/chunk-038/episode_038884.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038884.mp4" + }, + { + "episode_id": 35236, + "source_index": 35236, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-035/episode_035236.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035236.mp4" + }, + { + "episode_id": 43044, + "source_index": 43044, + "raw_length": 30, + "instruction": "move the blue towel to the middle of the table", + "canonical_instruction": "move the blue towel to the middle of the table", + "parquet": "data/chunk-043/episode_043044.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043044.mp4" + }, + { + "episode_id": 48200, + "source_index": 48200, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-048/episode_048200.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048200.mp4" + }, + { + "episode_id": 42284, + "source_index": 42284, + "raw_length": 46, + "instruction": "Place the sushi on to the yellow piece of cloth.", + "canonical_instruction": "place the sushi on to the yellow piece of cloth", + "parquet": "data/chunk-042/episode_042284.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042284.mp4" + }, + { + "episode_id": 28083, + "source_index": 28083, + "raw_length": 46, + "instruction": "remove the toy from the cloth to the right floor", + "canonical_instruction": "remove the toy from the cloth to the right floor", + "parquet": "data/chunk-028/episode_028083.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028083.mp4" + }, + { + "episode_id": 21739, + "source_index": 21739, + "raw_length": 32, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-021/episode_021739.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021739.mp4" + }, + { + "episode_id": 5287, + "source_index": 5287, + "raw_length": 35, + "instruction": "Move the table cloth from one side to other side of the table.", + "canonical_instruction": "move the table cloth from one side to other side of the table", + "parquet": "data/chunk-005/episode_005287.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005287.mp4" + }, + { + "episode_id": 30567, + "source_index": 30567, + "raw_length": 23, + "instruction": "Move the spoon and place it on the towel.", + "canonical_instruction": "move the spoon and place it on the towel", + "parquet": "data/chunk-030/episode_030567.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030567.mp4" + }, + { + "episode_id": 28916, + "source_index": 28916, + "raw_length": 31, + "instruction": "move the cloth to the upper middle of the table", + "canonical_instruction": "move the cloth to the upper middle of the table", + "parquet": "data/chunk-028/episode_028916.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028916.mp4" + }, + { + "episode_id": 9828, + "source_index": 9828, + "raw_length": 32, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-009/episode_009828.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009828.mp4" + }, + { + "episode_id": 23666, + "source_index": 23666, + "raw_length": 28, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-023/episode_023666.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023666.mp4" + }, + { + "episode_id": 35252, + "source_index": 35252, + "raw_length": 46, + "instruction": "Move pot to space above fork.", + "canonical_instruction": "move pot to space above fork", + "parquet": "data/chunk-035/episode_035252.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035252.mp4" + }, + { + "episode_id": 30663, + "source_index": 30663, + "raw_length": 25, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-030/episode_030663.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030663.mp4" + }, + { + "episode_id": 23295, + "source_index": 23295, + "raw_length": 33, + "instruction": "PICK UP THE VESSEL AND PUT NEAR THE NIFE", + "canonical_instruction": "pick up the vessel and put near the nife", + "parquet": "data/chunk-023/episode_023295.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023295.mp4" + }, + { + "episode_id": 5212, + "source_index": 5212, + "raw_length": 26, + "instruction": "move blue cube from the cylinder to the top of the tower", + "canonical_instruction": "move blue cube from the cylinder to the top of the tower", + "parquet": "data/chunk-005/episode_005212.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005212.mp4" + }, + { + "episode_id": 26234, + "source_index": 26234, + "raw_length": 33, + "instruction": "put spatula on plate sink", + "canonical_instruction": "put spatula on plate sink", + "parquet": "data/chunk-026/episode_026234.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026234.mp4" + }, + { + "episode_id": 46647, + "source_index": 46647, + "raw_length": 29, + "instruction": "moving the pan from the centre of the table to the edge of the table.", + "canonical_instruction": "moving the pan from the centre of the table to the edge of the table", + "parquet": "data/chunk-046/episode_046647.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046647.mp4" + }, + { + "episode_id": 47860, + "source_index": 47860, + "raw_length": 39, + "instruction": "open the drawers", + "canonical_instruction": "open the drawers", + "parquet": "data/chunk-047/episode_047860.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047860.mp4" + }, + { + "episode_id": 45663, + "source_index": 45663, + "raw_length": 19, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-045/episode_045663.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045663.mp4" + }, + { + "episode_id": 717, + "source_index": 717, + "raw_length": 43, + "instruction": "move the metal pot to the bottom right side of the stove", + "canonical_instruction": "move the metal pot to the bottom right side of the stove", + "parquet": "data/chunk-000/episode_000717.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000717.mp4" + }, + { + "episode_id": 35531, + "source_index": 35531, + "raw_length": 36, + "instruction": "take cucumber out of cup", + "canonical_instruction": "take cucumber out of cup", + "parquet": "data/chunk-035/episode_035531.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035531.mp4" + }, + { + "episode_id": 14632, + "source_index": 14632, + "raw_length": 30, + "instruction": "PLACE THE POTATO ON THE BLUE CLOTH", + "canonical_instruction": "place the potato on the blue cloth", + "parquet": "data/chunk-014/episode_014632.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014632.mp4" + }, + { + "episode_id": 50547, + "source_index": 50547, + "raw_length": 34, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-050/episode_050547.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050547.mp4" + }, + { + "episode_id": 30201, + "source_index": 30201, + "raw_length": 46, + "instruction": "unfold cloth from left to bottom left", + "canonical_instruction": "unfold cloth from left to bottom left", + "parquet": "data/chunk-030/episode_030201.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030201.mp4" + }, + { + "episode_id": 27533, + "source_index": 27533, + "raw_length": 27, + "instruction": "Place the brush on the front edge of the table", + "canonical_instruction": "place the brush on the front edge of the table", + "parquet": "data/chunk-027/episode_027533.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027533.mp4" + }, + { + "episode_id": 25396, + "source_index": 25396, + "raw_length": 18, + "instruction": "unzip zipper bag", + "canonical_instruction": "unzip zipper bag", + "parquet": "data/chunk-025/episode_025396.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025396.mp4" + }, + { + "episode_id": 27131, + "source_index": 27131, + "raw_length": 35, + "instruction": "move the green cloth to the right side of the blue fork", + "canonical_instruction": "move the green cloth to the right side of the blue fork", + "parquet": "data/chunk-027/episode_027131.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027131.mp4" + }, + { + "episode_id": 26235, + "source_index": 26235, + "raw_length": 26, + "instruction": "move the yellow figure to the right of the table", + "canonical_instruction": "move the yellow figure to the right of the table", + "parquet": "data/chunk-026/episode_026235.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026235.mp4" + }, + { + "episode_id": 13083, + "source_index": 13083, + "raw_length": 20, + "instruction": "take lid off pot or pan", + "canonical_instruction": "take lid off pot or pan", + "parquet": "data/chunk-013/episode_013083.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013083.mp4" + }, + { + "episode_id": 19910, + "source_index": 19910, + "raw_length": 23, + "instruction": "flip the top left edge of the cloth", + "canonical_instruction": "flip the top left edge of the cloth", + "parquet": "data/chunk-019/episode_019910.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019910.mp4" + }, + { + "episode_id": 15820, + "source_index": 15820, + "raw_length": 46, + "instruction": "move the blue block on the right side of the other block", + "canonical_instruction": "move the blue block on the right side of the other block", + "parquet": "data/chunk-015/episode_015820.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015820.mp4" + }, + { + "episode_id": 37636, + "source_index": 37636, + "raw_length": 35, + "instruction": "take the cheese out of the pot and put it to the right side of the burner", + "canonical_instruction": "take the cheese out of the pot and put it to the right side of the burner", + "parquet": "data/chunk-037/episode_037636.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037636.mp4" + }, + { + "episode_id": 14414, + "source_index": 14414, + "raw_length": 41, + "instruction": "move the green object and place it on the silver pot in front of the left side burner", + "canonical_instruction": "move the green object and place it on the silver pot in front of the left side burner", + "parquet": "data/chunk-014/episode_014414.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014414.mp4" + }, + { + "episode_id": 35414, + "source_index": 35414, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-035/episode_035414.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035414.mp4" + }, + { + "episode_id": 34419, + "source_index": 34419, + "raw_length": 33, + "instruction": "put knife on cutting board cardboard fence", + "canonical_instruction": "put knife on cutting board cardboard fence", + "parquet": "data/chunk-034/episode_034419.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034419.mp4" + }, + { + "episode_id": 47844, + "source_index": 47844, + "raw_length": 39, + "instruction": "Put the pepper in the pot.", + "canonical_instruction": "put the pepper in the pot", + "parquet": "data/chunk-047/episode_047844.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047844.mp4" + }, + { + "episode_id": 32385, + "source_index": 32385, + "raw_length": 33, + "instruction": "take spatula off plate sink", + "canonical_instruction": "take spatula off plate sink", + "parquet": "data/chunk-032/episode_032385.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032385.mp4" + }, + { + "episode_id": 43240, + "source_index": 43240, + "raw_length": 24, + "instruction": "put potato on plate", + "canonical_instruction": "put potato on plate", + "parquet": "data/chunk-043/episode_043240.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043240.mp4" + }, + { + "episode_id": 14399, + "source_index": 14399, + "raw_length": 46, + "instruction": "Take the yellow cube and put it on top of the red cube", + "canonical_instruction": "take the yellow cube and put it on top of the red cube", + "parquet": "data/chunk-014/episode_014399.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014399.mp4" + }, + { + "episode_id": 14392, + "source_index": 14392, + "raw_length": 17, + "instruction": "put corn in pot which is in sink", + "canonical_instruction": "put corn in pot which is in sink", + "parquet": "data/chunk-014/episode_014392.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014392.mp4" + }, + { + "episode_id": 4269, + "source_index": 4269, + "raw_length": 46, + "instruction": "move the object on the purple cloth above the bowl", + "canonical_instruction": "move the object on the purple cloth above the bowl", + "parquet": "data/chunk-004/episode_004269.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004269.mp4" + }, + { + "episode_id": 35641, + "source_index": 35641, + "raw_length": 27, + "instruction": "put the orange object in the drawer", + "canonical_instruction": "put the orange object in the drawer", + "parquet": "data/chunk-035/episode_035641.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035641.mp4" + }, + { + "episode_id": 869, + "source_index": 869, + "raw_length": 22, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-000/episode_000869.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000869.mp4" + }, + { + "episode_id": 22371, + "source_index": 22371, + "raw_length": 19, + "instruction": "put eggplant into pot or pan", + "canonical_instruction": "put eggplant into pot or pan", + "parquet": "data/chunk-022/episode_022371.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022371.mp4" + }, + { + "episode_id": 31750, + "source_index": 31750, + "raw_length": 33, + "instruction": "Take the banana out of the pot and put it on the left side of the stove.", + "canonical_instruction": "take the banana out of the pot and put it on the left side of the stove", + "parquet": "data/chunk-031/episode_031750.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031750.mp4" + }, + { + "episode_id": 23235, + "source_index": 23235, + "raw_length": 31, + "instruction": "Move the pot to the front of the table", + "canonical_instruction": "move the pot to the front of the table", + "parquet": "data/chunk-023/episode_023235.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023235.mp4" + }, + { + "episode_id": 26253, + "source_index": 26253, + "raw_length": 40, + "instruction": "take blue spoon and put it on top of the blue cloth", + "canonical_instruction": "take blue spoon and put it on top of the blue cloth", + "parquet": "data/chunk-026/episode_026253.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026253.mp4" + }, + { + "episode_id": 2209, + "source_index": 2209, + "raw_length": 86, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-002/episode_002209.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002209.mp4" + }, + { + "episode_id": 31613, + "source_index": 31613, + "raw_length": 35, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-031/episode_031613.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031613.mp4" + }, + { + "episode_id": 28547, + "source_index": 28547, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-028/episode_028547.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028547.mp4" + }, + { + "episode_id": 47534, + "source_index": 47534, + "raw_length": 44, + "instruction": "fold the cloth from the bottom left to the bottom right", + "canonical_instruction": "fold the cloth from the bottom left to the bottom right", + "parquet": "data/chunk-047/episode_047534.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047534.mp4" + }, + { + "episode_id": 8297, + "source_index": 8297, + "raw_length": 28, + "instruction": "put the silver pot on the top of the cloth", + "canonical_instruction": "put the silver pot on the top of the cloth", + "parquet": "data/chunk-008/episode_008297.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008297.mp4" + }, + { + "episode_id": 2510, + "source_index": 2510, + "raw_length": 33, + "instruction": "Close the boxer", + "canonical_instruction": "close the boxer", + "parquet": "data/chunk-002/episode_002510.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002510.mp4" + }, + { + "episode_id": 19427, + "source_index": 19427, + "raw_length": 37, + "instruction": "move vessel diagonally from bottom to top towards right", + "canonical_instruction": "move vessel diagonally from bottom to top towards right", + "parquet": "data/chunk-019/episode_019427.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019427.mp4" + }, + { + "episode_id": 7680, + "source_index": 7680, + "raw_length": 46, + "instruction": "Move the silver pot to the top right corner above the blue cloth", + "canonical_instruction": "move the silver pot to the top right corner above the blue cloth", + "parquet": "data/chunk-007/episode_007680.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007680.mp4" + }, + { + "episode_id": 24509, + "source_index": 24509, + "raw_length": 36, + "instruction": "put stuffedduck in pan", + "canonical_instruction": "put stuffedduck in pan", + "parquet": "data/chunk-024/episode_024509.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024509.mp4" + }, + { + "episode_id": 3549, + "source_index": 3549, + "raw_length": 28, + "instruction": "fold the clothes", + "canonical_instruction": "fold the clothes", + "parquet": "data/chunk-003/episode_003549.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003549.mp4" + }, + { + "episode_id": 23020, + "source_index": 23020, + "raw_length": 29, + "instruction": "unfold the cloth from top left to bottom right", + "canonical_instruction": "unfold the cloth from top left to bottom right", + "parquet": "data/chunk-023/episode_023020.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023020.mp4" + }, + { + "episode_id": 42272, + "source_index": 42272, + "raw_length": 46, + "instruction": "Place the pan just behind the violet cloth.", + "canonical_instruction": "place the pan just behind the violet cloth", + "parquet": "data/chunk-042/episode_042272.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042272.mp4" + }, + { + "episode_id": 21422, + "source_index": 21422, + "raw_length": 36, + "instruction": "Move the spoon from the bottom left of the table towards the top left of the table.", + "canonical_instruction": "move the spoon from the bottom left of the table towards the top left of the table", + "parquet": "data/chunk-021/episode_021422.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021422.mp4" + }, + { + "episode_id": 4327, + "source_index": 4327, + "raw_length": 19, + "instruction": "put corn in pot which is in sink", + "canonical_instruction": "put corn in pot which is in sink", + "parquet": "data/chunk-004/episode_004327.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004327.mp4" + }, + { + "episode_id": 1342, + "source_index": 1342, + "raw_length": 21, + "instruction": "put detergent from sink into drying rack", + "canonical_instruction": "put detergent from sink into drying rack", + "parquet": "data/chunk-001/episode_001342.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001342.mp4" + }, + { + "episode_id": 49688, + "source_index": 49688, + "raw_length": 54, + "instruction": "moved the spaghetti spoon from the sink to the left side of the sink sideways", + "canonical_instruction": "moved the spaghetti spoon from the sink to the left side of the sink sideways", + "parquet": "data/chunk-049/episode_049688.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049688.mp4" + }, + { + "episode_id": 21870, + "source_index": 21870, + "raw_length": 19, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-021/episode_021870.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021870.mp4" + }, + { + "episode_id": 14964, + "source_index": 14964, + "raw_length": 45, + "instruction": "move the red figure from the cloth and put it on the table", + "canonical_instruction": "move the red figure from the cloth and put it on the table", + "parquet": "data/chunk-014/episode_014964.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014964.mp4" + }, + { + "episode_id": 19011, + "source_index": 19011, + "raw_length": 45, + "instruction": "unfold the cloth from top left to bottom right", + "canonical_instruction": "unfold the cloth from top left to bottom right", + "parquet": "data/chunk-019/episode_019011.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019011.mp4" + }, + { + "episode_id": 41180, + "source_index": 41180, + "raw_length": 39, + "instruction": "fold the cloth from left to right", + "canonical_instruction": "fold the cloth from left to right", + "parquet": "data/chunk-041/episode_041180.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041180.mp4" + }, + { + "episode_id": 30834, + "source_index": 30834, + "raw_length": 44, + "instruction": "taked the yellow banana in the drawer and put it on the left side of table", + "canonical_instruction": "taked the yellow banana in the drawer and put it on the left side of table", + "parquet": "data/chunk-030/episode_030834.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030834.mp4" + }, + { + "episode_id": 28925, + "source_index": 28925, + "raw_length": 32, + "instruction": "Put the spoon between the sushi and microwave.", + "canonical_instruction": "put the spoon between the sushi and microwave", + "parquet": "data/chunk-028/episode_028925.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028925.mp4" + }, + { + "episode_id": 42984, + "source_index": 42984, + "raw_length": 21, + "instruction": "put pot or pan from sink into drying rack", + "canonical_instruction": "put pot or pan from sink into drying rack", + "parquet": "data/chunk-042/episode_042984.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042984.mp4" + }, + { + "episode_id": 21731, + "source_index": 21731, + "raw_length": 33, + "instruction": "Put the pan on the middle of the table", + "canonical_instruction": "put the pan on the middle of the table", + "parquet": "data/chunk-021/episode_021731.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021731.mp4" + }, + { + "episode_id": 13143, + "source_index": 13143, + "raw_length": 41, + "instruction": "pick and move container to top right side of table", + "canonical_instruction": "pick and move container to top right side of table", + "parquet": "data/chunk-013/episode_013143.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013143.mp4" + }, + { + "episode_id": 27473, + "source_index": 27473, + "raw_length": 21, + "instruction": "put carrot on cutting board", + "canonical_instruction": "put carrot on cutting board", + "parquet": "data/chunk-027/episode_027473.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027473.mp4" + }, + { + "episode_id": 35329, + "source_index": 35329, + "raw_length": 35, + "instruction": "moved the green can close to the red can", + "canonical_instruction": "moved the green can close to the red can", + "parquet": "data/chunk-035/episode_035329.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035329.mp4" + }, + { + "episode_id": 22861, + "source_index": 22861, + "raw_length": 46, + "instruction": "Place the brush onto the orange piece of cloth.", + "canonical_instruction": "place the brush onto the orange piece of cloth", + "parquet": "data/chunk-022/episode_022861.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022861.mp4" + }, + { + "episode_id": 31982, + "source_index": 31982, + "raw_length": 21, + "instruction": "put spoon in pot", + "canonical_instruction": "put spoon in pot", + "parquet": "data/chunk-031/episode_031982.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031982.mp4" + }, + { + "episode_id": 18432, + "source_index": 18432, + "raw_length": 38, + "instruction": "grabs the drawer by the handle and opens it", + "canonical_instruction": "grabs the drawer by the handle and opens it", + "parquet": "data/chunk-018/episode_018432.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018432.mp4" + }, + { + "episode_id": 2601, + "source_index": 2601, + "raw_length": 31, + "instruction": "put croissant inside silver bowl", + "canonical_instruction": "put croissant inside silver bowl", + "parquet": "data/chunk-002/episode_002601.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002601.mp4" + }, + { + "episode_id": 18413, + "source_index": 18413, + "raw_length": 53, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-018/episode_018413.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018413.mp4" + }, + { + "episode_id": 30533, + "source_index": 30533, + "raw_length": 30, + "instruction": "fold the cloth from rigth bottom to the left top", + "canonical_instruction": "fold the cloth from rigth bottom to the left top", + "parquet": "data/chunk-030/episode_030533.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030533.mp4" + }, + { + "episode_id": 52350, + "source_index": 52350, + "raw_length": 26, + "instruction": "put fork from basket to tray", + "canonical_instruction": "put fork from basket to tray", + "parquet": "data/chunk-052/episode_052350.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052350.mp4" + }, + { + "episode_id": 9161, + "source_index": 9161, + "raw_length": 36, + "instruction": "Move the pot and place it right next to the bell pepper.", + "canonical_instruction": "move the pot and place it right next to the bell pepper", + "parquet": "data/chunk-009/episode_009161.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009161.mp4" + }, + { + "episode_id": 33484, + "source_index": 33484, + "raw_length": 37, + "instruction": "moved the yellow knife to the bottom right side of the table", + "canonical_instruction": "moved the yellow knife to the bottom right side of the table", + "parquet": "data/chunk-033/episode_033484.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033484.mp4" + }, + { + "episode_id": 38505, + "source_index": 38505, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-038/episode_038505.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038505.mp4" + }, + { + "episode_id": 20141, + "source_index": 20141, + "raw_length": 21, + "instruction": "close brown1fbox flap", + "canonical_instruction": "close brown1fbox flap", + "parquet": "data/chunk-020/episode_020141.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020141.mp4" + }, + { + "episode_id": 45494, + "source_index": 45494, + "raw_length": 19, + "instruction": "pick up any cup", + "canonical_instruction": "pick up any cup", + "parquet": "data/chunk-045/episode_045494.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045494.mp4" + }, + { + "episode_id": 24667, + "source_index": 24667, + "raw_length": 26, + "instruction": "Place the pot immediately to the left of the mushroom", + "canonical_instruction": "place the pot immediately to the left of the mushroom", + "parquet": "data/chunk-024/episode_024667.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024667.mp4" + }, + { + "episode_id": 6273, + "source_index": 6273, + "raw_length": 46, + "instruction": "put the block on top of the yellow cube", + "canonical_instruction": "put the block on top of the yellow cube", + "parquet": "data/chunk-006/episode_006273.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006273.mp4" + }, + { + "episode_id": 21134, + "source_index": 21134, + "raw_length": 37, + "instruction": "move the green object in the right upper corner of the burner", + "canonical_instruction": "move the green object in the right upper corner of the burner", + "parquet": "data/chunk-021/episode_021134.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021134.mp4" + }, + { + "episode_id": 41086, + "source_index": 41086, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-041/episode_041086.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041086.mp4" + }, + { + "episode_id": 8401, + "source_index": 8401, + "raw_length": 33, + "instruction": "Pick up the red spoon on to of orange cloth and place it on its left", + "canonical_instruction": "pick up the red spoon on to of orange cloth and place it on its left", + "parquet": "data/chunk-008/episode_008401.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008401.mp4" + }, + { + "episode_id": 28085, + "source_index": 28085, + "raw_length": 29, + "instruction": "Pick up spoon and move it towards the front of the microwave.", + "canonical_instruction": "pick up spoon and move it towards the front of the microwave", + "parquet": "data/chunk-028/episode_028085.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028085.mp4" + }, + { + "episode_id": 20229, + "source_index": 20229, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-020/episode_020229.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020229.mp4" + }, + { + "episode_id": 25977, + "source_index": 25977, + "raw_length": 26, + "instruction": "Move the egg on the right side and put in on the table", + "canonical_instruction": "move the egg on the right side and put in on the table", + "parquet": "data/chunk-025/episode_025977.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025977.mp4" + }, + { + "episode_id": 42858, + "source_index": 42858, + "raw_length": 38, + "instruction": "Move the yellow spoon and place it on the orange towel", + "canonical_instruction": "move the yellow spoon and place it on the orange towel", + "parquet": "data/chunk-042/episode_042858.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042858.mp4" + }, + { + "episode_id": 6552, + "source_index": 6552, + "raw_length": 66, + "instruction": "put green thing to the pot", + "canonical_instruction": "put green thing to the pot", + "parquet": "data/chunk-006/episode_006552.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006552.mp4" + }, + { + "episode_id": 18062, + "source_index": 18062, + "raw_length": 21, + "instruction": "put sweet potato in pot", + "canonical_instruction": "put sweet potato in pot", + "parquet": "data/chunk-018/episode_018062.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018062.mp4" + }, + { + "episode_id": 48754, + "source_index": 48754, + "raw_length": 29, + "instruction": "move the cane to the right side of the table.", + "canonical_instruction": "move the cane to the right side of the table", + "parquet": "data/chunk-048/episode_048754.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048754.mp4" + }, + { + "episode_id": 17562, + "source_index": 17562, + "raw_length": 21, + "instruction": "fold cloth in half", + "canonical_instruction": "fold cloth in half", + "parquet": "data/chunk-017/episode_017562.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017562.mp4" + }, + { + "episode_id": 23677, + "source_index": 23677, + "raw_length": 46, + "instruction": "put the yellow block on top of the blue block", + "canonical_instruction": "put the yellow block on top of the blue block", + "parquet": "data/chunk-023/episode_023677.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023677.mp4" + }, + { + "episode_id": 48261, + "source_index": 48261, + "raw_length": 31, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-048/episode_048261.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048261.mp4" + }, + { + "episode_id": 21169, + "source_index": 21169, + "raw_length": 30, + "instruction": "move the bottle into the upper side of the table", + "canonical_instruction": "move the bottle into the upper side of the table", + "parquet": "data/chunk-021/episode_021169.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021169.mp4" + }, + { + "episode_id": 12409, + "source_index": 12409, + "raw_length": 37, + "instruction": "fold cloth from bottom right to top left", + "canonical_instruction": "fold cloth from bottom right to top left", + "parquet": "data/chunk-012/episode_012409.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012409.mp4" + }, + { + "episode_id": 9365, + "source_index": 9365, + "raw_length": 33, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-009/episode_009365.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009365.mp4" + }, + { + "episode_id": 35934, + "source_index": 35934, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-035/episode_035934.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035934.mp4" + }, + { + "episode_id": 44283, + "source_index": 44283, + "raw_length": 32, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-044/episode_044283.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044283.mp4" + }, + { + "episode_id": 33976, + "source_index": 33976, + "raw_length": 34, + "instruction": "Put the black and white object on the cloth.", + "canonical_instruction": "put the black and white object on the cloth", + "parquet": "data/chunk-033/episode_033976.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033976.mp4" + }, + { + "episode_id": 25421, + "source_index": 25421, + "raw_length": 32, + "instruction": "move the egg to the left burner", + "canonical_instruction": "move the egg to the left burner", + "parquet": "data/chunk-025/episode_025421.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025421.mp4" + }, + { + "episode_id": 35536, + "source_index": 35536, + "raw_length": 46, + "instruction": "pick the red strawberry and put it in the drawer", + "canonical_instruction": "pick the red strawberry and put it in the drawer", + "parquet": "data/chunk-035/episode_035536.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035536.mp4" + }, + { + "episode_id": 18336, + "source_index": 18336, + "raw_length": 35, + "instruction": "put the orange thing in the drawer", + "canonical_instruction": "put the orange thing in the drawer", + "parquet": "data/chunk-018/episode_018336.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018336.mp4" + }, + { + "episode_id": 49313, + "source_index": 49313, + "raw_length": 21, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-049/episode_049313.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049313.mp4" + }, + { + "episode_id": 22995, + "source_index": 22995, + "raw_length": 58, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-022/episode_022995.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022995.mp4" + }, + { + "episode_id": 19039, + "source_index": 19039, + "raw_length": 38, + "instruction": "take the pot lid and put it over the silver pot", + "canonical_instruction": "take the pot lid and put it over the silver pot", + "parquet": "data/chunk-019/episode_019039.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019039.mp4" + }, + { + "episode_id": 23034, + "source_index": 23034, + "raw_length": 37, + "instruction": "put the arch on top of the block", + "canonical_instruction": "put the arch on top of the block", + "parquet": "data/chunk-023/episode_023034.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023034.mp4" + }, + { + "episode_id": 38448, + "source_index": 38448, + "raw_length": 28, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-038/episode_038448.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038448.mp4" + }, + { + "episode_id": 5214, + "source_index": 5214, + "raw_length": 50, + "instruction": "remove the lemon from the silver pan and place it in the yellow colander", + "canonical_instruction": "remove the lemon from the silver pan and place it in the yellow colander", + "parquet": "data/chunk-005/episode_005214.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005214.mp4" + }, + { + "episode_id": 41516, + "source_index": 41516, + "raw_length": 23, + "instruction": "move cloth from bottom to top", + "canonical_instruction": "move cloth from bottom to top", + "parquet": "data/chunk-041/episode_041516.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041516.mp4" + }, + { + "episode_id": 7247, + "source_index": 7247, + "raw_length": 46, + "instruction": "move the cloth to the top left of the table", + "canonical_instruction": "move the cloth to the top left of the table", + "parquet": "data/chunk-007/episode_007247.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007247.mp4" + }, + { + "episode_id": 50949, + "source_index": 50949, + "raw_length": 25, + "instruction": "put the red bell pepper to the left side of the table", + "canonical_instruction": "put the red bell pepper to the left side of the table", + "parquet": "data/chunk-050/episode_050949.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050949.mp4" + }, + { + "episode_id": 20278, + "source_index": 20278, + "raw_length": 36, + "instruction": "fold the cloth from left to bottom right", + "canonical_instruction": "fold the cloth from left to bottom right", + "parquet": "data/chunk-020/episode_020278.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020278.mp4" + }, + { + "episode_id": 12402, + "source_index": 12402, + "raw_length": 33, + "instruction": "put corn in bowl sink", + "canonical_instruction": "put corn in bowl sink", + "parquet": "data/chunk-012/episode_012402.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012402.mp4" + }, + { + "episode_id": 6502, + "source_index": 6502, + "raw_length": 40, + "instruction": "put the green object on the left side of the table", + "canonical_instruction": "put the green object on the left side of the table", + "parquet": "data/chunk-006/episode_006502.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006502.mp4" + }, + { + "episode_id": 11873, + "source_index": 11873, + "raw_length": 23, + "instruction": "put the yellow banana to the bottom left of the stove", + "canonical_instruction": "put the yellow banana to the bottom left of the stove", + "parquet": "data/chunk-011/episode_011873.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011873.mp4" + }, + { + "episode_id": 32374, + "source_index": 32374, + "raw_length": 32, + "instruction": "Moved the pot on the yellow cloth to the left", + "canonical_instruction": "moved the pot on the yellow cloth to the left", + "parquet": "data/chunk-032/episode_032374.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032374.mp4" + }, + { + "episode_id": 32734, + "source_index": 32734, + "raw_length": 20, + "instruction": "put the object on the drawer", + "canonical_instruction": "put the object on the drawer", + "parquet": "data/chunk-032/episode_032734.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032734.mp4" + }, + { + "episode_id": 23731, + "source_index": 23731, + "raw_length": 46, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-023/episode_023731.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023731.mp4" + }, + { + "episode_id": 5616, + "source_index": 5616, + "raw_length": 21, + "instruction": "Move blue napkin to space in front of cans.", + "canonical_instruction": "move blue napkin to space in front of cans", + "parquet": "data/chunk-005/episode_005616.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005616.mp4" + }, + { + "episode_id": 1688, + "source_index": 1688, + "raw_length": 46, + "instruction": "Move the spoon to be next to the grapes.", + "canonical_instruction": "move the spoon to be next to the grapes", + "parquet": "data/chunk-001/episode_001688.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001688.mp4" + }, + { + "episode_id": 10367, + "source_index": 10367, + "raw_length": 23, + "instruction": "put the pot on the yellow cloth.", + "canonical_instruction": "put the pot on the yellow cloth", + "parquet": "data/chunk-010/episode_010367.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010367.mp4" + }, + { + "episode_id": 365, + "source_index": 365, + "raw_length": 38, + "instruction": "Move the pot to the back right side of the table", + "canonical_instruction": "move the pot to the back right side of the table", + "parquet": "data/chunk-000/episode_000365.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000365.mp4" + }, + { + "episode_id": 34139, + "source_index": 34139, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-034/episode_034139.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034139.mp4" + }, + { + "episode_id": 49636, + "source_index": 49636, + "raw_length": 45, + "instruction": "put the plus that is on top of the tower and put it on the table", + "canonical_instruction": "put the plus that is on top of the tower and put it on the table", + "parquet": "data/chunk-049/episode_049636.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049636.mp4" + }, + { + "episode_id": 28455, + "source_index": 28455, + "raw_length": 32, + "instruction": "move the silver pot in the top right of the burner", + "canonical_instruction": "move the silver pot in the top right of the burner", + "parquet": "data/chunk-028/episode_028455.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028455.mp4" + }, + { + "episode_id": 26269, + "source_index": 26269, + "raw_length": 88, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-026/episode_026269.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026269.mp4" + }, + { + "episode_id": 50216, + "source_index": 50216, + "raw_length": 29, + "instruction": "Pick up bowl and place under bread", + "canonical_instruction": "pick up bowl and place under bread", + "parquet": "data/chunk-050/episode_050216.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050216.mp4" + }, + { + "episode_id": 20496, + "source_index": 20496, + "raw_length": 38, + "instruction": "Place the blue spoon adjacent left to the pot", + "canonical_instruction": "place the blue spoon adjacent left to the pot", + "parquet": "data/chunk-020/episode_020496.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020496.mp4" + }, + { + "episode_id": 5761, + "source_index": 5761, + "raw_length": 38, + "instruction": "Move the pot between the hot dog and the spoon", + "canonical_instruction": "move the pot between the hot dog and the spoon", + "parquet": "data/chunk-005/episode_005761.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005761.mp4" + }, + { + "episode_id": 12634, + "source_index": 12634, + "raw_length": 19, + "instruction": "put broccoli in bowl", + "canonical_instruction": "put broccoli in bowl", + "parquet": "data/chunk-012/episode_012634.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012634.mp4" + }, + { + "episode_id": 25828, + "source_index": 25828, + "raw_length": 28, + "instruction": "put beet in pot sink", + "canonical_instruction": "put beet in pot sink", + "parquet": "data/chunk-025/episode_025828.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025828.mp4" + }, + { + "episode_id": 18127, + "source_index": 18127, + "raw_length": 20, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-018/episode_018127.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018127.mp4" + }, + { + "episode_id": 12982, + "source_index": 12982, + "raw_length": 26, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-012/episode_012982.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012982.mp4" + }, + { + "episode_id": 15770, + "source_index": 15770, + "raw_length": 42, + "instruction": "move bowel to towel", + "canonical_instruction": "move bowel to towel", + "parquet": "data/chunk-015/episode_015770.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015770.mp4" + }, + { + "episode_id": 9805, + "source_index": 9805, + "raw_length": 21, + "instruction": "pick up pot", + "canonical_instruction": "pick up pot", + "parquet": "data/chunk-009/episode_009805.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009805.mp4" + }, + { + "episode_id": 1278, + "source_index": 1278, + "raw_length": 46, + "instruction": "take the blue arch and place on top of the arch", + "canonical_instruction": "take the blue arch and place on top of the arch", + "parquet": "data/chunk-001/episode_001278.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001278.mp4" + }, + { + "episode_id": 39818, + "source_index": 39818, + "raw_length": 33, + "instruction": "open low fridge", + "canonical_instruction": "open low fridge", + "parquet": "data/chunk-039/episode_039818.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039818.mp4" + }, + { + "episode_id": 45727, + "source_index": 45727, + "raw_length": 34, + "instruction": "move the yellow object to the left side of the table", + "canonical_instruction": "move the yellow object to the left side of the table", + "parquet": "data/chunk-045/episode_045727.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045727.mp4" + }, + { + "episode_id": 30385, + "source_index": 30385, + "raw_length": 22, + "instruction": "move the red fork to the right side of sky-blue cloth", + "canonical_instruction": "move the red fork to the right side of sky-blue cloth", + "parquet": "data/chunk-030/episode_030385.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030385.mp4" + }, + { + "episode_id": 45078, + "source_index": 45078, + "raw_length": 27, + "instruction": "closed the drawer", + "canonical_instruction": "closed the drawer", + "parquet": "data/chunk-045/episode_045078.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045078.mp4" + }, + { + "episode_id": 51239, + "source_index": 51239, + "raw_length": 33, + "instruction": "move the green object to the lower-left burner", + "canonical_instruction": "move the green object to the lower-left burner", + "parquet": "data/chunk-051/episode_051239.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051239.mp4" + }, + { + "episode_id": 4427, + "source_index": 4427, + "raw_length": 41, + "instruction": "fold cloth from top right to center", + "canonical_instruction": "fold cloth from top right to center", + "parquet": "data/chunk-004/episode_004427.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004427.mp4" + }, + { + "episode_id": 14263, + "source_index": 14263, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-014/episode_014263.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014263.mp4" + }, + { + "episode_id": 53169, + "source_index": 53169, + "raw_length": 46, + "instruction": "place the block on top of the plus", + "canonical_instruction": "place the block on top of the plus", + "parquet": "data/chunk-053/episode_053169.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053169.mp4" + }, + { + "episode_id": 7971, + "source_index": 7971, + "raw_length": 35, + "instruction": "Move the fruit from the edge of the table in and place it on the blue cloth.", + "canonical_instruction": "move the fruit from the edge of the table in and place it on the blue cloth", + "parquet": "data/chunk-007/episode_007971.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007971.mp4" + }, + { + "episode_id": 25199, + "source_index": 25199, + "raw_length": 35, + "instruction": "Put the yellow knife on the left side of the green cloth", + "canonical_instruction": "put the yellow knife on the left side of the green cloth", + "parquet": "data/chunk-025/episode_025199.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025199.mp4" + }, + { + "episode_id": 3421, + "source_index": 3421, + "raw_length": 46, + "instruction": "move the blue cube to the left on green cube", + "canonical_instruction": "move the blue cube to the left on green cube", + "parquet": "data/chunk-003/episode_003421.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003421.mp4" + }, + { + "episode_id": 47605, + "source_index": 47605, + "raw_length": 28, + "instruction": "Place the spoon near the pot", + "canonical_instruction": "place the spoon near the pot", + "parquet": "data/chunk-047/episode_047605.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047605.mp4" + }, + { + "episode_id": 45738, + "source_index": 45738, + "raw_length": 46, + "instruction": "Place the beef into the steel pan.", + "canonical_instruction": "place the beef into the steel pan", + "parquet": "data/chunk-045/episode_045738.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045738.mp4" + }, + { + "episode_id": 30702, + "source_index": 30702, + "raw_length": 28, + "instruction": "move pot to lower middle area", + "canonical_instruction": "move pot to lower middle area", + "parquet": "data/chunk-030/episode_030702.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030702.mp4" + }, + { + "episode_id": 18848, + "source_index": 18848, + "raw_length": 20, + "instruction": "close large4fbox flaps", + "canonical_instruction": "close large4fbox flaps", + "parquet": "data/chunk-018/episode_018848.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018848.mp4" + }, + { + "episode_id": 17323, + "source_index": 17323, + "raw_length": 42, + "instruction": "Move the steel pan near the knife.", + "canonical_instruction": "move the steel pan near the knife", + "parquet": "data/chunk-017/episode_017323.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017323.mp4" + }, + { + "episode_id": 34110, + "source_index": 34110, + "raw_length": 40, + "instruction": "put the cylindrical hole inside the cylinder", + "canonical_instruction": "put the cylindrical hole inside the cylinder", + "parquet": "data/chunk-034/episode_034110.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034110.mp4" + }, + { + "episode_id": 18964, + "source_index": 18964, + "raw_length": 29, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-018/episode_018964.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018964.mp4" + }, + { + "episode_id": 21011, + "source_index": 21011, + "raw_length": 35, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-021/episode_021011.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021011.mp4" + }, + { + "episode_id": 16906, + "source_index": 16906, + "raw_length": 43, + "instruction": "removed the cube with a hole", + "canonical_instruction": "removed the cube with a hole", + "parquet": "data/chunk-016/episode_016906.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016906.mp4" + }, + { + "episode_id": 10942, + "source_index": 10942, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-010/episode_010942.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010942.mp4" + }, + { + "episode_id": 5352, + "source_index": 5352, + "raw_length": 76, + "instruction": "put corncob in pot or pan an put pot or pan on stove", + "canonical_instruction": "put corncob in pot or pan an put pot or pan on stove", + "parquet": "data/chunk-005/episode_005352.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005352.mp4" + }, + { + "episode_id": 40556, + "source_index": 40556, + "raw_length": 17, + "instruction": "move light switch to the right", + "canonical_instruction": "move light switch to the right", + "parquet": "data/chunk-040/episode_040556.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040556.mp4" + }, + { + "episode_id": 1239, + "source_index": 1239, + "raw_length": 26, + "instruction": "move silver pot to the right burner", + "canonical_instruction": "move silver pot to the right burner", + "parquet": "data/chunk-001/episode_001239.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001239.mp4" + }, + { + "episode_id": 11192, + "source_index": 11192, + "raw_length": 46, + "instruction": "unflod the cloth from top to bottom", + "canonical_instruction": "unflod the cloth from top to bottom", + "parquet": "data/chunk-011/episode_011192.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011192.mp4" + }, + { + "episode_id": 9159, + "source_index": 9159, + "raw_length": 35, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-009/episode_009159.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009159.mp4" + }, + { + "episode_id": 14602, + "source_index": 14602, + "raw_length": 29, + "instruction": "Put the potato in the cloth", + "canonical_instruction": "put the potato in the cloth", + "parquet": "data/chunk-014/episode_014602.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014602.mp4" + }, + { + "episode_id": 14922, + "source_index": 14922, + "raw_length": 29, + "instruction": "close cabinet", + "canonical_instruction": "close cabinet", + "parquet": "data/chunk-014/episode_014922.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014922.mp4" + }, + { + "episode_id": 33685, + "source_index": 33685, + "raw_length": 40, + "instruction": "move the silver pot to the left side of the table", + "canonical_instruction": "move the silver pot to the left side of the table", + "parquet": "data/chunk-033/episode_033685.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033685.mp4" + }, + { + "episode_id": 27328, + "source_index": 27328, + "raw_length": 46, + "instruction": "move blue toy from left to right", + "canonical_instruction": "move blue toy from left to right", + "parquet": "data/chunk-027/episode_027328.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027328.mp4" + }, + { + "episode_id": 52151, + "source_index": 52151, + "raw_length": 36, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-052/episode_052151.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052151.mp4" + }, + { + "episode_id": 24857, + "source_index": 24857, + "raw_length": 30, + "instruction": "take cup off plate", + "canonical_instruction": "take cup off plate", + "parquet": "data/chunk-024/episode_024857.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024857.mp4" + }, + { + "episode_id": 4246, + "source_index": 4246, + "raw_length": 18, + "instruction": "open drawer of box", + "canonical_instruction": "open drawer of box", + "parquet": "data/chunk-004/episode_004246.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004246.mp4" + }, + { + "episode_id": 35091, + "source_index": 35091, + "raw_length": 26, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-035/episode_035091.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035091.mp4" + }, + { + "episode_id": 11676, + "source_index": 11676, + "raw_length": 41, + "instruction": "déplacer la cuve vers le bas", + "canonical_instruction": "déplacer la cuve vers le bas", + "parquet": "data/chunk-011/episode_011676.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011676.mp4" + }, + { + "episode_id": 22252, + "source_index": 22252, + "raw_length": 22, + "instruction": "pick up blue pen and put into drawer", + "canonical_instruction": "pick up blue pen and put into drawer", + "parquet": "data/chunk-022/episode_022252.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022252.mp4" + }, + { + "episode_id": 15288, + "source_index": 15288, + "raw_length": 34, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-015/episode_015288.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015288.mp4" + }, + { + "episode_id": 22188, + "source_index": 22188, + "raw_length": 46, + "instruction": "move the bowl to the upper right corner of the cloth.", + "canonical_instruction": "move the bowl to the upper right corner of the cloth", + "parquet": "data/chunk-022/episode_022188.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022188.mp4" + }, + { + "episode_id": 7963, + "source_index": 7963, + "raw_length": 21, + "instruction": "pick up bit holder", + "canonical_instruction": "pick up bit holder", + "parquet": "data/chunk-007/episode_007963.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007963.mp4" + }, + { + "episode_id": 48441, + "source_index": 48441, + "raw_length": 21, + "instruction": "wipe pot with sponge", + "canonical_instruction": "wipe pot with sponge", + "parquet": "data/chunk-048/episode_048441.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048441.mp4" + }, + { + "episode_id": 19349, + "source_index": 19349, + "raw_length": 31, + "instruction": "Put the food above the blue rectangle.", + "canonical_instruction": "put the food above the blue rectangle", + "parquet": "data/chunk-019/episode_019349.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019349.mp4" + }, + { + "episode_id": 29824, + "source_index": 29824, + "raw_length": 35, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-029/episode_029824.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029824.mp4" + }, + { + "episode_id": 12648, + "source_index": 12648, + "raw_length": 28, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-012/episode_012648.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012648.mp4" + }, + { + "episode_id": 21189, + "source_index": 21189, + "raw_length": 30, + "instruction": "move the silver pot below the green towel", + "canonical_instruction": "move the silver pot below the green towel", + "parquet": "data/chunk-021/episode_021189.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021189.mp4" + }, + { + "episode_id": 47914, + "source_index": 47914, + "raw_length": 39, + "instruction": "put the banana inside the drawer", + "canonical_instruction": "put the banana inside the drawer", + "parquet": "data/chunk-047/episode_047914.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047914.mp4" + }, + { + "episode_id": 489, + "source_index": 489, + "raw_length": 32, + "instruction": "fold the cloth from bottom to top", + "canonical_instruction": "fold the cloth from bottom to top", + "parquet": "data/chunk-000/episode_000489.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000489.mp4" + }, + { + "episode_id": 50289, + "source_index": 50289, + "raw_length": 28, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-050/episode_050289.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050289.mp4" + }, + { + "episode_id": 46357, + "source_index": 46357, + "raw_length": 25, + "instruction": "Move the mushroom to just above the right burner.", + "canonical_instruction": "move the mushroom to just above the right burner", + "parquet": "data/chunk-046/episode_046357.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046357.mp4" + }, + { + "episode_id": 12048, + "source_index": 12048, + "raw_length": 30, + "instruction": "move the silver pot to the top left burner", + "canonical_instruction": "move the silver pot to the top left burner", + "parquet": "data/chunk-012/episode_012048.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012048.mp4" + }, + { + "episode_id": 13591, + "source_index": 13591, + "raw_length": 39, + "instruction": "Move the yellow cloth near left side of the spoon.", + "canonical_instruction": "move the yellow cloth near left side of the spoon", + "parquet": "data/chunk-013/episode_013591.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013591.mp4" + }, + { + "episode_id": 2466, + "source_index": 2466, + "raw_length": 44, + "instruction": "fold the cloth from right to left", + "canonical_instruction": "fold the cloth from right to left", + "parquet": "data/chunk-002/episode_002466.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002466.mp4" + }, + { + "episode_id": 6959, + "source_index": 6959, + "raw_length": 38, + "instruction": "put the banana to the bottom right side of the stove", + "canonical_instruction": "put the banana to the bottom right side of the stove", + "parquet": "data/chunk-006/episode_006959.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006959.mp4" + }, + { + "episode_id": 16794, + "source_index": 16794, + "raw_length": 25, + "instruction": "unfold the cloth from top right to bottm left", + "canonical_instruction": "unfold the cloth from top right to bottm left", + "parquet": "data/chunk-016/episode_016794.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016794.mp4" + }, + { + "episode_id": 24400, + "source_index": 24400, + "raw_length": 22, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-024/episode_024400.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024400.mp4" + }, + { + "episode_id": 620, + "source_index": 620, + "raw_length": 32, + "instruction": "moved the white basket on right side of the table", + "canonical_instruction": "moved the white basket on right side of the table", + "parquet": "data/chunk-000/episode_000620.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000620.mp4" + }, + { + "episode_id": 13967, + "source_index": 13967, + "raw_length": 19, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-013/episode_013967.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013967.mp4" + }, + { + "episode_id": 4495, + "source_index": 4495, + "raw_length": 29, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-004/episode_004495.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004495.mp4" + }, + { + "episode_id": 10595, + "source_index": 10595, + "raw_length": 32, + "instruction": "move the rectangular on top of the lower tower", + "canonical_instruction": "move the rectangular on top of the lower tower", + "parquet": "data/chunk-010/episode_010595.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010595.mp4" + }, + { + "episode_id": 47658, + "source_index": 47658, + "raw_length": 22, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-047/episode_047658.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047658.mp4" + }, + { + "episode_id": 24247, + "source_index": 24247, + "raw_length": 30, + "instruction": "Remove the red figure from the left edge of the cloth", + "canonical_instruction": "remove the red figure from the left edge of the cloth", + "parquet": "data/chunk-024/episode_024247.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024247.mp4" + }, + { + "episode_id": 27045, + "source_index": 27045, + "raw_length": 36, + "instruction": "move the spatula on the far edge of the table", + "canonical_instruction": "move the spatula on the far edge of the table", + "parquet": "data/chunk-027/episode_027045.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027045.mp4" + }, + { + "episode_id": 3021, + "source_index": 3021, + "raw_length": 44, + "instruction": "moved the green can nearer to the yellow and red can", + "canonical_instruction": "moved the green can nearer to the yellow and red can", + "parquet": "data/chunk-003/episode_003021.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003021.mp4" + }, + { + "episode_id": 13141, + "source_index": 13141, + "raw_length": 19, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-013/episode_013141.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013141.mp4" + }, + { + "episode_id": 41416, + "source_index": 41416, + "raw_length": 37, + "instruction": "unfolded the cloth from the bottom to the top side of the white piece.", + "canonical_instruction": "unfolded the cloth from the bottom to the top side of the white piece", + "parquet": "data/chunk-041/episode_041416.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041416.mp4" + }, + { + "episode_id": 38221, + "source_index": 38221, + "raw_length": 25, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-038/episode_038221.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038221.mp4" + }, + { + "episode_id": 45218, + "source_index": 45218, + "raw_length": 31, + "instruction": "put the orange object", + "canonical_instruction": "put the orange object", + "parquet": "data/chunk-045/episode_045218.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045218.mp4" + }, + { + "episode_id": 23778, + "source_index": 23778, + "raw_length": 41, + "instruction": "Place the orange to the right of the blue spoon", + "canonical_instruction": "place the orange to the right of the blue spoon", + "parquet": "data/chunk-023/episode_023778.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023778.mp4" + }, + { + "episode_id": 32837, + "source_index": 32837, + "raw_length": 35, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-032/episode_032837.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032837.mp4" + }, + { + "episode_id": 48150, + "source_index": 48150, + "raw_length": 21, + "instruction": "close small4fbox flaps", + "canonical_instruction": "close small4fbox flaps", + "parquet": "data/chunk-048/episode_048150.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048150.mp4" + }, + { + "episode_id": 52138, + "source_index": 52138, + "raw_length": 41, + "instruction": "take the corn out of the pot and put it above and to the right of the brush", + "canonical_instruction": "take the corn out of the pot and put it above and to the right of the brush", + "parquet": "data/chunk-052/episode_052138.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052138.mp4" + }, + { + "episode_id": 35335, + "source_index": 35335, + "raw_length": 21, + "instruction": "put pot or pan from sink into drying rack", + "canonical_instruction": "put pot or pan from sink into drying rack", + "parquet": "data/chunk-035/episode_035335.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035335.mp4" + }, + { + "episode_id": 11969, + "source_index": 11969, + "raw_length": 80, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-011/episode_011969.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011969.mp4" + }, + { + "episode_id": 2013, + "source_index": 2013, + "raw_length": 46, + "instruction": "unfold the cloth from right to top left", + "canonical_instruction": "unfold the cloth from right to top left", + "parquet": "data/chunk-002/episode_002013.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002013.mp4" + }, + { + "episode_id": 39366, + "source_index": 39366, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-039/episode_039366.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039366.mp4" + }, + { + "episode_id": 43121, + "source_index": 43121, + "raw_length": 21, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-043/episode_043121.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043121.mp4" + }, + { + "episode_id": 26523, + "source_index": 26523, + "raw_length": 34, + "instruction": "take the blue object out of the silver pan and move it to the top corner of the right burner", + "canonical_instruction": "take the blue object out of the silver pan and move it to the top corner of the right burner", + "parquet": "data/chunk-026/episode_026523.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026523.mp4" + }, + { + "episode_id": 10256, + "source_index": 10256, + "raw_length": 29, + "instruction": "move the silver pot to the left bottom side of the table", + "canonical_instruction": "move the silver pot to the left bottom side of the table", + "parquet": "data/chunk-010/episode_010256.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010256.mp4" + }, + { + "episode_id": 38969, + "source_index": 38969, + "raw_length": 82, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-038/episode_038969.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038969.mp4" + }, + { + "episode_id": 18467, + "source_index": 18467, + "raw_length": 95, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-018/episode_018467.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018467.mp4" + }, + { + "episode_id": 34928, + "source_index": 34928, + "raw_length": 44, + "instruction": "put the yellow rectangular block on top of the blue other rectangular block", + "canonical_instruction": "put the yellow rectangular block on top of the blue other rectangular block", + "parquet": "data/chunk-034/episode_034928.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034928.mp4" + }, + { + "episode_id": 38783, + "source_index": 38783, + "raw_length": 35, + "instruction": "Move silver pot from the corner to in front of the microwave.", + "canonical_instruction": "move silver pot from the corner to in front of the microwave", + "parquet": "data/chunk-038/episode_038783.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038783.mp4" + }, + { + "episode_id": 27647, + "source_index": 27647, + "raw_length": 29, + "instruction": "PICK UP THE BLENDER AND PUT ON WHITE TOWEL", + "canonical_instruction": "pick up the blender and put on white towel", + "parquet": "data/chunk-027/episode_027647.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027647.mp4" + }, + { + "episode_id": 15661, + "source_index": 15661, + "raw_length": 33, + "instruction": "put potato in pot cardboard fence", + "canonical_instruction": "put potato in pot cardboard fence", + "parquet": "data/chunk-015/episode_015661.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015661.mp4" + }, + { + "episode_id": 32651, + "source_index": 32651, + "raw_length": 27, + "instruction": "move the white basket to the left side of the table", + "canonical_instruction": "move the white basket to the left side of the table", + "parquet": "data/chunk-032/episode_032651.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032651.mp4" + }, + { + "episode_id": 14223, + "source_index": 14223, + "raw_length": 21, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-014/episode_014223.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014223.mp4" + }, + { + "episode_id": 43293, + "source_index": 43293, + "raw_length": 30, + "instruction": "move the elephant stuff toy to the top left corner of the stove", + "canonical_instruction": "move the elephant stuff toy to the top left corner of the stove", + "parquet": "data/chunk-043/episode_043293.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043293.mp4" + }, + { + "episode_id": 460, + "source_index": 460, + "raw_length": 25, + "instruction": "put corn in bowl sink", + "canonical_instruction": "put corn in bowl sink", + "parquet": "data/chunk-000/episode_000460.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000460.mp4" + }, + { + "episode_id": 29267, + "source_index": 29267, + "raw_length": 21, + "instruction": "close small4fbox flaps", + "canonical_instruction": "close small4fbox flaps", + "parquet": "data/chunk-029/episode_029267.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029267.mp4" + }, + { + "episode_id": 14773, + "source_index": 14773, + "raw_length": 43, + "instruction": "put the ball in the cup", + "canonical_instruction": "put the ball in the cup", + "parquet": "data/chunk-014/episode_014773.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014773.mp4" + }, + { + "episode_id": 34957, + "source_index": 34957, + "raw_length": 46, + "instruction": "unfold cloth from tip left to bottom right", + "canonical_instruction": "unfold cloth from tip left to bottom right", + "parquet": "data/chunk-034/episode_034957.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034957.mp4" + }, + { + "episode_id": 30375, + "source_index": 30375, + "raw_length": 76, + "instruction": "put redpepper on plate and brush in pot or pan on stove", + "canonical_instruction": "put redpepper on plate and brush in pot or pan on stove", + "parquet": "data/chunk-030/episode_030375.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030375.mp4" + }, + { + "episode_id": 31094, + "source_index": 31094, + "raw_length": 34, + "instruction": "Put the pepper inside the pan", + "canonical_instruction": "put the pepper inside the pan", + "parquet": "data/chunk-031/episode_031094.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031094.mp4" + }, + { + "episode_id": 33302, + "source_index": 33302, + "raw_length": 61, + "instruction": "put pot or pan on stove and put stuffedduck in pot or pan", + "canonical_instruction": "put pot or pan on stove and put stuffedduck in pot or pan", + "parquet": "data/chunk-033/episode_033302.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033302.mp4" + }, + { + "episode_id": 10211, + "source_index": 10211, + "raw_length": 25, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-010/episode_010211.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010211.mp4" + }, + { + "episode_id": 38778, + "source_index": 38778, + "raw_length": 26, + "instruction": "Open the drawer a little bit", + "canonical_instruction": "open the drawer a little bit", + "parquet": "data/chunk-038/episode_038778.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038778.mp4" + }, + { + "episode_id": 27771, + "source_index": 27771, + "raw_length": 42, + "instruction": "move the silver pot to the right side", + "canonical_instruction": "move the silver pot to the right side", + "parquet": "data/chunk-027/episode_027771.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027771.mp4" + }, + { + "episode_id": 18473, + "source_index": 18473, + "raw_length": 26, + "instruction": "move the blue fork to the bottom left burner", + "canonical_instruction": "move the blue fork to the bottom left burner", + "parquet": "data/chunk-018/episode_018473.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018473.mp4" + }, + { + "episode_id": 20517, + "source_index": 20517, + "raw_length": 37, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-020/episode_020517.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020517.mp4" + }, + { + "episode_id": 40774, + "source_index": 40774, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-040/episode_040774.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040774.mp4" + }, + { + "episode_id": 9232, + "source_index": 9232, + "raw_length": 28, + "instruction": "remove the block with a hole out off the stick", + "canonical_instruction": "remove the block with a hole out off the stick", + "parquet": "data/chunk-009/episode_009232.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009232.mp4" + }, + { + "episode_id": 37695, + "source_index": 37695, + "raw_length": 31, + "instruction": "placed the object ontop of the left back burner", + "canonical_instruction": "placed the object ontop of the left back burner", + "parquet": "data/chunk-037/episode_037695.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037695.mp4" + }, + { + "episode_id": 13261, + "source_index": 13261, + "raw_length": 33, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-013/episode_013261.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013261.mp4" + }, + { + "episode_id": 3, + "source_index": 3, + "raw_length": 46, + "instruction": "put the rectangle block on top of the red arch and yellow block", + "canonical_instruction": "put the rectangle block on top of the red arch and yellow block", + "parquet": "data/chunk-000/episode_000003.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000003.mp4" + }, + { + "episode_id": 28877, + "source_index": 28877, + "raw_length": 21, + "instruction": "put green squash into pot or pan", + "canonical_instruction": "put green squash into pot or pan", + "parquet": "data/chunk-028/episode_028877.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028877.mp4" + }, + { + "episode_id": 41071, + "source_index": 41071, + "raw_length": 37, + "instruction": "move the silver can to the rigth side", + "canonical_instruction": "move the silver can to the rigth side", + "parquet": "data/chunk-041/episode_041071.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041071.mp4" + }, + { + "episode_id": 2958, + "source_index": 2958, + "raw_length": 22, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-002/episode_002958.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002958.mp4" + }, + { + "episode_id": 24858, + "source_index": 24858, + "raw_length": 36, + "instruction": "Move the can to the right of the pot", + "canonical_instruction": "move the can to the right of the pot", + "parquet": "data/chunk-024/episode_024858.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024858.mp4" + }, + { + "episode_id": 39031, + "source_index": 39031, + "raw_length": 24, + "instruction": "take lid off pot or pan", + "canonical_instruction": "take lid off pot or pan", + "parquet": "data/chunk-039/episode_039031.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039031.mp4" + }, + { + "episode_id": 47178, + "source_index": 47178, + "raw_length": 30, + "instruction": "moved the pot to the top right corner of the burner", + "canonical_instruction": "moved the pot to the top right corner of the burner", + "parquet": "data/chunk-047/episode_047178.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047178.mp4" + }, + { + "episode_id": 51125, + "source_index": 51125, + "raw_length": 42, + "instruction": "fold the cloth from the top right to the bottom left", + "canonical_instruction": "fold the cloth from the top right to the bottom left", + "parquet": "data/chunk-051/episode_051125.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051125.mp4" + }, + { + "episode_id": 17695, + "source_index": 17695, + "raw_length": 35, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-017/episode_017695.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017695.mp4" + }, + { + "episode_id": 52885, + "source_index": 52885, + "raw_length": 21, + "instruction": "put spoon into pan", + "canonical_instruction": "put spoon into pan", + "parquet": "data/chunk-052/episode_052885.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052885.mp4" + }, + { + "episode_id": 40156, + "source_index": 40156, + "raw_length": 39, + "instruction": "fold the cloth from right to left", + "canonical_instruction": "fold the cloth from right to left", + "parquet": "data/chunk-040/episode_040156.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040156.mp4" + }, + { + "episode_id": 47410, + "source_index": 47410, + "raw_length": 21, + "instruction": "open brown1fbox flap", + "canonical_instruction": "open brown1fbox flap", + "parquet": "data/chunk-047/episode_047410.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047410.mp4" + }, + { + "episode_id": 31853, + "source_index": 31853, + "raw_length": 23, + "instruction": "moved the green rag on the left side", + "canonical_instruction": "moved the green rag on the left side", + "parquet": "data/chunk-031/episode_031853.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031853.mp4" + }, + { + "episode_id": 45014, + "source_index": 45014, + "raw_length": 31, + "instruction": "take the yelox objet and moce it in thr uper right", + "canonical_instruction": "take the yelox objet and moce it in thr uper right", + "parquet": "data/chunk-045/episode_045014.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045014.mp4" + }, + { + "episode_id": 39729, + "source_index": 39729, + "raw_length": 29, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-039/episode_039729.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039729.mp4" + }, + { + "episode_id": 42098, + "source_index": 42098, + "raw_length": 20, + "instruction": "close large4fbox flaps", + "canonical_instruction": "close large4fbox flaps", + "parquet": "data/chunk-042/episode_042098.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042098.mp4" + }, + { + "episode_id": 25604, + "source_index": 25604, + "raw_length": 36, + "instruction": "move the blue triangle beside the green arch", + "canonical_instruction": "move the blue triangle beside the green arch", + "parquet": "data/chunk-025/episode_025604.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025604.mp4" + }, + { + "episode_id": 50072, + "source_index": 50072, + "raw_length": 22, + "instruction": "move the green object from the silver pot to the right side of the burner", + "canonical_instruction": "move the green object from the silver pot to the right side of the burner", + "parquet": "data/chunk-050/episode_050072.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050072.mp4" + }, + { + "episode_id": 44124, + "source_index": 44124, + "raw_length": 29, + "instruction": "moved the can to the left side of the stove", + "canonical_instruction": "moved the can to the left side of the stove", + "parquet": "data/chunk-044/episode_044124.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044124.mp4" + }, + { + "episode_id": 8041, + "source_index": 8041, + "raw_length": 94, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-008/episode_008041.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008041.mp4" + }, + { + "episode_id": 45038, + "source_index": 45038, + "raw_length": 20, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-045/episode_045038.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045038.mp4" + }, + { + "episode_id": 40781, + "source_index": 40781, + "raw_length": 41, + "instruction": "grab the carrot and put it in the pot", + "canonical_instruction": "grab the carrot and put it in the pot", + "parquet": "data/chunk-040/episode_040781.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040781.mp4" + }, + { + "episode_id": 30162, + "source_index": 30162, + "raw_length": 43, + "instruction": "Placed the lid on the pot.", + "canonical_instruction": "placed the lid on the pot", + "parquet": "data/chunk-030/episode_030162.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030162.mp4" + }, + { + "episode_id": 7889, + "source_index": 7889, + "raw_length": 44, + "instruction": "movió la olla de plata al quemador inferior derecho de la estufa", + "canonical_instruction": "movió la olla de plata al quemador inferior derecho de la estufa", + "parquet": "data/chunk-007/episode_007889.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007889.mp4" + }, + { + "episode_id": 29616, + "source_index": 29616, + "raw_length": 28, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-029/episode_029616.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029616.mp4" + }, + { + "episode_id": 15455, + "source_index": 15455, + "raw_length": 24, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-015/episode_015455.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015455.mp4" + }, + { + "episode_id": 43987, + "source_index": 43987, + "raw_length": 31, + "instruction": "put the lid on the brown pot", + "canonical_instruction": "put the lid on the brown pot", + "parquet": "data/chunk-043/episode_043987.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043987.mp4" + }, + { + "episode_id": 9871, + "source_index": 9871, + "raw_length": 29, + "instruction": "Place the baster on the cloth.", + "canonical_instruction": "place the baster on the cloth", + "parquet": "data/chunk-009/episode_009871.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009871.mp4" + }, + { + "episode_id": 28102, + "source_index": 28102, + "raw_length": 39, + "instruction": "Move the can to the right of the pot and against the brick wall.", + "canonical_instruction": "move the can to the right of the pot and against the brick wall", + "parquet": "data/chunk-028/episode_028102.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028102.mp4" + }, + { + "episode_id": 48283, + "source_index": 48283, + "raw_length": 21, + "instruction": "turn faucet front to left", + "canonical_instruction": "turn faucet front to left", + "parquet": "data/chunk-048/episode_048283.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048283.mp4" + }, + { + "episode_id": 40807, + "source_index": 40807, + "raw_length": 29, + "instruction": "took the blue teaspoon and placed it in the center of the table.", + "canonical_instruction": "took the blue teaspoon and placed it in the center of the table", + "parquet": "data/chunk-040/episode_040807.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040807.mp4" + }, + { + "episode_id": 21562, + "source_index": 21562, + "raw_length": 39, + "instruction": "move the blue spoon between sink and stove", + "canonical_instruction": "move the blue spoon between sink and stove", + "parquet": "data/chunk-021/episode_021562.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021562.mp4" + }, + { + "episode_id": 16574, + "source_index": 16574, + "raw_length": 32, + "instruction": "move the can on the bottom left side of the table to the top left side of the table", + "canonical_instruction": "move the can on the bottom left side of the table to the top left side of the table", + "parquet": "data/chunk-016/episode_016574.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016574.mp4" + }, + { + "episode_id": 23289, + "source_index": 23289, + "raw_length": 41, + "instruction": "move the black and white object to the bottom right side", + "canonical_instruction": "move the black and white object to the bottom right side", + "parquet": "data/chunk-023/episode_023289.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023289.mp4" + }, + { + "episode_id": 33066, + "source_index": 33066, + "raw_length": 26, + "instruction": "pick up sponge and wipe plate", + "canonical_instruction": "pick up sponge and wipe plate", + "parquet": "data/chunk-033/episode_033066.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033066.mp4" + }, + { + "episode_id": 19973, + "source_index": 19973, + "raw_length": 27, + "instruction": "pick up scissors and put into drawer", + "canonical_instruction": "pick up scissors and put into drawer", + "parquet": "data/chunk-019/episode_019973.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019973.mp4" + }, + { + "episode_id": 35869, + "source_index": 35869, + "raw_length": 26, + "instruction": "put big spoon from basket to tray", + "canonical_instruction": "put big spoon from basket to tray", + "parquet": "data/chunk-035/episode_035869.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035869.mp4" + }, + { + "episode_id": 27931, + "source_index": 27931, + "raw_length": 46, + "instruction": "move the yellow cloth to above the spatula", + "canonical_instruction": "move the yellow cloth to above the spatula", + "parquet": "data/chunk-027/episode_027931.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027931.mp4" + }, + { + "episode_id": 46233, + "source_index": 46233, + "raw_length": 30, + "instruction": "move blue towel to just right of sushi", + "canonical_instruction": "move blue towel to just right of sushi", + "parquet": "data/chunk-046/episode_046233.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046233.mp4" + }, + { + "episode_id": 11614, + "source_index": 11614, + "raw_length": 28, + "instruction": "move the pot from the upper right side to the lower left side", + "canonical_instruction": "move the pot from the upper right side to the lower left side", + "parquet": "data/chunk-011/episode_011614.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011614.mp4" + }, + { + "episode_id": 50421, + "source_index": 50421, + "raw_length": 31, + "instruction": "move the yellow spoon to the front of the microwave", + "canonical_instruction": "move the yellow spoon to the front of the microwave", + "parquet": "data/chunk-050/episode_050421.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050421.mp4" + }, + { + "episode_id": 27139, + "source_index": 27139, + "raw_length": 41, + "instruction": "move blue spoon from right to left side of the table", + "canonical_instruction": "move blue spoon from right to left side of the table", + "parquet": "data/chunk-027/episode_027139.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027139.mp4" + }, + { + "episode_id": 39476, + "source_index": 39476, + "raw_length": 22, + "instruction": "put carrot in bowl", + "canonical_instruction": "put carrot in bowl", + "parquet": "data/chunk-039/episode_039476.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039476.mp4" + }, + { + "episode_id": 36812, + "source_index": 36812, + "raw_length": 30, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-036/episode_036812.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036812.mp4" + }, + { + "episode_id": 32062, + "source_index": 32062, + "raw_length": 26, + "instruction": "pick up scissors and put into drawer", + "canonical_instruction": "pick up scissors and put into drawer", + "parquet": "data/chunk-032/episode_032062.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032062.mp4" + }, + { + "episode_id": 6960, + "source_index": 6960, + "raw_length": 38, + "instruction": "unfold the cloth from the bottom right to the top left of the stove", + "canonical_instruction": "unfold the cloth from the bottom right to the top left of the stove", + "parquet": "data/chunk-006/episode_006960.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006960.mp4" + }, + { + "episode_id": 2830, + "source_index": 2830, + "raw_length": 25, + "instruction": "move the silver pot to the upper side of the blue cloth", + "canonical_instruction": "move the silver pot to the upper side of the blue cloth", + "parquet": "data/chunk-002/episode_002830.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002830.mp4" + }, + { + "episode_id": 4334, + "source_index": 4334, + "raw_length": 50, + "instruction": "moved the can on the bottom right side of the burner", + "canonical_instruction": "moved the can on the bottom right side of the burner", + "parquet": "data/chunk-004/episode_004334.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004334.mp4" + }, + { + "episode_id": 32347, + "source_index": 32347, + "raw_length": 73, + "instruction": "put pickle in pot or pan an put pot or pan on stove", + "canonical_instruction": "put pickle in pot or pan an put pot or pan on stove", + "parquet": "data/chunk-032/episode_032347.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032347.mp4" + }, + { + "episode_id": 25297, + "source_index": 25297, + "raw_length": 32, + "instruction": "Put the orange on the napkin.", + "canonical_instruction": "put the orange on the napkin", + "parquet": "data/chunk-025/episode_025297.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025297.mp4" + }, + { + "episode_id": 19673, + "source_index": 19673, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-019/episode_019673.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019673.mp4" + }, + { + "episode_id": 43634, + "source_index": 43634, + "raw_length": 40, + "instruction": "moved the silver pot to the lower right burner", + "canonical_instruction": "moved the silver pot to the lower right burner", + "parquet": "data/chunk-043/episode_043634.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043634.mp4" + }, + { + "episode_id": 1311, + "source_index": 1311, + "raw_length": 23, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-001/episode_001311.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001311.mp4" + }, + { + "episode_id": 36024, + "source_index": 36024, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-036/episode_036024.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036024.mp4" + }, + { + "episode_id": 43188, + "source_index": 43188, + "raw_length": 41, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-043/episode_043188.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043188.mp4" + }, + { + "episode_id": 20266, + "source_index": 20266, + "raw_length": 39, + "instruction": "put the red square block between two blue blocks", + "canonical_instruction": "put the red square block between two blue blocks", + "parquet": "data/chunk-020/episode_020266.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020266.mp4" + }, + { + "episode_id": 651, + "source_index": 651, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-000/episode_000651.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000651.mp4" + }, + { + "episode_id": 48340, + "source_index": 48340, + "raw_length": 27, + "instruction": "move the yellow towel in the upper side of the table", + "canonical_instruction": "move the yellow towel in the upper side of the table", + "parquet": "data/chunk-048/episode_048340.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048340.mp4" + }, + { + "episode_id": 9792, + "source_index": 9792, + "raw_length": 41, + "instruction": "Place the spatula on the orange cloth", + "canonical_instruction": "place the spatula on the orange cloth", + "parquet": "data/chunk-009/episode_009792.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009792.mp4" + }, + { + "episode_id": 1596, + "source_index": 1596, + "raw_length": 17, + "instruction": "put detergent from sink into drying rack", + "canonical_instruction": "put detergent from sink into drying rack", + "parquet": "data/chunk-001/episode_001596.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001596.mp4" + }, + { + "episode_id": 33772, + "source_index": 33772, + "raw_length": 39, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-033/episode_033772.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033772.mp4" + }, + { + "episode_id": 51406, + "source_index": 51406, + "raw_length": 44, + "instruction": "put the yellow cube on the top of the yellow cube on the right side", + "canonical_instruction": "put the yellow cube on the top of the yellow cube on the right side", + "parquet": "data/chunk-051/episode_051406.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051406.mp4" + }, + { + "episode_id": 2212, + "source_index": 2212, + "raw_length": 33, + "instruction": "Move pot to right of spoon.", + "canonical_instruction": "move pot to right of spoon", + "parquet": "data/chunk-002/episode_002212.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002212.mp4" + }, + { + "episode_id": 34147, + "source_index": 34147, + "raw_length": 34, + "instruction": "Pick up the spoon and place it on the blue cloth", + "canonical_instruction": "pick up the spoon and place it on the blue cloth", + "parquet": "data/chunk-034/episode_034147.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034147.mp4" + }, + { + "episode_id": 7555, + "source_index": 7555, + "raw_length": 40, + "instruction": "Move the croissant from the pot to left of the green cloth.", + "canonical_instruction": "move the croissant from the pot to left of the green cloth", + "parquet": "data/chunk-007/episode_007555.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007555.mp4" + }, + { + "episode_id": 26493, + "source_index": 26493, + "raw_length": 91, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-026/episode_026493.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026493.mp4" + }, + { + "episode_id": 51117, + "source_index": 51117, + "raw_length": 18, + "instruction": "pick up bit holder", + "canonical_instruction": "pick up bit holder", + "parquet": "data/chunk-051/episode_051117.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051117.mp4" + }, + { + "episode_id": 36978, + "source_index": 36978, + "raw_length": 46, + "instruction": "touch the clothe from bottom right to top left", + "canonical_instruction": "touch the clothe from bottom right to top left", + "parquet": "data/chunk-036/episode_036978.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036978.mp4" + }, + { + "episode_id": 6187, + "source_index": 6187, + "raw_length": 26, + "instruction": "sink", + "canonical_instruction": "sink", + "parquet": "data/chunk-006/episode_006187.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006187.mp4" + }, + { + "episode_id": 14605, + "source_index": 14605, + "raw_length": 29, + "instruction": "Close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-014/episode_014605.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014605.mp4" + }, + { + "episode_id": 20983, + "source_index": 20983, + "raw_length": 46, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-020/episode_020983.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020983.mp4" + }, + { + "episode_id": 26395, + "source_index": 26395, + "raw_length": 31, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-026/episode_026395.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026395.mp4" + }, + { + "episode_id": 39734, + "source_index": 39734, + "raw_length": 45, + "instruction": "move the cloth from top to bottom", + "canonical_instruction": "move the cloth from top to bottom", + "parquet": "data/chunk-039/episode_039734.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039734.mp4" + }, + { + "episode_id": 19340, + "source_index": 19340, + "raw_length": 26, + "instruction": "Put the mushroom into the pot", + "canonical_instruction": "put the mushroom into the pot", + "parquet": "data/chunk-019/episode_019340.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019340.mp4" + }, + { + "episode_id": 10197, + "source_index": 10197, + "raw_length": 22, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-010/episode_010197.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010197.mp4" + }, + { + "episode_id": 29741, + "source_index": 29741, + "raw_length": 22, + "instruction": "move the silver pot to the left top burner", + "canonical_instruction": "move the silver pot to the left top burner", + "parquet": "data/chunk-029/episode_029741.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029741.mp4" + }, + { + "episode_id": 48398, + "source_index": 48398, + "raw_length": 42, + "instruction": "Take the cucumber and put it inside the red pan", + "canonical_instruction": "take the cucumber and put it inside the red pan", + "parquet": "data/chunk-048/episode_048398.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048398.mp4" + }, + { + "episode_id": 10837, + "source_index": 10837, + "raw_length": 30, + "instruction": "Place the spatula on the far edge of the table", + "canonical_instruction": "place the spatula on the far edge of the table", + "parquet": "data/chunk-010/episode_010837.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010837.mp4" + }, + { + "episode_id": 30649, + "source_index": 30649, + "raw_length": 46, + "instruction": "move the chawk stick to the right", + "canonical_instruction": "move the chawk stick to the right", + "parquet": "data/chunk-030/episode_030649.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030649.mp4" + }, + { + "episode_id": 39923, + "source_index": 39923, + "raw_length": 17, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-039/episode_039923.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039923.mp4" + }, + { + "episode_id": 42400, + "source_index": 42400, + "raw_length": 21, + "instruction": "put pot or pan on stove", + "canonical_instruction": "put pot or pan on stove", + "parquet": "data/chunk-042/episode_042400.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042400.mp4" + }, + { + "episode_id": 18686, + "source_index": 18686, + "raw_length": 24, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-018/episode_018686.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018686.mp4" + }, + { + "episode_id": 17694, + "source_index": 17694, + "raw_length": 21, + "instruction": "Put the red spoon on the purple rag.", + "canonical_instruction": "put the red spoon on the purple rag", + "parquet": "data/chunk-017/episode_017694.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017694.mp4" + }, + { + "episode_id": 52338, + "source_index": 52338, + "raw_length": 29, + "instruction": "put the blue spatula to the right top side of the burner on the green cloth", + "canonical_instruction": "put the blue spatula to the right top side of the burner on the green cloth", + "parquet": "data/chunk-052/episode_052338.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052338.mp4" + }, + { + "episode_id": 19196, + "source_index": 19196, + "raw_length": 28, + "instruction": "put the brown figure on the top edge of the cloth", + "canonical_instruction": "put the brown figure on the top edge of the cloth", + "parquet": "data/chunk-019/episode_019196.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019196.mp4" + }, + { + "episode_id": 39602, + "source_index": 39602, + "raw_length": 26, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-039/episode_039602.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039602.mp4" + }, + { + "episode_id": 30624, + "source_index": 30624, + "raw_length": 25, + "instruction": "Moved the green lid jar to the lower left side of the table", + "canonical_instruction": "moved the green lid jar to the lower left side of the table", + "parquet": "data/chunk-030/episode_030624.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030624.mp4" + }, + { + "episode_id": 26372, + "source_index": 26372, + "raw_length": 23, + "instruction": "pick up violet Allen key", + "canonical_instruction": "pick up violet allen key", + "parquet": "data/chunk-026/episode_026372.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026372.mp4" + }, + { + "episode_id": 49107, + "source_index": 49107, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-049/episode_049107.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049107.mp4" + }, + { + "episode_id": 1423, + "source_index": 1423, + "raw_length": 30, + "instruction": "put the green cloth inside the washer", + "canonical_instruction": "put the green cloth inside the washer", + "parquet": "data/chunk-001/episode_001423.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001423.mp4" + }, + { + "episode_id": 46096, + "source_index": 46096, + "raw_length": 26, + "instruction": "put big spoon from basket to tray", + "canonical_instruction": "put big spoon from basket to tray", + "parquet": "data/chunk-046/episode_046096.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046096.mp4" + }, + { + "episode_id": 9534, + "source_index": 9534, + "raw_length": 37, + "instruction": "Move the orange in front of the microwave", + "canonical_instruction": "move the orange in front of the microwave", + "parquet": "data/chunk-009/episode_009534.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009534.mp4" + }, + { + "episode_id": 27779, + "source_index": 27779, + "raw_length": 42, + "instruction": "moved the red object to the left bottom corner of the cooker", + "canonical_instruction": "moved the red object to the left bottom corner of the cooker", + "parquet": "data/chunk-027/episode_027779.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027779.mp4" + }, + { + "episode_id": 48113, + "source_index": 48113, + "raw_length": 89, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-048/episode_048113.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048113.mp4" + }, + { + "episode_id": 48159, + "source_index": 48159, + "raw_length": 26, + "instruction": "put small spoon from basket to tray", + "canonical_instruction": "put small spoon from basket to tray", + "parquet": "data/chunk-048/episode_048159.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048159.mp4" + }, + { + "episode_id": 35577, + "source_index": 35577, + "raw_length": 34, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-035/episode_035577.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035577.mp4" + }, + { + "episode_id": 6079, + "source_index": 6079, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-006/episode_006079.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006079.mp4" + }, + { + "episode_id": 26642, + "source_index": 26642, + "raw_length": 21, + "instruction": "put sushi in pot or pan", + "canonical_instruction": "put sushi in pot or pan", + "parquet": "data/chunk-026/episode_026642.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026642.mp4" + }, + { + "episode_id": 17413, + "source_index": 17413, + "raw_length": 27, + "instruction": "put banana in colander", + "canonical_instruction": "put banana in colander", + "parquet": "data/chunk-017/episode_017413.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017413.mp4" + }, + { + "episode_id": 499, + "source_index": 499, + "raw_length": 27, + "instruction": "Moved the pot to the upper right corner of the burner", + "canonical_instruction": "moved the pot to the upper right corner of the burner", + "parquet": "data/chunk-000/episode_000499.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000499.mp4" + }, + { + "episode_id": 6379, + "source_index": 6379, + "raw_length": 38, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-006/episode_006379.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006379.mp4" + }, + { + "episode_id": 44061, + "source_index": 44061, + "raw_length": 39, + "instruction": "Move spatula to right of yellow cloth.", + "canonical_instruction": "move spatula to right of yellow cloth", + "parquet": "data/chunk-044/episode_044061.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044061.mp4" + }, + { + "episode_id": 47526, + "source_index": 47526, + "raw_length": 36, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-047/episode_047526.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047526.mp4" + }, + { + "episode_id": 26384, + "source_index": 26384, + "raw_length": 21, + "instruction": "take lid off pot or pan", + "canonical_instruction": "take lid off pot or pan", + "parquet": "data/chunk-026/episode_026384.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026384.mp4" + }, + { + "episode_id": 9184, + "source_index": 9184, + "raw_length": 28, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-009/episode_009184.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009184.mp4" + }, + { + "episode_id": 18940, + "source_index": 18940, + "raw_length": 52, + "instruction": "move the silver basket to the right burner", + "canonical_instruction": "move the silver basket to the right burner", + "parquet": "data/chunk-018/episode_018940.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018940.mp4" + }, + { + "episode_id": 50074, + "source_index": 50074, + "raw_length": 37, + "instruction": "Put the pot next to the cans.", + "canonical_instruction": "put the pot next to the cans", + "parquet": "data/chunk-050/episode_050074.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050074.mp4" + }, + { + "episode_id": 45147, + "source_index": 45147, + "raw_length": 46, + "instruction": "remove the yellow cube from the tower and put it in the middle of the table", + "canonical_instruction": "remove the yellow cube from the tower and put it in the middle of the table", + "parquet": "data/chunk-045/episode_045147.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045147.mp4" + }, + { + "episode_id": 30885, + "source_index": 30885, + "raw_length": 29, + "instruction": "close cabinet", + "canonical_instruction": "close cabinet", + "parquet": "data/chunk-030/episode_030885.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030885.mp4" + }, + { + "episode_id": 51907, + "source_index": 51907, + "raw_length": 21, + "instruction": "Place the knife on the blue towel", + "canonical_instruction": "place the knife on the blue towel", + "parquet": "data/chunk-051/episode_051907.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051907.mp4" + }, + { + "episode_id": 49674, + "source_index": 49674, + "raw_length": 36, + "instruction": "take the brocolli out of the silver pot and put it in the upper left side of the table", + "canonical_instruction": "take the brocolli out of the silver pot and put it in the upper left side of the table", + "parquet": "data/chunk-049/episode_049674.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049674.mp4" + }, + { + "episode_id": 4180, + "source_index": 4180, + "raw_length": 32, + "instruction": "pick orange toy and place it near spoon", + "canonical_instruction": "pick orange toy and place it near spoon", + "parquet": "data/chunk-004/episode_004180.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004180.mp4" + }, + { + "episode_id": 48755, + "source_index": 48755, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-048/episode_048755.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048755.mp4" + }, + { + "episode_id": 2944, + "source_index": 2944, + "raw_length": 34, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-002/episode_002944.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002944.mp4" + }, + { + "episode_id": 46480, + "source_index": 46480, + "raw_length": 56, + "instruction": "teke the green spatula and put it at the top left side of the table", + "canonical_instruction": "teke the green spatula and put it at the top left side of the table", + "parquet": "data/chunk-046/episode_046480.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046480.mp4" + }, + { + "episode_id": 24458, + "source_index": 24458, + "raw_length": 38, + "instruction": "MOVE THE ORANGE POT FROM RIGHT SIDE OF THE SINK TO THE BOTTOM LEFT SIDE OF THE SINK", + "canonical_instruction": "move the orange pot from right side of the sink to the bottom left side of the sink", + "parquet": "data/chunk-024/episode_024458.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024458.mp4" + }, + { + "episode_id": 34511, + "source_index": 34511, + "raw_length": 46, + "instruction": "take the brown thing out of the drawer and put on the left side of the table", + "canonical_instruction": "take the brown thing out of the drawer and put on the left side of the table", + "parquet": "data/chunk-034/episode_034511.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034511.mp4" + }, + { + "episode_id": 51937, + "source_index": 51937, + "raw_length": 21, + "instruction": "moved the blue towel to the bottom right of the table", + "canonical_instruction": "moved the blue towel to the bottom right of the table", + "parquet": "data/chunk-051/episode_051937.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051937.mp4" + }, + { + "episode_id": 5641, + "source_index": 5641, + "raw_length": 32, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-005/episode_005641.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005641.mp4" + }, + { + "episode_id": 12448, + "source_index": 12448, + "raw_length": 36, + "instruction": "remove the triangle from the tower and put it on the left side of the table", + "canonical_instruction": "remove the triangle from the tower and put it on the left side of the table", + "parquet": "data/chunk-012/episode_012448.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012448.mp4" + }, + { + "episode_id": 11014, + "source_index": 11014, + "raw_length": 46, + "instruction": "Hold and move blue spatula from top right edge of the table and place it on left side of blue cloth.", + "canonical_instruction": "hold and move blue spatula from top right edge of the table and place it on left side of blue cloth", + "parquet": "data/chunk-011/episode_011014.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011014.mp4" + }, + { + "episode_id": 16336, + "source_index": 16336, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-016/episode_016336.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016336.mp4" + }, + { + "episode_id": 9073, + "source_index": 9073, + "raw_length": 30, + "instruction": "fold cloth from front to bottom", + "canonical_instruction": "fold cloth from front to bottom", + "parquet": "data/chunk-009/episode_009073.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009073.mp4" + }, + { + "episode_id": 27017, + "source_index": 27017, + "raw_length": 85, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-027/episode_027017.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027017.mp4" + }, + { + "episode_id": 50046, + "source_index": 50046, + "raw_length": 36, + "instruction": "put the silver pot on top of the cloth", + "canonical_instruction": "put the silver pot on top of the cloth", + "parquet": "data/chunk-050/episode_050046.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050046.mp4" + }, + { + "episode_id": 48437, + "source_index": 48437, + "raw_length": 44, + "instruction": "unfold from top right to bottom left", + "canonical_instruction": "unfold from top right to bottom left", + "parquet": "data/chunk-048/episode_048437.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048437.mp4" + }, + { + "episode_id": 33222, + "source_index": 33222, + "raw_length": 46, + "instruction": "put the tall cylinder beside the short cylinder", + "canonical_instruction": "put the tall cylinder beside the short cylinder", + "parquet": "data/chunk-033/episode_033222.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033222.mp4" + }, + { + "episode_id": 20623, + "source_index": 20623, + "raw_length": 46, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-020/episode_020623.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020623.mp4" + }, + { + "episode_id": 21873, + "source_index": 21873, + "raw_length": 26, + "instruction": "put blueberries on plate sink", + "canonical_instruction": "put blueberries on plate sink", + "parquet": "data/chunk-021/episode_021873.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021873.mp4" + }, + { + "episode_id": 28936, + "source_index": 28936, + "raw_length": 46, + "instruction": "put the cube red on top", + "canonical_instruction": "put the cube red on top", + "parquet": "data/chunk-028/episode_028936.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028936.mp4" + }, + { + "episode_id": 49784, + "source_index": 49784, + "raw_length": 38, + "instruction": "unfold the cloth right to left", + "canonical_instruction": "unfold the cloth right to left", + "parquet": "data/chunk-049/episode_049784.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049784.mp4" + }, + { + "episode_id": 30475, + "source_index": 30475, + "raw_length": 35, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-030/episode_030475.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030475.mp4" + }, + { + "episode_id": 32633, + "source_index": 32633, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-032/episode_032633.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032633.mp4" + }, + { + "episode_id": 9079, + "source_index": 9079, + "raw_length": 46, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-009/episode_009079.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009079.mp4" + }, + { + "episode_id": 3030, + "source_index": 3030, + "raw_length": 32, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-003/episode_003030.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003030.mp4" + }, + { + "episode_id": 41872, + "source_index": 41872, + "raw_length": 19, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-041/episode_041872.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041872.mp4" + }, + { + "episode_id": 48059, + "source_index": 48059, + "raw_length": 56, + "instruction": "move the spatula to the bottom left of the table", + "canonical_instruction": "move the spatula to the bottom left of the table", + "parquet": "data/chunk-048/episode_048059.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048059.mp4" + }, + { + "episode_id": 2499, + "source_index": 2499, + "raw_length": 46, + "instruction": "move the blue block on top of the uncolored cubes", + "canonical_instruction": "move the blue block on top of the uncolored cubes", + "parquet": "data/chunk-002/episode_002499.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002499.mp4" + }, + { + "episode_id": 2307, + "source_index": 2307, + "raw_length": 36, + "instruction": "upright basil bottle cardboard fence", + "canonical_instruction": "upright basil bottle cardboard fence", + "parquet": "data/chunk-002/episode_002307.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002307.mp4" + }, + { + "episode_id": 20014, + "source_index": 20014, + "raw_length": 90, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-020/episode_020014.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020014.mp4" + }, + { + "episode_id": 24908, + "source_index": 24908, + "raw_length": 31, + "instruction": "move the brown pot to the upper right corner of the stove", + "canonical_instruction": "move the brown pot to the upper right corner of the stove", + "parquet": "data/chunk-024/episode_024908.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024908.mp4" + }, + { + "episode_id": 46753, + "source_index": 46753, + "raw_length": 24, + "instruction": "Put the spoon at the bottom table edge, right of the pot.", + "canonical_instruction": "put the spoon at the bottom table edge, right of the pot", + "parquet": "data/chunk-046/episode_046753.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046753.mp4" + }, + { + "episode_id": 3563, + "source_index": 3563, + "raw_length": 35, + "instruction": "grab the silver pot lid and put it on the lfet side of the stove", + "canonical_instruction": "grab the silver pot lid and put it on the lfet side of the stove", + "parquet": "data/chunk-003/episode_003563.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003563.mp4" + }, + { + "episode_id": 32389, + "source_index": 32389, + "raw_length": 30, + "instruction": "put the cone into the pot", + "canonical_instruction": "put the cone into the pot", + "parquet": "data/chunk-032/episode_032389.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032389.mp4" + }, + { + "episode_id": 44122, + "source_index": 44122, + "raw_length": 33, + "instruction": "poner el cesto blanco sobre el trapo azul", + "canonical_instruction": "poner el cesto blanco sobre el trapo azul", + "parquet": "data/chunk-044/episode_044122.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044122.mp4" + }, + { + "episode_id": 35513, + "source_index": 35513, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-035/episode_035513.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035513.mp4" + }, + { + "episode_id": 34716, + "source_index": 34716, + "raw_length": 33, + "instruction": "transfer the red spoon on the lower right burner", + "canonical_instruction": "transfer the red spoon on the lower right burner", + "parquet": "data/chunk-034/episode_034716.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034716.mp4" + }, + { + "episode_id": 14781, + "source_index": 14781, + "raw_length": 33, + "instruction": "take the yellow object and put it in the drawer", + "canonical_instruction": "take the yellow object and put it in the drawer", + "parquet": "data/chunk-014/episode_014781.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014781.mp4" + }, + { + "episode_id": 5361, + "source_index": 5361, + "raw_length": 22, + "instruction": "move the orange cloth up", + "canonical_instruction": "move the orange cloth up", + "parquet": "data/chunk-005/episode_005361.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005361.mp4" + }, + { + "episode_id": 677, + "source_index": 677, + "raw_length": 50, + "instruction": "remove the green spatula in dish drainer", + "canonical_instruction": "remove the green spatula in dish drainer", + "parquet": "data/chunk-000/episode_000677.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000677.mp4" + }, + { + "episode_id": 10488, + "source_index": 10488, + "raw_length": 20, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-010/episode_010488.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010488.mp4" + }, + { + "episode_id": 43046, + "source_index": 43046, + "raw_length": 45, + "instruction": "fold the cloth from bottom to top", + "canonical_instruction": "fold the cloth from bottom to top", + "parquet": "data/chunk-043/episode_043046.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043046.mp4" + }, + { + "episode_id": 21051, + "source_index": 21051, + "raw_length": 20, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-021/episode_021051.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021051.mp4" + }, + { + "episode_id": 51990, + "source_index": 51990, + "raw_length": 20, + "instruction": "put carrot on cutting board", + "canonical_instruction": "put carrot on cutting board", + "parquet": "data/chunk-051/episode_051990.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051990.mp4" + }, + { + "episode_id": 633, + "source_index": 633, + "raw_length": 20, + "instruction": "open small4fbox flaps", + "canonical_instruction": "open small4fbox flaps", + "parquet": "data/chunk-000/episode_000633.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000633.mp4" + }, + { + "episode_id": 43412, + "source_index": 43412, + "raw_length": 30, + "instruction": "open low fridge", + "canonical_instruction": "open low fridge", + "parquet": "data/chunk-043/episode_043412.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043412.mp4" + }, + { + "episode_id": 38912, + "source_index": 38912, + "raw_length": 25, + "instruction": "Pick up the napkin and put it in front of the cans.", + "canonical_instruction": "pick up the napkin and put it in front of the cans", + "parquet": "data/chunk-038/episode_038912.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038912.mp4" + }, + { + "episode_id": 24330, + "source_index": 24330, + "raw_length": 25, + "instruction": "move the silver pot from the lower left burner to the lower right burner", + "canonical_instruction": "move the silver pot from the lower left burner to the lower right burner", + "parquet": "data/chunk-024/episode_024330.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024330.mp4" + }, + { + "episode_id": 52221, + "source_index": 52221, + "raw_length": 26, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-052/episode_052221.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052221.mp4" + }, + { + "episode_id": 36594, + "source_index": 36594, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-036/episode_036594.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036594.mp4" + }, + { + "episode_id": 22791, + "source_index": 22791, + "raw_length": 34, + "instruction": "move the thing to the bottom of the silver pot", + "canonical_instruction": "move the thing to the bottom of the silver pot", + "parquet": "data/chunk-022/episode_022791.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022791.mp4" + }, + { + "episode_id": 28256, + "source_index": 28256, + "raw_length": 18, + "instruction": "put pot on stove which is near stove", + "canonical_instruction": "put pot on stove which is near stove", + "parquet": "data/chunk-028/episode_028256.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028256.mp4" + }, + { + "episode_id": 17214, + "source_index": 17214, + "raw_length": 21, + "instruction": "put knife in pot or pan", + "canonical_instruction": "put knife in pot or pan", + "parquet": "data/chunk-017/episode_017214.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017214.mp4" + }, + { + "episode_id": 4157, + "source_index": 4157, + "raw_length": 31, + "instruction": "Place the metal pot in front of the cans.", + "canonical_instruction": "place the metal pot in front of the cans", + "parquet": "data/chunk-004/episode_004157.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004157.mp4" + }, + { + "episode_id": 53083, + "source_index": 53083, + "raw_length": 46, + "instruction": "move spatula to the upper right corner of the stove", + "canonical_instruction": "move spatula to the upper right corner of the stove", + "parquet": "data/chunk-053/episode_053083.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053083.mp4" + }, + { + "episode_id": 28985, + "source_index": 28985, + "raw_length": 30, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-028/episode_028985.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028985.mp4" + }, + { + "episode_id": 32135, + "source_index": 32135, + "raw_length": 26, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-032/episode_032135.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032135.mp4" + }, + { + "episode_id": 45114, + "source_index": 45114, + "raw_length": 33, + "instruction": "puts an orange thing in the drawer", + "canonical_instruction": "puts an orange thing in the drawer", + "parquet": "data/chunk-045/episode_045114.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045114.mp4" + }, + { + "episode_id": 21202, + "source_index": 21202, + "raw_length": 35, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-021/episode_021202.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021202.mp4" + }, + { + "episode_id": 41269, + "source_index": 41269, + "raw_length": 29, + "instruction": "Put the spoon to the left of the mushroom", + "canonical_instruction": "put the spoon to the left of the mushroom", + "parquet": "data/chunk-041/episode_041269.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041269.mp4" + }, + { + "episode_id": 40765, + "source_index": 40765, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-040/episode_040765.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040765.mp4" + }, + { + "episode_id": 18089, + "source_index": 18089, + "raw_length": 26, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-018/episode_018089.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018089.mp4" + }, + { + "episode_id": 25174, + "source_index": 25174, + "raw_length": 31, + "instruction": "put the red object above the orange cloth", + "canonical_instruction": "put the red object above the orange cloth", + "parquet": "data/chunk-025/episode_025174.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025174.mp4" + }, + { + "episode_id": 41909, + "source_index": 41909, + "raw_length": 54, + "instruction": "move the broccoli in the silver pot", + "canonical_instruction": "move the broccoli in the silver pot", + "parquet": "data/chunk-041/episode_041909.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041909.mp4" + }, + { + "episode_id": 14152, + "source_index": 14152, + "raw_length": 35, + "instruction": "PICK UP THE SPOON AND PUT NEAR THE VESSEL", + "canonical_instruction": "pick up the spoon and put near the vessel", + "parquet": "data/chunk-014/episode_014152.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014152.mp4" + }, + { + "episode_id": 25486, + "source_index": 25486, + "raw_length": 46, + "instruction": "Place the spatula on the right edge of the table", + "canonical_instruction": "place the spatula on the right edge of the table", + "parquet": "data/chunk-025/episode_025486.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025486.mp4" + }, + { + "episode_id": 37216, + "source_index": 37216, + "raw_length": 45, + "instruction": "rotate the yellow knife to the right", + "canonical_instruction": "rotate the yellow knife to the right", + "parquet": "data/chunk-037/episode_037216.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037216.mp4" + }, + { + "episode_id": 9310, + "source_index": 9310, + "raw_length": 27, + "instruction": "moved the silver lid of the pot to the left side of the table", + "canonical_instruction": "moved the silver lid of the pot to the left side of the table", + "parquet": "data/chunk-009/episode_009310.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009310.mp4" + }, + { + "episode_id": 46663, + "source_index": 46663, + "raw_length": 45, + "instruction": "TAKE THINGS IN A BOX", + "canonical_instruction": "take things in a box", + "parquet": "data/chunk-046/episode_046663.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046663.mp4" + }, + { + "episode_id": 1326, + "source_index": 1326, + "raw_length": 26, + "instruction": "put spoon on plate", + "canonical_instruction": "put spoon on plate", + "parquet": "data/chunk-001/episode_001326.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001326.mp4" + }, + { + "episode_id": 32603, + "source_index": 32603, + "raw_length": 27, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-032/episode_032603.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032603.mp4" + }, + { + "episode_id": 51238, + "source_index": 51238, + "raw_length": 34, + "instruction": "fold the cloth from bottom to top", + "canonical_instruction": "fold the cloth from bottom to top", + "parquet": "data/chunk-051/episode_051238.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051238.mp4" + }, + { + "episode_id": 12735, + "source_index": 12735, + "raw_length": 33, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-012/episode_012735.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012735.mp4" + }, + { + "episode_id": 19378, + "source_index": 19378, + "raw_length": 46, + "instruction": "move the green cipher to the middle of the table", + "canonical_instruction": "move the green cipher to the middle of the table", + "parquet": "data/chunk-019/episode_019378.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019378.mp4" + }, + { + "episode_id": 26007, + "source_index": 26007, + "raw_length": 34, + "instruction": "move the cylinder to the left", + "canonical_instruction": "move the cylinder to the left", + "parquet": "data/chunk-026/episode_026007.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026007.mp4" + }, + { + "episode_id": 6955, + "source_index": 6955, + "raw_length": 22, + "instruction": "take the orange thing and place it on the purple cloth", + "canonical_instruction": "take the orange thing and place it on the purple cloth", + "parquet": "data/chunk-006/episode_006955.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006955.mp4" + }, + { + "episode_id": 7960, + "source_index": 7960, + "raw_length": 41, + "instruction": "move the cloth from bottom to the top of the table", + "canonical_instruction": "move the cloth from bottom to the top of the table", + "parquet": "data/chunk-007/episode_007960.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007960.mp4" + }, + { + "episode_id": 42922, + "source_index": 42922, + "raw_length": 32, + "instruction": "Place pot above the the top right corner of the purp[le cloth in the table.", + "canonical_instruction": "place pot above the the top right corner of the purp[le cloth in the table", + "parquet": "data/chunk-042/episode_042922.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042922.mp4" + }, + { + "episode_id": 12024, + "source_index": 12024, + "raw_length": 34, + "instruction": "move the green thing to the left of the silver pan", + "canonical_instruction": "move the green thing to the left of the silver pan", + "parquet": "data/chunk-012/episode_012024.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012024.mp4" + }, + { + "episode_id": 28319, + "source_index": 28319, + "raw_length": 29, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-028/episode_028319.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028319.mp4" + }, + { + "episode_id": 7123, + "source_index": 7123, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-007/episode_007123.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007123.mp4" + }, + { + "episode_id": 22290, + "source_index": 22290, + "raw_length": 32, + "instruction": "move the orange cloth to the bottom corner of the burners", + "canonical_instruction": "move the orange cloth to the bottom corner of the burners", + "parquet": "data/chunk-022/episode_022290.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022290.mp4" + }, + { + "episode_id": 6398, + "source_index": 6398, + "raw_length": 21, + "instruction": "Slide towel and place it in front of the canned goods.", + "canonical_instruction": "slide towel and place it in front of the canned goods", + "parquet": "data/chunk-006/episode_006398.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006398.mp4" + }, + { + "episode_id": 24269, + "source_index": 24269, + "raw_length": 34, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-024/episode_024269.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024269.mp4" + }, + { + "episode_id": 3814, + "source_index": 3814, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-003/episode_003814.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003814.mp4" + }, + { + "episode_id": 36225, + "source_index": 36225, + "raw_length": 26, + "instruction": "put corn in bowl sink", + "canonical_instruction": "put corn in bowl sink", + "parquet": "data/chunk-036/episode_036225.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036225.mp4" + }, + { + "episode_id": 8916, + "source_index": 8916, + "raw_length": 28, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-008/episode_008916.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008916.mp4" + }, + { + "episode_id": 43014, + "source_index": 43014, + "raw_length": 26, + "instruction": "Take the cover and put it on the silver pot.", + "canonical_instruction": "take the cover and put it on the silver pot", + "parquet": "data/chunk-043/episode_043014.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043014.mp4" + }, + { + "episode_id": 17823, + "source_index": 17823, + "raw_length": 34, + "instruction": "put sushi in pot cardboard fence", + "canonical_instruction": "put sushi in pot cardboard fence", + "parquet": "data/chunk-017/episode_017823.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017823.mp4" + }, + { + "episode_id": 52352, + "source_index": 52352, + "raw_length": 31, + "instruction": "move the can to the bottom right side of the stove beside the yellow brush", + "canonical_instruction": "move the can to the bottom right side of the stove beside the yellow brush", + "parquet": "data/chunk-052/episode_052352.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052352.mp4" + }, + { + "episode_id": 47441, + "source_index": 47441, + "raw_length": 46, + "instruction": "put the plus on top of the cylinder", + "canonical_instruction": "put the plus on top of the cylinder", + "parquet": "data/chunk-047/episode_047441.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047441.mp4" + }, + { + "episode_id": 25748, + "source_index": 25748, + "raw_length": 31, + "instruction": "take banana out of colander", + "canonical_instruction": "take banana out of colander", + "parquet": "data/chunk-025/episode_025748.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025748.mp4" + }, + { + "episode_id": 14700, + "source_index": 14700, + "raw_length": 35, + "instruction": "The robot fold the cloth to the right hand", + "canonical_instruction": "the robot fold the cloth to the right hand", + "parquet": "data/chunk-014/episode_014700.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014700.mp4" + }, + { + "episode_id": 12964, + "source_index": 12964, + "raw_length": 26, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-012/episode_012964.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012964.mp4" + }, + { + "episode_id": 52759, + "source_index": 52759, + "raw_length": 29, + "instruction": "move the orange object and put it the left burner", + "canonical_instruction": "move the orange object and put it the left burner", + "parquet": "data/chunk-052/episode_052759.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052759.mp4" + }, + { + "episode_id": 20783, + "source_index": 20783, + "raw_length": 49, + "instruction": "put strawberry in the silver pot", + "canonical_instruction": "put strawberry in the silver pot", + "parquet": "data/chunk-020/episode_020783.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020783.mp4" + }, + { + "episode_id": 18646, + "source_index": 18646, + "raw_length": 25, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-018/episode_018646.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018646.mp4" + }, + { + "episode_id": 42383, + "source_index": 42383, + "raw_length": 64, + "instruction": "move the light blue cloth to the lower right corner of the table below the light yellow spoon", + "canonical_instruction": "move the light blue cloth to the lower right corner of the table below the light yellow spoon", + "parquet": "data/chunk-042/episode_042383.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042383.mp4" + }, + { + "episode_id": 10317, + "source_index": 10317, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-010/episode_010317.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010317.mp4" + }, + { + "episode_id": 18652, + "source_index": 18652, + "raw_length": 19, + "instruction": "put corn in pot which is in sink", + "canonical_instruction": "put corn in pot which is in sink", + "parquet": "data/chunk-018/episode_018652.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018652.mp4" + }, + { + "episode_id": 21210, + "source_index": 21210, + "raw_length": 25, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-021/episode_021210.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021210.mp4" + }, + { + "episode_id": 37802, + "source_index": 37802, + "raw_length": 28, + "instruction": "Move the yellow towel in front of the yellow brush", + "canonical_instruction": "move the yellow towel in front of the yellow brush", + "parquet": "data/chunk-037/episode_037802.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037802.mp4" + }, + { + "episode_id": 10006, + "source_index": 10006, + "raw_length": 21, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-010/episode_010006.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010006.mp4" + }, + { + "episode_id": 17205, + "source_index": 17205, + "raw_length": 27, + "instruction": "removed silver lid and placed it on the purple cloth on botttom right of the table", + "canonical_instruction": "removed silver lid and placed it on the purple cloth on botttom right of the table", + "parquet": "data/chunk-017/episode_017205.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017205.mp4" + }, + { + "episode_id": 23585, + "source_index": 23585, + "raw_length": 46, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-023/episode_023585.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023585.mp4" + }, + { + "episode_id": 2143, + "source_index": 2143, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-002/episode_002143.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002143.mp4" + }, + { + "episode_id": 30730, + "source_index": 30730, + "raw_length": 21, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-030/episode_030730.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030730.mp4" + }, + { + "episode_id": 21894, + "source_index": 21894, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-021/episode_021894.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021894.mp4" + }, + { + "episode_id": 8299, + "source_index": 8299, + "raw_length": 29, + "instruction": "topple hot sauce bottle cardboard fence", + "canonical_instruction": "topple hot sauce bottle cardboard fence", + "parquet": "data/chunk-008/episode_008299.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008299.mp4" + }, + { + "episode_id": 6910, + "source_index": 6910, + "raw_length": 26, + "instruction": "Move the blue cloth behind the pot with the green sausage", + "canonical_instruction": "move the blue cloth behind the pot with the green sausage", + "parquet": "data/chunk-006/episode_006910.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006910.mp4" + }, + { + "episode_id": 35202, + "source_index": 35202, + "raw_length": 21, + "instruction": "Move the spoon to the lower right corner of table.", + "canonical_instruction": "move the spoon to the lower right corner of table", + "parquet": "data/chunk-035/episode_035202.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035202.mp4" + }, + { + "episode_id": 13466, + "source_index": 13466, + "raw_length": 19, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-013/episode_013466.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013466.mp4" + }, + { + "episode_id": 27359, + "source_index": 27359, + "raw_length": 42, + "instruction": "Unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-027/episode_027359.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027359.mp4" + }, + { + "episode_id": 29683, + "source_index": 29683, + "raw_length": 21, + "instruction": "open book", + "canonical_instruction": "open book", + "parquet": "data/chunk-029/episode_029683.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029683.mp4" + }, + { + "episode_id": 46798, + "source_index": 46798, + "raw_length": 35, + "instruction": "Place towel to the left of the red spoon", + "canonical_instruction": "place towel to the left of the red spoon", + "parquet": "data/chunk-046/episode_046798.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046798.mp4" + }, + { + "episode_id": 32668, + "source_index": 32668, + "raw_length": 21, + "instruction": "pick up bowl and put in small4fbox", + "canonical_instruction": "pick up bowl and put in small4fbox", + "parquet": "data/chunk-032/episode_032668.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032668.mp4" + }, + { + "episode_id": 46347, + "source_index": 46347, + "raw_length": 32, + "instruction": "pushing the drawer", + "canonical_instruction": "pushing the drawer", + "parquet": "data/chunk-046/episode_046347.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046347.mp4" + }, + { + "episode_id": 39571, + "source_index": 39571, + "raw_length": 21, + "instruction": "put pot or pan on stove", + "canonical_instruction": "put pot or pan on stove", + "parquet": "data/chunk-039/episode_039571.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039571.mp4" + }, + { + "episode_id": 47177, + "source_index": 47177, + "raw_length": 38, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-047/episode_047177.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047177.mp4" + }, + { + "episode_id": 862, + "source_index": 862, + "raw_length": 49, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-000/episode_000862.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000862.mp4" + }, + { + "episode_id": 12447, + "source_index": 12447, + "raw_length": 88, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-012/episode_012447.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012447.mp4" + }, + { + "episode_id": 4459, + "source_index": 4459, + "raw_length": 56, + "instruction": "remove the yellow knife from the pan.", + "canonical_instruction": "remove the yellow knife from the pan", + "parquet": "data/chunk-004/episode_004459.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004459.mp4" + }, + { + "episode_id": 49090, + "source_index": 49090, + "raw_length": 27, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-049/episode_049090.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049090.mp4" + }, + { + "episode_id": 2397, + "source_index": 2397, + "raw_length": 42, + "instruction": "Place the scoop on the yellow cloth.", + "canonical_instruction": "place the scoop on the yellow cloth", + "parquet": "data/chunk-002/episode_002397.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002397.mp4" + }, + { + "episode_id": 21027, + "source_index": 21027, + "raw_length": 51, + "instruction": "move the silver pot inside the sink", + "canonical_instruction": "move the silver pot inside the sink", + "parquet": "data/chunk-021/episode_021027.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021027.mp4" + }, + { + "episode_id": 51904, + "source_index": 51904, + "raw_length": 85, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-051/episode_051904.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051904.mp4" + }, + { + "episode_id": 25262, + "source_index": 25262, + "raw_length": 23, + "instruction": "move the blue cloth from top left to bottom left", + "canonical_instruction": "move the blue cloth from top left to bottom left", + "parquet": "data/chunk-025/episode_025262.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025262.mp4" + }, + { + "episode_id": 45548, + "source_index": 45548, + "raw_length": 43, + "instruction": "move the spoon to the bottom/middle of the preparation area.", + "canonical_instruction": "move the spoon to the bottom/middle of the preparation area", + "parquet": "data/chunk-045/episode_045548.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045548.mp4" + }, + { + "episode_id": 23889, + "source_index": 23889, + "raw_length": 36, + "instruction": "take sushi out of pot cardboard fence", + "canonical_instruction": "take sushi out of pot cardboard fence", + "parquet": "data/chunk-023/episode_023889.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023889.mp4" + }, + { + "episode_id": 18303, + "source_index": 18303, + "raw_length": 32, + "instruction": "move the purple cloth from left side to right side", + "canonical_instruction": "move the purple cloth from left side to right side", + "parquet": "data/chunk-018/episode_018303.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018303.mp4" + }, + { + "episode_id": 42391, + "source_index": 42391, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-042/episode_042391.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042391.mp4" + }, + { + "episode_id": 9316, + "source_index": 9316, + "raw_length": 23, + "instruction": "moved the silver pot between the ladle spoon and blue cloth", + "canonical_instruction": "moved the silver pot between the ladle spoon and blue cloth", + "parquet": "data/chunk-009/episode_009316.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009316.mp4" + }, + { + "episode_id": 33473, + "source_index": 33473, + "raw_length": 44, + "instruction": "put something in the box.", + "canonical_instruction": "put something in the box", + "parquet": "data/chunk-033/episode_033473.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033473.mp4" + }, + { + "episode_id": 11213, + "source_index": 11213, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-011/episode_011213.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011213.mp4" + }, + { + "episode_id": 22235, + "source_index": 22235, + "raw_length": 35, + "instruction": "Move the pot to the left adjacent to towel and spoon", + "canonical_instruction": "move the pot to the left adjacent to towel and spoon", + "parquet": "data/chunk-022/episode_022235.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022235.mp4" + }, + { + "episode_id": 11398, + "source_index": 11398, + "raw_length": 24, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-011/episode_011398.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011398.mp4" + }, + { + "episode_id": 52856, + "source_index": 52856, + "raw_length": 46, + "instruction": "Move the blue fork to the left side of the table.", + "canonical_instruction": "move the blue fork to the left side of the table", + "parquet": "data/chunk-052/episode_052856.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052856.mp4" + }, + { + "episode_id": 24920, + "source_index": 24920, + "raw_length": 26, + "instruction": "put lemon on plate", + "canonical_instruction": "put lemon on plate", + "parquet": "data/chunk-024/episode_024920.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024920.mp4" + }, + { + "episode_id": 4570, + "source_index": 4570, + "raw_length": 24, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-004/episode_004570.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004570.mp4" + }, + { + "episode_id": 52492, + "source_index": 52492, + "raw_length": 41, + "instruction": "unfold the cloth", + "canonical_instruction": "unfold the cloth", + "parquet": "data/chunk-052/episode_052492.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052492.mp4" + }, + { + "episode_id": 36971, + "source_index": 36971, + "raw_length": 35, + "instruction": "Place the potato inside the colander", + "canonical_instruction": "place the potato inside the colander", + "parquet": "data/chunk-036/episode_036971.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036971.mp4" + }, + { + "episode_id": 28927, + "source_index": 28927, + "raw_length": 27, + "instruction": "move the lid on top of the pot", + "canonical_instruction": "move the lid on top of the pot", + "parquet": "data/chunk-028/episode_028927.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028927.mp4" + }, + { + "episode_id": 27458, + "source_index": 27458, + "raw_length": 35, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-027/episode_027458.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027458.mp4" + }, + { + "episode_id": 28263, + "source_index": 28263, + "raw_length": 20, + "instruction": "pick up red srewdriver", + "canonical_instruction": "pick up red srewdriver", + "parquet": "data/chunk-028/episode_028263.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028263.mp4" + }, + { + "episode_id": 19400, + "source_index": 19400, + "raw_length": 21, + "instruction": "put pan in sink", + "canonical_instruction": "put pan in sink", + "parquet": "data/chunk-019/episode_019400.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019400.mp4" + }, + { + "episode_id": 4263, + "source_index": 4263, + "raw_length": 50, + "instruction": "put the knife on the top of the table.", + "canonical_instruction": "put the knife on the top of the table", + "parquet": "data/chunk-004/episode_004263.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004263.mp4" + }, + { + "episode_id": 52640, + "source_index": 52640, + "raw_length": 20, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-052/episode_052640.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052640.mp4" + }, + { + "episode_id": 39628, + "source_index": 39628, + "raw_length": 36, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-039/episode_039628.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039628.mp4" + }, + { + "episode_id": 37599, + "source_index": 37599, + "raw_length": 25, + "instruction": "take green pepper and place it in the plated pot", + "canonical_instruction": "take green pepper and place it in the plated pot", + "parquet": "data/chunk-037/episode_037599.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037599.mp4" + }, + { + "episode_id": 31760, + "source_index": 31760, + "raw_length": 39, + "instruction": "Move cloth from top edge of table to bottom edge of table and back to top edge of the table", + "canonical_instruction": "move cloth from top edge of table to bottom edge of table and back to top edge of the table", + "parquet": "data/chunk-031/episode_031760.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031760.mp4" + }, + { + "episode_id": 284, + "source_index": 284, + "raw_length": 25, + "instruction": "Move the blue spoon to the left burner", + "canonical_instruction": "move the blue spoon to the left burner", + "parquet": "data/chunk-000/episode_000284.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000284.mp4" + }, + { + "episode_id": 45570, + "source_index": 45570, + "raw_length": 28, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-045/episode_045570.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045570.mp4" + }, + { + "episode_id": 7300, + "source_index": 7300, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-007/episode_007300.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007300.mp4" + }, + { + "episode_id": 39914, + "source_index": 39914, + "raw_length": 21, + "instruction": "pick up yellow duck and move it to the upper right of the table", + "canonical_instruction": "pick up yellow duck and move it to the upper right of the table", + "parquet": "data/chunk-039/episode_039914.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039914.mp4" + }, + { + "episode_id": 26294, + "source_index": 26294, + "raw_length": 45, + "instruction": "Take the strawberry off the green cloth and put it to the left of the pot.", + "canonical_instruction": "take the strawberry off the green cloth and put it to the left of the pot", + "parquet": "data/chunk-026/episode_026294.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026294.mp4" + }, + { + "episode_id": 15758, + "source_index": 15758, + "raw_length": 17, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-015/episode_015758.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015758.mp4" + }, + { + "episode_id": 50145, + "source_index": 50145, + "raw_length": 21, + "instruction": "move the tin can to the top left of the table", + "canonical_instruction": "move the tin can to the top left of the table", + "parquet": "data/chunk-050/episode_050145.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050145.mp4" + }, + { + "episode_id": 20201, + "source_index": 20201, + "raw_length": 25, + "instruction": "move the silver lid to the lower right corner of the table", + "canonical_instruction": "move the silver lid to the lower right corner of the table", + "parquet": "data/chunk-020/episode_020201.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020201.mp4" + }, + { + "episode_id": 28787, + "source_index": 28787, + "raw_length": 29, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-028/episode_028787.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028787.mp4" + }, + { + "episode_id": 10708, + "source_index": 10708, + "raw_length": 27, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-010/episode_010708.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010708.mp4" + }, + { + "episode_id": 9140, + "source_index": 9140, + "raw_length": 25, + "instruction": "put broccoli in pot or pan", + "canonical_instruction": "put broccoli in pot or pan", + "parquet": "data/chunk-009/episode_009140.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009140.mp4" + }, + { + "episode_id": 6861, + "source_index": 6861, + "raw_length": 30, + "instruction": "Put the red pepper inside the pot", + "canonical_instruction": "put the red pepper inside the pot", + "parquet": "data/chunk-006/episode_006861.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006861.mp4" + }, + { + "episode_id": 1370, + "source_index": 1370, + "raw_length": 33, + "instruction": "fold the cloth from left to right", + "canonical_instruction": "fold the cloth from left to right", + "parquet": "data/chunk-001/episode_001370.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001370.mp4" + }, + { + "episode_id": 45193, + "source_index": 45193, + "raw_length": 35, + "instruction": "Move the bowl so it's above the yellow cloth.", + "canonical_instruction": "move the bowl so it's above the yellow cloth", + "parquet": "data/chunk-045/episode_045193.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045193.mp4" + }, + { + "episode_id": 51263, + "source_index": 51263, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-051/episode_051263.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051263.mp4" + }, + { + "episode_id": 46637, + "source_index": 46637, + "raw_length": 29, + "instruction": "Pick up piece of cake and put it on above the orange cloth", + "canonical_instruction": "pick up piece of cake and put it on above the orange cloth", + "parquet": "data/chunk-046/episode_046637.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046637.mp4" + }, + { + "episode_id": 25365, + "source_index": 25365, + "raw_length": 20, + "instruction": "put eggplant into pot or pan", + "canonical_instruction": "put eggplant into pot or pan", + "parquet": "data/chunk-025/episode_025365.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025365.mp4" + }, + { + "episode_id": 21269, + "source_index": 21269, + "raw_length": 18, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-021/episode_021269.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021269.mp4" + }, + { + "episode_id": 44676, + "source_index": 44676, + "raw_length": 35, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-044/episode_044676.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044676.mp4" + }, + { + "episode_id": 6680, + "source_index": 6680, + "raw_length": 79, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-006/episode_006680.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006680.mp4" + }, + { + "episode_id": 30856, + "source_index": 30856, + "raw_length": 43, + "instruction": "move pawn piece from lower right to the middle of the table.", + "canonical_instruction": "move pawn piece from lower right to the middle of the table", + "parquet": "data/chunk-030/episode_030856.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030856.mp4" + }, + { + "episode_id": 44931, + "source_index": 44931, + "raw_length": 31, + "instruction": "opened the drawer", + "canonical_instruction": "opened the drawer", + "parquet": "data/chunk-044/episode_044931.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044931.mp4" + }, + { + "episode_id": 49486, + "source_index": 49486, + "raw_length": 32, + "instruction": "moved the toy to the bottom centre of the table", + "canonical_instruction": "moved the toy to the bottom centre of the table", + "parquet": "data/chunk-049/episode_049486.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049486.mp4" + }, + { + "episode_id": 44646, + "source_index": 44646, + "raw_length": 46, + "instruction": "put the green cube on top of the block", + "canonical_instruction": "put the green cube on top of the block", + "parquet": "data/chunk-044/episode_044646.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044646.mp4" + }, + { + "episode_id": 346, + "source_index": 346, + "raw_length": 24, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-000/episode_000346.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000346.mp4" + }, + { + "episode_id": 6026, + "source_index": 6026, + "raw_length": 91, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-006/episode_006026.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006026.mp4" + }, + { + "episode_id": 42726, + "source_index": 42726, + "raw_length": 43, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-042/episode_042726.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042726.mp4" + }, + { + "episode_id": 252, + "source_index": 252, + "raw_length": 19, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-000/episode_000252.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000252.mp4" + }, + { + "episode_id": 39094, + "source_index": 39094, + "raw_length": 38, + "instruction": "place the red spoon on right edge of the table.", + "canonical_instruction": "place the red spoon on right edge of the table", + "parquet": "data/chunk-039/episode_039094.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039094.mp4" + }, + { + "episode_id": 20636, + "source_index": 20636, + "raw_length": 76, + "instruction": "put stuffedcheeta on plate and sweetpotato in pot or pan on stove", + "canonical_instruction": "put stuffedcheeta on plate and sweetpotato in pot or pan on stove", + "parquet": "data/chunk-020/episode_020636.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020636.mp4" + }, + { + "episode_id": 28572, + "source_index": 28572, + "raw_length": 20, + "instruction": "Slide the napkin to the front edge of the table", + "canonical_instruction": "slide the napkin to the front edge of the table", + "parquet": "data/chunk-028/episode_028572.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028572.mp4" + }, + { + "episode_id": 41223, + "source_index": 41223, + "raw_length": 45, + "instruction": "move the silver pot to the bottom of the left burner", + "canonical_instruction": "move the silver pot to the bottom of the left burner", + "parquet": "data/chunk-041/episode_041223.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041223.mp4" + }, + { + "episode_id": 32332, + "source_index": 32332, + "raw_length": 26, + "instruction": "put broccoli in pot or pan", + "canonical_instruction": "put broccoli in pot or pan", + "parquet": "data/chunk-032/episode_032332.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032332.mp4" + }, + { + "episode_id": 10624, + "source_index": 10624, + "raw_length": 33, + "instruction": "put the red block to the top of the other 3 block", + "canonical_instruction": "put the red block to the top of the other 3 block", + "parquet": "data/chunk-010/episode_010624.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010624.mp4" + }, + { + "episode_id": 46258, + "source_index": 46258, + "raw_length": 28, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-046/episode_046258.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046258.mp4" + }, + { + "episode_id": 27531, + "source_index": 27531, + "raw_length": 38, + "instruction": "picking up the gray ball and moving it to the far left bottom edge on a corner", + "canonical_instruction": "picking up the gray ball and moving it to the far left bottom edge on a corner", + "parquet": "data/chunk-027/episode_027531.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027531.mp4" + }, + { + "episode_id": 49476, + "source_index": 49476, + "raw_length": 44, + "instruction": "Move the pot to the front right edge of the table", + "canonical_instruction": "move the pot to the front right edge of the table", + "parquet": "data/chunk-049/episode_049476.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049476.mp4" + }, + { + "episode_id": 51601, + "source_index": 51601, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-051/episode_051601.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051601.mp4" + }, + { + "episode_id": 8246, + "source_index": 8246, + "raw_length": 23, + "instruction": "move the yellow bottle to the right side of the table", + "canonical_instruction": "move the yellow bottle to the right side of the table", + "parquet": "data/chunk-008/episode_008246.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008246.mp4" + }, + { + "episode_id": 41700, + "source_index": 41700, + "raw_length": 46, + "instruction": "move the green object from the left burner to the silver pot on the right burner", + "canonical_instruction": "move the green object from the left burner to the silver pot on the right burner", + "parquet": "data/chunk-041/episode_041700.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041700.mp4" + }, + { + "episode_id": 35751, + "source_index": 35751, + "raw_length": 52, + "instruction": "put the blue brush in the orange po", + "canonical_instruction": "put the blue brush in the orange po", + "parquet": "data/chunk-035/episode_035751.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035751.mp4" + }, + { + "episode_id": 41980, + "source_index": 41980, + "raw_length": 27, + "instruction": "Place the orange brush on top of the blue towel", + "canonical_instruction": "place the orange brush on top of the blue towel", + "parquet": "data/chunk-041/episode_041980.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041980.mp4" + }, + { + "episode_id": 44394, + "source_index": 44394, + "raw_length": 37, + "instruction": "take the red thing out of the drawer and put it in between of banana and potato", + "canonical_instruction": "take the red thing out of the drawer and put it in between of banana and potato", + "parquet": "data/chunk-044/episode_044394.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044394.mp4" + }, + { + "episode_id": 39014, + "source_index": 39014, + "raw_length": 49, + "instruction": "took the stuffed panda and put it inside the pot", + "canonical_instruction": "took the stuffed panda and put it inside the pot", + "parquet": "data/chunk-039/episode_039014.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039014.mp4" + }, + { + "episode_id": 2251, + "source_index": 2251, + "raw_length": 54, + "instruction": "put strawberry in pot or pan an put pot or pan on stove", + "canonical_instruction": "put strawberry in pot or pan an put pot or pan on stove", + "parquet": "data/chunk-002/episode_002251.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002251.mp4" + }, + { + "episode_id": 32111, + "source_index": 32111, + "raw_length": 29, + "instruction": "folded the cloth from top right to bottom left", + "canonical_instruction": "folded the cloth from top right to bottom left", + "parquet": "data/chunk-032/episode_032111.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032111.mp4" + }, + { + "episode_id": 37200, + "source_index": 37200, + "raw_length": 31, + "instruction": "move the blue spoon to the upper right side of the stove", + "canonical_instruction": "move the blue spoon to the upper right side of the stove", + "parquet": "data/chunk-037/episode_037200.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037200.mp4" + }, + { + "episode_id": 37816, + "source_index": 37816, + "raw_length": 36, + "instruction": "take lid off pot", + "canonical_instruction": "take lid off pot", + "parquet": "data/chunk-037/episode_037816.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037816.mp4" + }, + { + "episode_id": 40112, + "source_index": 40112, + "raw_length": 21, + "instruction": "put pot on stove which is near stove", + "canonical_instruction": "put pot on stove which is near stove", + "parquet": "data/chunk-040/episode_040112.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040112.mp4" + }, + { + "episode_id": 45589, + "source_index": 45589, + "raw_length": 21, + "instruction": "turn faucet front to left", + "canonical_instruction": "turn faucet front to left", + "parquet": "data/chunk-045/episode_045589.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045589.mp4" + }, + { + "episode_id": 29514, + "source_index": 29514, + "raw_length": 37, + "instruction": "move the little plush to the right burner", + "canonical_instruction": "move the little plush to the right burner", + "parquet": "data/chunk-029/episode_029514.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029514.mp4" + }, + { + "episode_id": 33335, + "source_index": 33335, + "raw_length": 31, + "instruction": "moved the green item to the upper right side of the table", + "canonical_instruction": "moved the green item to the upper right side of the table", + "parquet": "data/chunk-033/episode_033335.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033335.mp4" + }, + { + "episode_id": 44354, + "source_index": 44354, + "raw_length": 45, + "instruction": "Take the corn of the pot and move it to the left", + "canonical_instruction": "take the corn of the pot and move it to the left", + "parquet": "data/chunk-044/episode_044354.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044354.mp4" + }, + { + "episode_id": 24369, + "source_index": 24369, + "raw_length": 46, + "instruction": "put the banana in the drawer", + "canonical_instruction": "put the banana in the drawer", + "parquet": "data/chunk-024/episode_024369.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024369.mp4" + }, + { + "episode_id": 44616, + "source_index": 44616, + "raw_length": 30, + "instruction": "unfold the cloth from bottom to top", + "canonical_instruction": "unfold the cloth from bottom to top", + "parquet": "data/chunk-044/episode_044616.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044616.mp4" + }, + { + "episode_id": 51499, + "source_index": 51499, + "raw_length": 35, + "instruction": "unfold the cloth from centre to top right", + "canonical_instruction": "unfold the cloth from centre to top right", + "parquet": "data/chunk-051/episode_051499.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051499.mp4" + }, + { + "episode_id": 17362, + "source_index": 17362, + "raw_length": 46, + "instruction": "take the yellow rectangular and put it on the top of the red rectangular", + "canonical_instruction": "take the yellow rectangular and put it on the top of the red rectangular", + "parquet": "data/chunk-017/episode_017362.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017362.mp4" + }, + { + "episode_id": 9498, + "source_index": 9498, + "raw_length": 41, + "instruction": "move the blue cloth to the right lower corner of the table", + "canonical_instruction": "move the blue cloth to the right lower corner of the table", + "parquet": "data/chunk-009/episode_009498.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009498.mp4" + }, + { + "episode_id": 31876, + "source_index": 31876, + "raw_length": 37, + "instruction": "unfold the cloth bottom right to top left", + "canonical_instruction": "unfold the cloth bottom right to top left", + "parquet": "data/chunk-031/episode_031876.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031876.mp4" + }, + { + "episode_id": 21121, + "source_index": 21121, + "raw_length": 34, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-021/episode_021121.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021121.mp4" + }, + { + "episode_id": 44705, + "source_index": 44705, + "raw_length": 35, + "instruction": "move the l-shape block to the middle of the table", + "canonical_instruction": "move the l-shape block to the middle of the table", + "parquet": "data/chunk-044/episode_044705.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044705.mp4" + }, + { + "episode_id": 3662, + "source_index": 3662, + "raw_length": 34, + "instruction": "Move the metal pot to the right of the mushroom.", + "canonical_instruction": "move the metal pot to the right of the mushroom", + "parquet": "data/chunk-003/episode_003662.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003662.mp4" + }, + { + "episode_id": 14087, + "source_index": 14087, + "raw_length": 21, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-014/episode_014087.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014087.mp4" + }, + { + "episode_id": 23871, + "source_index": 23871, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-023/episode_023871.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023871.mp4" + }, + { + "episode_id": 34705, + "source_index": 34705, + "raw_length": 86, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-034/episode_034705.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034705.mp4" + }, + { + "episode_id": 31043, + "source_index": 31043, + "raw_length": 41, + "instruction": "put the yellow pumpkin between silver pot and tomato can", + "canonical_instruction": "put the yellow pumpkin between silver pot and tomato can", + "parquet": "data/chunk-031/episode_031043.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031043.mp4" + }, + { + "episode_id": 19817, + "source_index": 19817, + "raw_length": 39, + "instruction": "Put the silver lid on the silver pot", + "canonical_instruction": "put the silver lid on the silver pot", + "parquet": "data/chunk-019/episode_019817.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019817.mp4" + }, + { + "episode_id": 45636, + "source_index": 45636, + "raw_length": 23, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-045/episode_045636.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045636.mp4" + }, + { + "episode_id": 23024, + "source_index": 23024, + "raw_length": 46, + "instruction": "PICK UP THE FRUIT AND PUT ON THE GREEN TOWEL", + "canonical_instruction": "pick up the fruit and put on the green towel", + "parquet": "data/chunk-023/episode_023024.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023024.mp4" + }, + { + "episode_id": 28553, + "source_index": 28553, + "raw_length": 56, + "instruction": "bring the pot from the right side of sink to left border side", + "canonical_instruction": "bring the pot from the right side of sink to left border side", + "parquet": "data/chunk-028/episode_028553.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028553.mp4" + }, + { + "episode_id": 42434, + "source_index": 42434, + "raw_length": 26, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-042/episode_042434.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042434.mp4" + }, + { + "episode_id": 6897, + "source_index": 6897, + "raw_length": 25, + "instruction": "moved something to the front right side of the table", + "canonical_instruction": "moved something to the front right side of the table", + "parquet": "data/chunk-006/episode_006897.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006897.mp4" + }, + { + "episode_id": 35671, + "source_index": 35671, + "raw_length": 34, + "instruction": "upright hot sauce bottle cardboard fence", + "canonical_instruction": "upright hot sauce bottle cardboard fence", + "parquet": "data/chunk-035/episode_035671.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035671.mp4" + }, + { + "episode_id": 1670, + "source_index": 1670, + "raw_length": 34, + "instruction": "put the colander on the towel", + "canonical_instruction": "put the colander on the towel", + "parquet": "data/chunk-001/episode_001670.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001670.mp4" + }, + { + "episode_id": 13225, + "source_index": 13225, + "raw_length": 22, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-013/episode_013225.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013225.mp4" + }, + { + "episode_id": 313, + "source_index": 313, + "raw_length": 35, + "instruction": "grab the red object from the silver pot and put it on the left side burner", + "canonical_instruction": "grab the red object from the silver pot and put it on the left side burner", + "parquet": "data/chunk-000/episode_000313.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000313.mp4" + }, + { + "episode_id": 1072, + "source_index": 1072, + "raw_length": 25, + "instruction": "moved the metal can to the bottom left of the table", + "canonical_instruction": "moved the metal can to the bottom left of the table", + "parquet": "data/chunk-001/episode_001072.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001072.mp4" + }, + { + "episode_id": 12491, + "source_index": 12491, + "raw_length": 27, + "instruction": "take sushi off plate", + "canonical_instruction": "take sushi off plate", + "parquet": "data/chunk-012/episode_012491.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012491.mp4" + }, + { + "episode_id": 37197, + "source_index": 37197, + "raw_length": 29, + "instruction": "Move the table cloth from corner to the edge of the table.", + "canonical_instruction": "move the table cloth from corner to the edge of the table", + "parquet": "data/chunk-037/episode_037197.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037197.mp4" + }, + { + "episode_id": 48555, + "source_index": 48555, + "raw_length": 40, + "instruction": "put the red block down to the desk", + "canonical_instruction": "put the red block down to the desk", + "parquet": "data/chunk-048/episode_048555.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048555.mp4" + }, + { + "episode_id": 39160, + "source_index": 39160, + "raw_length": 46, + "instruction": "put the block on top of the tower", + "canonical_instruction": "put the block on top of the tower", + "parquet": "data/chunk-039/episode_039160.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039160.mp4" + }, + { + "episode_id": 22941, + "source_index": 22941, + "raw_length": 38, + "instruction": "moved the pot lid on the pot", + "canonical_instruction": "moved the pot lid on the pot", + "parquet": "data/chunk-022/episode_022941.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022941.mp4" + }, + { + "episode_id": 22757, + "source_index": 22757, + "raw_length": 46, + "instruction": "Put the blue fork on the other side of the blue rag.", + "canonical_instruction": "put the blue fork on the other side of the blue rag", + "parquet": "data/chunk-022/episode_022757.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022757.mp4" + }, + { + "episode_id": 5596, + "source_index": 5596, + "raw_length": 56, + "instruction": "puts the white spoon in the right sie of the sink fro the sufuria", + "canonical_instruction": "puts the white spoon in the right sie of the sink fro the sufuria", + "parquet": "data/chunk-005/episode_005596.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005596.mp4" + }, + { + "episode_id": 28059, + "source_index": 28059, + "raw_length": 40, + "instruction": "Move the utensil to the bottom right of counter.", + "canonical_instruction": "move the utensil to the bottom right of counter", + "parquet": "data/chunk-028/episode_028059.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028059.mp4" + }, + { + "episode_id": 53182, + "source_index": 53182, + "raw_length": 17, + "instruction": "close drawer of box", + "canonical_instruction": "close drawer of box", + "parquet": "data/chunk-053/episode_053182.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053182.mp4" + }, + { + "episode_id": 23799, + "source_index": 23799, + "raw_length": 46, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-023/episode_023799.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023799.mp4" + }, + { + "episode_id": 16548, + "source_index": 16548, + "raw_length": 46, + "instruction": "Place the pot on the yellow cloth.", + "canonical_instruction": "place the pot on the yellow cloth", + "parquet": "data/chunk-016/episode_016548.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016548.mp4" + }, + { + "episode_id": 37151, + "source_index": 37151, + "raw_length": 46, + "instruction": "unfold the orange cloth from top left to bottom right", + "canonical_instruction": "unfold the orange cloth from top left to bottom right", + "parquet": "data/chunk-037/episode_037151.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037151.mp4" + }, + { + "episode_id": 18317, + "source_index": 18317, + "raw_length": 39, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-018/episode_018317.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018317.mp4" + }, + { + "episode_id": 13759, + "source_index": 13759, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-013/episode_013759.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013759.mp4" + }, + { + "episode_id": 38887, + "source_index": 38887, + "raw_length": 37, + "instruction": "unfold the cloth from left to bottom left", + "canonical_instruction": "unfold the cloth from left to bottom left", + "parquet": "data/chunk-038/episode_038887.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038887.mp4" + }, + { + "episode_id": 16086, + "source_index": 16086, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-016/episode_016086.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016086.mp4" + }, + { + "episode_id": 10877, + "source_index": 10877, + "raw_length": 56, + "instruction": "moved the yellow knife into the translucent pot on the left burner", + "canonical_instruction": "moved the yellow knife into the translucent pot on the left burner", + "parquet": "data/chunk-010/episode_010877.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010877.mp4" + }, + { + "episode_id": 25361, + "source_index": 25361, + "raw_length": 19, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-025/episode_025361.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025361.mp4" + }, + { + "episode_id": 30038, + "source_index": 30038, + "raw_length": 42, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-030/episode_030038.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030038.mp4" + }, + { + "episode_id": 38837, + "source_index": 38837, + "raw_length": 21, + "instruction": "pick up pot", + "canonical_instruction": "pick up pot", + "parquet": "data/chunk-038/episode_038837.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038837.mp4" + }, + { + "episode_id": 14042, + "source_index": 14042, + "raw_length": 24, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-014/episode_014042.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014042.mp4" + }, + { + "episode_id": 8392, + "source_index": 8392, + "raw_length": 32, + "instruction": "upright hot sauce bottle cardboard fence", + "canonical_instruction": "upright hot sauce bottle cardboard fence", + "parquet": "data/chunk-008/episode_008392.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008392.mp4" + }, + { + "episode_id": 9978, + "source_index": 9978, + "raw_length": 76, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-009/episode_009978.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009978.mp4" + }, + { + "episode_id": 29835, + "source_index": 29835, + "raw_length": 29, + "instruction": "Move the can to the far corner of the table.", + "canonical_instruction": "move the can to the far corner of the table", + "parquet": "data/chunk-029/episode_029835.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029835.mp4" + }, + { + "episode_id": 25599, + "source_index": 25599, + "raw_length": 43, + "instruction": "put the red cube on top of the yellow rectangle", + "canonical_instruction": "put the red cube on top of the yellow rectangle", + "parquet": "data/chunk-025/episode_025599.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025599.mp4" + }, + { + "episode_id": 14875, + "source_index": 14875, + "raw_length": 17, + "instruction": "try to open the drawer", + "canonical_instruction": "try to open the drawer", + "parquet": "data/chunk-014/episode_014875.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014875.mp4" + }, + { + "episode_id": 17850, + "source_index": 17850, + "raw_length": 34, + "instruction": "fold the cloth from right to left", + "canonical_instruction": "fold the cloth from right to left", + "parquet": "data/chunk-017/episode_017850.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017850.mp4" + }, + { + "episode_id": 51728, + "source_index": 51728, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-051/episode_051728.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051728.mp4" + }, + { + "episode_id": 44945, + "source_index": 44945, + "raw_length": 46, + "instruction": "moved can to right next to the red spoon", + "canonical_instruction": "moved can to right next to the red spoon", + "parquet": "data/chunk-044/episode_044945.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044945.mp4" + }, + { + "episode_id": 5420, + "source_index": 5420, + "raw_length": 26, + "instruction": "put small spoon from basket to tray", + "canonical_instruction": "put small spoon from basket to tray", + "parquet": "data/chunk-005/episode_005420.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005420.mp4" + }, + { + "episode_id": 13089, + "source_index": 13089, + "raw_length": 32, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-013/episode_013089.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013089.mp4" + }, + { + "episode_id": 16657, + "source_index": 16657, + "raw_length": 34, + "instruction": "move something orange cloth in the basket", + "canonical_instruction": "move something orange cloth in the basket", + "parquet": "data/chunk-016/episode_016657.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016657.mp4" + }, + { + "episode_id": 21931, + "source_index": 21931, + "raw_length": 38, + "instruction": "move the blue spatula on the upper left of stove", + "canonical_instruction": "move the blue spatula on the upper left of stove", + "parquet": "data/chunk-021/episode_021931.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021931.mp4" + }, + { + "episode_id": 49145, + "source_index": 49145, + "raw_length": 32, + "instruction": "move the lid of the orange pot to the top left corner of the table", + "canonical_instruction": "move the lid of the orange pot to the top left corner of the table", + "parquet": "data/chunk-049/episode_049145.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049145.mp4" + }, + { + "episode_id": 44798, + "source_index": 44798, + "raw_length": 21, + "instruction": "turn faucet front to left", + "canonical_instruction": "turn faucet front to left", + "parquet": "data/chunk-044/episode_044798.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044798.mp4" + }, + { + "episode_id": 20705, + "source_index": 20705, + "raw_length": 36, + "instruction": "upright metal pot cardboard fence", + "canonical_instruction": "upright metal pot cardboard fence", + "parquet": "data/chunk-020/episode_020705.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020705.mp4" + }, + { + "episode_id": 47624, + "source_index": 47624, + "raw_length": 35, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-047/episode_047624.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047624.mp4" + }, + { + "episode_id": 5887, + "source_index": 5887, + "raw_length": 38, + "instruction": "move the silver pot to the upper side of the right burner", + "canonical_instruction": "move the silver pot to the upper side of the right burner", + "parquet": "data/chunk-005/episode_005887.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005887.mp4" + }, + { + "episode_id": 3256, + "source_index": 3256, + "raw_length": 37, + "instruction": "covered the pot in the left side with a pot lid", + "canonical_instruction": "covered the pot in the left side with a pot lid", + "parquet": "data/chunk-003/episode_003256.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003256.mp4" + }, + { + "episode_id": 40707, + "source_index": 40707, + "raw_length": 43, + "instruction": "Move the yellow cloth slightly backwards to the edge of the table and to the left of the pot.", + "canonical_instruction": "move the yellow cloth slightly backwards to the edge of the table and to the left of the pot", + "parquet": "data/chunk-040/episode_040707.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040707.mp4" + }, + { + "episode_id": 19845, + "source_index": 19845, + "raw_length": 20, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-019/episode_019845.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019845.mp4" + }, + { + "episode_id": 41206, + "source_index": 41206, + "raw_length": 38, + "instruction": "move the silver pot in the middle of the table", + "canonical_instruction": "move the silver pot in the middle of the table", + "parquet": "data/chunk-041/episode_041206.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041206.mp4" + }, + { + "episode_id": 18967, + "source_index": 18967, + "raw_length": 24, + "instruction": "Move the pot closer to the front of the microwave", + "canonical_instruction": "move the pot closer to the front of the microwave", + "parquet": "data/chunk-018/episode_018967.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018967.mp4" + }, + { + "episode_id": 37008, + "source_index": 37008, + "raw_length": 25, + "instruction": "Moved the blue cloth next to the basket", + "canonical_instruction": "moved the blue cloth next to the basket", + "parquet": "data/chunk-037/episode_037008.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037008.mp4" + }, + { + "episode_id": 37672, + "source_index": 37672, + "raw_length": 35, + "instruction": "put the blue cloth on top of the green cloth", + "canonical_instruction": "put the blue cloth on top of the green cloth", + "parquet": "data/chunk-037/episode_037672.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037672.mp4" + }, + { + "episode_id": 19953, + "source_index": 19953, + "raw_length": 39, + "instruction": "moved the can from the bottom right to the top right", + "canonical_instruction": "moved the can from the bottom right to the top right", + "parquet": "data/chunk-019/episode_019953.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019953.mp4" + }, + { + "episode_id": 3072, + "source_index": 3072, + "raw_length": 44, + "instruction": "Place the cup to the left side of the napkin.", + "canonical_instruction": "place the cup to the left side of the napkin", + "parquet": "data/chunk-003/episode_003072.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003072.mp4" + }, + { + "episode_id": 46020, + "source_index": 46020, + "raw_length": 21, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-046/episode_046020.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046020.mp4" + }, + { + "episode_id": 36396, + "source_index": 36396, + "raw_length": 41, + "instruction": "put the green block at the center of the table", + "canonical_instruction": "put the green block at the center of the table", + "parquet": "data/chunk-036/episode_036396.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036396.mp4" + }, + { + "episode_id": 22040, + "source_index": 22040, + "raw_length": 33, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-022/episode_022040.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022040.mp4" + }, + { + "episode_id": 51297, + "source_index": 51297, + "raw_length": 46, + "instruction": "Pick up red object and place inside bowl.", + "canonical_instruction": "pick up red object and place inside bowl", + "parquet": "data/chunk-051/episode_051297.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051297.mp4" + }, + { + "episode_id": 28783, + "source_index": 28783, + "raw_length": 29, + "instruction": "move the yellow cloth to the bottom right corner of the burner", + "canonical_instruction": "move the yellow cloth to the bottom right corner of the burner", + "parquet": "data/chunk-028/episode_028783.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028783.mp4" + }, + { + "episode_id": 38193, + "source_index": 38193, + "raw_length": 29, + "instruction": "put the yellow object on the metallic pot", + "canonical_instruction": "put the yellow object on the metallic pot", + "parquet": "data/chunk-038/episode_038193.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038193.mp4" + }, + { + "episode_id": 16066, + "source_index": 16066, + "raw_length": 38, + "instruction": "moved the silver pot to the upper right corner of the stove", + "canonical_instruction": "moved the silver pot to the upper right corner of the stove", + "parquet": "data/chunk-016/episode_016066.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016066.mp4" + }, + { + "episode_id": 19556, + "source_index": 19556, + "raw_length": 33, + "instruction": "move the silver pot to the bottom left of the stove", + "canonical_instruction": "move the silver pot to the bottom left of the stove", + "parquet": "data/chunk-019/episode_019556.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019556.mp4" + }, + { + "episode_id": 49261, + "source_index": 49261, + "raw_length": 29, + "instruction": "Moved the spatula to the front of the left burner", + "canonical_instruction": "moved the spatula to the front of the left burner", + "parquet": "data/chunk-049/episode_049261.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049261.mp4" + }, + { + "episode_id": 52685, + "source_index": 52685, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-052/episode_052685.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052685.mp4" + }, + { + "episode_id": 16435, + "source_index": 16435, + "raw_length": 33, + "instruction": "move the orange toy beside the tomato", + "canonical_instruction": "move the orange toy beside the tomato", + "parquet": "data/chunk-016/episode_016435.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016435.mp4" + }, + { + "episode_id": 14154, + "source_index": 14154, + "raw_length": 46, + "instruction": "Closed the drawer.", + "canonical_instruction": "closed the drawer", + "parquet": "data/chunk-014/episode_014154.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014154.mp4" + }, + { + "episode_id": 34086, + "source_index": 34086, + "raw_length": 46, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-034/episode_034086.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034086.mp4" + }, + { + "episode_id": 41758, + "source_index": 41758, + "raw_length": 36, + "instruction": "carrying the yellow substance from behind the white can and putting it left of the can on a burner", + "canonical_instruction": "carrying the yellow substance from behind the white can and putting it left of the can on a burner", + "parquet": "data/chunk-041/episode_041758.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041758.mp4" + }, + { + "episode_id": 34104, + "source_index": 34104, + "raw_length": 35, + "instruction": "move the brown chocolate into the drawer", + "canonical_instruction": "move the brown chocolate into the drawer", + "parquet": "data/chunk-034/episode_034104.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034104.mp4" + }, + { + "episode_id": 19038, + "source_index": 19038, + "raw_length": 24, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-019/episode_019038.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019038.mp4" + }, + { + "episode_id": 38890, + "source_index": 38890, + "raw_length": 24, + "instruction": "Move the yellow brush to in front of the yellow cloth.", + "canonical_instruction": "move the yellow brush to in front of the yellow cloth", + "parquet": "data/chunk-038/episode_038890.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038890.mp4" + }, + { + "episode_id": 44962, + "source_index": 44962, + "raw_length": 41, + "instruction": "move the cloth to the left of the table", + "canonical_instruction": "move the cloth to the left of the table", + "parquet": "data/chunk-044/episode_044962.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044962.mp4" + }, + { + "episode_id": 46034, + "source_index": 46034, + "raw_length": 28, + "instruction": "moved the blue silver spoon from left side of the burner to the center of the induction stove", + "canonical_instruction": "moved the blue silver spoon from left side of the burner to the center of the induction stove", + "parquet": "data/chunk-046/episode_046034.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046034.mp4" + }, + { + "episode_id": 17938, + "source_index": 17938, + "raw_length": 30, + "instruction": "Moved the green spatula to the top right side of the stove", + "canonical_instruction": "moved the green spatula to the top right side of the stove", + "parquet": "data/chunk-017/episode_017938.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017938.mp4" + }, + { + "episode_id": 39338, + "source_index": 39338, + "raw_length": 22, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-039/episode_039338.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039338.mp4" + }, + { + "episode_id": 12887, + "source_index": 12887, + "raw_length": 34, + "instruction": "move the cloth to the bottom left of the table", + "canonical_instruction": "move the cloth to the bottom left of the table", + "parquet": "data/chunk-012/episode_012887.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012887.mp4" + }, + { + "episode_id": 40132, + "source_index": 40132, + "raw_length": 45, + "instruction": "unfolding the cloth", + "canonical_instruction": "unfolding the cloth", + "parquet": "data/chunk-040/episode_040132.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040132.mp4" + }, + { + "episode_id": 5357, + "source_index": 5357, + "raw_length": 36, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-005/episode_005357.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005357.mp4" + }, + { + "episode_id": 35407, + "source_index": 35407, + "raw_length": 23, + "instruction": "put the yellow block away and replaced it in the same position", + "canonical_instruction": "put the yellow block away and replaced it in the same position", + "parquet": "data/chunk-035/episode_035407.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035407.mp4" + }, + { + "episode_id": 34625, + "source_index": 34625, + "raw_length": 26, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-034/episode_034625.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034625.mp4" + }, + { + "episode_id": 51839, + "source_index": 51839, + "raw_length": 21, + "instruction": "put pan from stove to sink", + "canonical_instruction": "put pan from stove to sink", + "parquet": "data/chunk-051/episode_051839.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051839.mp4" + }, + { + "episode_id": 20604, + "source_index": 20604, + "raw_length": 39, + "instruction": "Place the spatula on the left side of the table", + "canonical_instruction": "place the spatula on the left side of the table", + "parquet": "data/chunk-020/episode_020604.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020604.mp4" + }, + { + "episode_id": 16818, + "source_index": 16818, + "raw_length": 54, + "instruction": "put the red fork on top of the blue towel", + "canonical_instruction": "put the red fork on top of the blue towel", + "parquet": "data/chunk-016/episode_016818.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016818.mp4" + }, + { + "episode_id": 14409, + "source_index": 14409, + "raw_length": 24, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-014/episode_014409.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014409.mp4" + }, + { + "episode_id": 18231, + "source_index": 18231, + "raw_length": 31, + "instruction": "put the blue towel between the can and the cooking pot", + "canonical_instruction": "put the blue towel between the can and the cooking pot", + "parquet": "data/chunk-018/episode_018231.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018231.mp4" + }, + { + "episode_id": 31023, + "source_index": 31023, + "raw_length": 38, + "instruction": "Fold cloth from bottom right to top left", + "canonical_instruction": "fold cloth from bottom right to top left", + "parquet": "data/chunk-031/episode_031023.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031023.mp4" + }, + { + "episode_id": 53091, + "source_index": 53091, + "raw_length": 46, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-053/episode_053091.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053091.mp4" + }, + { + "episode_id": 3097, + "source_index": 3097, + "raw_length": 21, + "instruction": "turn faucet front to right", + "canonical_instruction": "turn faucet front to right", + "parquet": "data/chunk-003/episode_003097.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003097.mp4" + }, + { + "episode_id": 12003, + "source_index": 12003, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-012/episode_012003.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012003.mp4" + }, + { + "episode_id": 11214, + "source_index": 11214, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-011/episode_011214.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011214.mp4" + }, + { + "episode_id": 14095, + "source_index": 14095, + "raw_length": 24, + "instruction": "put the sushi to the top of the drawer", + "canonical_instruction": "put the sushi to the top of the drawer", + "parquet": "data/chunk-014/episode_014095.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014095.mp4" + }, + { + "episode_id": 50492, + "source_index": 50492, + "raw_length": 19, + "instruction": "put pot on stove which is near stove", + "canonical_instruction": "put pot on stove which is near stove", + "parquet": "data/chunk-050/episode_050492.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050492.mp4" + }, + { + "episode_id": 8930, + "source_index": 8930, + "raw_length": 31, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-008/episode_008930.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008930.mp4" + }, + { + "episode_id": 14181, + "source_index": 14181, + "raw_length": 35, + "instruction": "unfold the cloth from top to bottom", + "canonical_instruction": "unfold the cloth from top to bottom", + "parquet": "data/chunk-014/episode_014181.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014181.mp4" + }, + { + "episode_id": 8028, + "source_index": 8028, + "raw_length": 32, + "instruction": "Move the yellow pad to the front edge of the table", + "canonical_instruction": "move the yellow pad to the front edge of the table", + "parquet": "data/chunk-008/episode_008028.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008028.mp4" + }, + { + "episode_id": 44365, + "source_index": 44365, + "raw_length": 20, + "instruction": "move the blue cloth to the upper left side of the table", + "canonical_instruction": "move the blue cloth to the upper left side of the table", + "parquet": "data/chunk-044/episode_044365.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044365.mp4" + }, + { + "episode_id": 9203, + "source_index": 9203, + "raw_length": 17, + "instruction": "move the yellow cloth to the left bottom corner of the burner.", + "canonical_instruction": "move the yellow cloth to the left bottom corner of the burner", + "parquet": "data/chunk-009/episode_009203.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009203.mp4" + }, + { + "episode_id": 3311, + "source_index": 3311, + "raw_length": 34, + "instruction": "folds the cloth from the bottom right to the top leftt", + "canonical_instruction": "folds the cloth from the bottom right to the top leftt", + "parquet": "data/chunk-003/episode_003311.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003311.mp4" + }, + { + "episode_id": 32880, + "source_index": 32880, + "raw_length": 46, + "instruction": "Unfold the cloth from the center to top left", + "canonical_instruction": "unfold the cloth from the center to top left", + "parquet": "data/chunk-032/episode_032880.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032880.mp4" + }, + { + "episode_id": 43131, + "source_index": 43131, + "raw_length": 44, + "instruction": "Move the metal bowl and place it to the left of the blue cloth", + "canonical_instruction": "move the metal bowl and place it to the left of the blue cloth", + "parquet": "data/chunk-043/episode_043131.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043131.mp4" + }, + { + "episode_id": 23073, + "source_index": 23073, + "raw_length": 32, + "instruction": "fold the cloth from bottom left to the top right", + "canonical_instruction": "fold the cloth from bottom left to the top right", + "parquet": "data/chunk-023/episode_023073.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023073.mp4" + }, + { + "episode_id": 40806, + "source_index": 40806, + "raw_length": 39, + "instruction": "move the laundry basket in front of the washing machine", + "canonical_instruction": "move the laundry basket in front of the washing machine", + "parquet": "data/chunk-040/episode_040806.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040806.mp4" + }, + { + "episode_id": 19604, + "source_index": 19604, + "raw_length": 35, + "instruction": "take the yellow cube from the tower and put it on the left side of the table", + "canonical_instruction": "take the yellow cube from the tower and put it on the left side of the table", + "parquet": "data/chunk-019/episode_019604.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019604.mp4" + }, + { + "episode_id": 34022, + "source_index": 34022, + "raw_length": 17, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-034/episode_034022.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034022.mp4" + }, + { + "episode_id": 44975, + "source_index": 44975, + "raw_length": 17, + "instruction": "open large4fbox flaps", + "canonical_instruction": "open large4fbox flaps", + "parquet": "data/chunk-044/episode_044975.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044975.mp4" + }, + { + "episode_id": 36524, + "source_index": 36524, + "raw_length": 29, + "instruction": "put the bell pepper in the silver pot", + "canonical_instruction": "put the bell pepper in the silver pot", + "parquet": "data/chunk-036/episode_036524.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036524.mp4" + }, + { + "episode_id": 41534, + "source_index": 41534, + "raw_length": 34, + "instruction": "fold the blue cloth with a figure on it from bottom right to top left", + "canonical_instruction": "fold the blue cloth with a figure on it from bottom right to top left", + "parquet": "data/chunk-041/episode_041534.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041534.mp4" + }, + { + "episode_id": 47113, + "source_index": 47113, + "raw_length": 22, + "instruction": "move eggplant to between right burner", + "canonical_instruction": "move eggplant to between right burner", + "parquet": "data/chunk-047/episode_047113.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047113.mp4" + }, + { + "episode_id": 50939, + "source_index": 50939, + "raw_length": 26, + "instruction": "put the pan on the green cloth", + "canonical_instruction": "put the pan on the green cloth", + "parquet": "data/chunk-050/episode_050939.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050939.mp4" + }, + { + "episode_id": 33637, + "source_index": 33637, + "raw_length": 46, + "instruction": "Place the metal pot in front of the brush.", + "canonical_instruction": "place the metal pot in front of the brush", + "parquet": "data/chunk-033/episode_033637.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033637.mp4" + }, + { + "episode_id": 30840, + "source_index": 30840, + "raw_length": 27, + "instruction": "moving the can to the upper of the table .", + "canonical_instruction": "moving the can to the upper of the table", + "parquet": "data/chunk-030/episode_030840.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030840.mp4" + }, + { + "episode_id": 4493, + "source_index": 4493, + "raw_length": 36, + "instruction": "take banana out of colander", + "canonical_instruction": "take banana out of colander", + "parquet": "data/chunk-004/episode_004493.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004493.mp4" + }, + { + "episode_id": 12914, + "source_index": 12914, + "raw_length": 33, + "instruction": "put the clean clothes from the washing machine to the basket", + "canonical_instruction": "put the clean clothes from the washing machine to the basket", + "parquet": "data/chunk-012/episode_012914.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012914.mp4" + }, + { + "episode_id": 24880, + "source_index": 24880, + "raw_length": 40, + "instruction": "put the red cube on top of the other red cube", + "canonical_instruction": "put the red cube on top of the other red cube", + "parquet": "data/chunk-024/episode_024880.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024880.mp4" + }, + { + "episode_id": 14939, + "source_index": 14939, + "raw_length": 29, + "instruction": "move the silver pot to the bottom right corner of the stove", + "canonical_instruction": "move the silver pot to the bottom right corner of the stove", + "parquet": "data/chunk-014/episode_014939.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014939.mp4" + }, + { + "episode_id": 23533, + "source_index": 23533, + "raw_length": 30, + "instruction": "Place blue brush on top of yellow cloth.", + "canonical_instruction": "place blue brush on top of yellow cloth", + "parquet": "data/chunk-023/episode_023533.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023533.mp4" + }, + { + "episode_id": 6445, + "source_index": 6445, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-006/episode_006445.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006445.mp4" + }, + { + "episode_id": 46443, + "source_index": 46443, + "raw_length": 27, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-046/episode_046443.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046443.mp4" + }, + { + "episode_id": 20823, + "source_index": 20823, + "raw_length": 26, + "instruction": "put big spoon from basket to tray", + "canonical_instruction": "put big spoon from basket to tray", + "parquet": "data/chunk-020/episode_020823.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020823.mp4" + }, + { + "episode_id": 52598, + "source_index": 52598, + "raw_length": 35, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-052/episode_052598.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052598.mp4" + }, + { + "episode_id": 41601, + "source_index": 41601, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-041/episode_041601.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041601.mp4" + }, + { + "episode_id": 5991, + "source_index": 5991, + "raw_length": 33, + "instruction": "put sushi in pot cardboard fence", + "canonical_instruction": "put sushi in pot cardboard fence", + "parquet": "data/chunk-005/episode_005991.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005991.mp4" + }, + { + "episode_id": 26939, + "source_index": 26939, + "raw_length": 31, + "instruction": "moved the blue spoon between the blue cloth and the can", + "canonical_instruction": "moved the blue spoon between the blue cloth and the can", + "parquet": "data/chunk-026/episode_026939.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026939.mp4" + }, + { + "episode_id": 17381, + "source_index": 17381, + "raw_length": 42, + "instruction": "Place the red pot behind the green towel", + "canonical_instruction": "place the red pot behind the green towel", + "parquet": "data/chunk-017/episode_017381.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017381.mp4" + }, + { + "episode_id": 14702, + "source_index": 14702, + "raw_length": 36, + "instruction": "removed the green cloth from the basket and placed it right of the basket", + "canonical_instruction": "removed the green cloth from the basket and placed it right of the basket", + "parquet": "data/chunk-014/episode_014702.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014702.mp4" + }, + { + "episode_id": 21378, + "source_index": 21378, + "raw_length": 37, + "instruction": "Place the spatula into the vessel", + "canonical_instruction": "place the spatula into the vessel", + "parquet": "data/chunk-021/episode_021378.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021378.mp4" + }, + { + "episode_id": 41993, + "source_index": 41993, + "raw_length": 37, + "instruction": "Move the pan to the middle left side of the table", + "canonical_instruction": "move the pan to the middle left side of the table", + "parquet": "data/chunk-041/episode_041993.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041993.mp4" + }, + { + "episode_id": 25056, + "source_index": 25056, + "raw_length": 35, + "instruction": "Put the piece on to of the blue block", + "canonical_instruction": "put the piece on to of the blue block", + "parquet": "data/chunk-025/episode_025056.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025056.mp4" + }, + { + "episode_id": 6647, + "source_index": 6647, + "raw_length": 19, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-006/episode_006647.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006647.mp4" + }, + { + "episode_id": 31121, + "source_index": 31121, + "raw_length": 35, + "instruction": "move the can to the top right of the table", + "canonical_instruction": "move the can to the top right of the table", + "parquet": "data/chunk-031/episode_031121.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031121.mp4" + }, + { + "episode_id": 46643, + "source_index": 46643, + "raw_length": 25, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-046/episode_046643.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046643.mp4" + }, + { + "episode_id": 4565, + "source_index": 4565, + "raw_length": 28, + "instruction": "move the pot to upper left of oventop", + "canonical_instruction": "move the pot to upper left of oventop", + "parquet": "data/chunk-004/episode_004565.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004565.mp4" + }, + { + "episode_id": 2303, + "source_index": 2303, + "raw_length": 19, + "instruction": "move the towel to the upper part of cooktop", + "canonical_instruction": "move the towel to the upper part of cooktop", + "parquet": "data/chunk-002/episode_002303.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002303.mp4" + }, + { + "episode_id": 984, + "source_index": 984, + "raw_length": 46, + "instruction": "remove the ball from the cup", + "canonical_instruction": "remove the ball from the cup", + "parquet": "data/chunk-000/episode_000984.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000984.mp4" + }, + { + "episode_id": 8324, + "source_index": 8324, + "raw_length": 21, + "instruction": "put pot or pan from sink into drying rack", + "canonical_instruction": "put pot or pan from sink into drying rack", + "parquet": "data/chunk-008/episode_008324.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008324.mp4" + }, + { + "episode_id": 50682, + "source_index": 50682, + "raw_length": 45, + "instruction": "move the gray object to the right burner", + "canonical_instruction": "move the gray object to the right burner", + "parquet": "data/chunk-050/episode_050682.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050682.mp4" + }, + { + "episode_id": 42299, + "source_index": 42299, + "raw_length": 18, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-042/episode_042299.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042299.mp4" + }, + { + "episode_id": 17102, + "source_index": 17102, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-017/episode_017102.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017102.mp4" + }, + { + "episode_id": 39832, + "source_index": 39832, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-039/episode_039832.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039832.mp4" + }, + { + "episode_id": 14339, + "source_index": 14339, + "raw_length": 31, + "instruction": "7210-2199-5955-2055-534", + "canonical_instruction": "7210-2199-5955-2055-534", + "parquet": "data/chunk-014/episode_014339.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014339.mp4" + }, + { + "episode_id": 52423, + "source_index": 52423, + "raw_length": 23, + "instruction": "moved the purple cloth to the left burner", + "canonical_instruction": "moved the purple cloth to the left burner", + "parquet": "data/chunk-052/episode_052423.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052423.mp4" + }, + { + "episode_id": 37886, + "source_index": 37886, + "raw_length": 36, + "instruction": "move the knife to the right of the towel", + "canonical_instruction": "move the knife to the right of the towel", + "parquet": "data/chunk-037/episode_037886.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037886.mp4" + }, + { + "episode_id": 48768, + "source_index": 48768, + "raw_length": 30, + "instruction": "take cup off plate", + "canonical_instruction": "take cup off plate", + "parquet": "data/chunk-048/episode_048768.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048768.mp4" + }, + { + "episode_id": 36826, + "source_index": 36826, + "raw_length": 33, + "instruction": "take the red object out of the pot and put it on the left burner", + "canonical_instruction": "take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-036/episode_036826.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036826.mp4" + }, + { + "episode_id": 18050, + "source_index": 18050, + "raw_length": 33, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-018/episode_018050.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018050.mp4" + }, + { + "episode_id": 15940, + "source_index": 15940, + "raw_length": 38, + "instruction": "Place the green cloth along with spatula just behind the vessel", + "canonical_instruction": "place the green cloth along with spatula just behind the vessel", + "parquet": "data/chunk-015/episode_015940.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015940.mp4" + }, + { + "episode_id": 4603, + "source_index": 4603, + "raw_length": 33, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-004/episode_004603.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004603.mp4" + }, + { + "episode_id": 45841, + "source_index": 45841, + "raw_length": 34, + "instruction": "moved the yellow bottle to the right side of the table", + "canonical_instruction": "moved the yellow bottle to the right side of the table", + "parquet": "data/chunk-045/episode_045841.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045841.mp4" + }, + { + "episode_id": 27718, + "source_index": 27718, + "raw_length": 26, + "instruction": "put the red thing to the drawer", + "canonical_instruction": "put the red thing to the drawer", + "parquet": "data/chunk-027/episode_027718.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027718.mp4" + }, + { + "episode_id": 5036, + "source_index": 5036, + "raw_length": 29, + "instruction": "move the silver pot to the middle top of the table", + "canonical_instruction": "move the silver pot to the middle top of the table", + "parquet": "data/chunk-005/episode_005036.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005036.mp4" + }, + { + "episode_id": 48865, + "source_index": 48865, + "raw_length": 45, + "instruction": "move the silver pot to the middle button of the burner", + "canonical_instruction": "move the silver pot to the middle button of the burner", + "parquet": "data/chunk-048/episode_048865.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048865.mp4" + }, + { + "episode_id": 2589, + "source_index": 2589, + "raw_length": 34, + "instruction": "Place the yellow brush on top of the yellow towel", + "canonical_instruction": "place the yellow brush on top of the yellow towel", + "parquet": "data/chunk-002/episode_002589.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002589.mp4" + }, + { + "episode_id": 25109, + "source_index": 25109, + "raw_length": 46, + "instruction": "put the block on top of the cylinder", + "canonical_instruction": "put the block on top of the cylinder", + "parquet": "data/chunk-025/episode_025109.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025109.mp4" + }, + { + "episode_id": 36002, + "source_index": 36002, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-036/episode_036002.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036002.mp4" + }, + { + "episode_id": 33863, + "source_index": 33863, + "raw_length": 37, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-033/episode_033863.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033863.mp4" + }, + { + "episode_id": 5168, + "source_index": 5168, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-005/episode_005168.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005168.mp4" + }, + { + "episode_id": 16202, + "source_index": 16202, + "raw_length": 36, + "instruction": "moved the king from the left side to the left side", + "canonical_instruction": "moved the king from the left side to the left side", + "parquet": "data/chunk-016/episode_016202.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016202.mp4" + }, + { + "episode_id": 21386, + "source_index": 21386, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-021/episode_021386.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021386.mp4" + }, + { + "episode_id": 18081, + "source_index": 18081, + "raw_length": 44, + "instruction": "Place the measuring cup on the front right corner of the table.", + "canonical_instruction": "place the measuring cup on the front right corner of the table", + "parquet": "data/chunk-018/episode_018081.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018081.mp4" + }, + { + "episode_id": 36572, + "source_index": 36572, + "raw_length": 26, + "instruction": "put potato on plate", + "canonical_instruction": "put potato on plate", + "parquet": "data/chunk-036/episode_036572.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036572.mp4" + }, + { + "episode_id": 2980, + "source_index": 2980, + "raw_length": 37, + "instruction": "fold the cloth from top left and bottom left", + "canonical_instruction": "fold the cloth from top left and bottom left", + "parquet": "data/chunk-002/episode_002980.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002980.mp4" + }, + { + "episode_id": 35787, + "source_index": 35787, + "raw_length": 21, + "instruction": "move the silver pot to the upper left side burner", + "canonical_instruction": "move the silver pot to the upper left side burner", + "parquet": "data/chunk-035/episode_035787.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035787.mp4" + }, + { + "episode_id": 18257, + "source_index": 18257, + "raw_length": 46, + "instruction": "put the cylinder on top of the tower", + "canonical_instruction": "put the cylinder on top of the tower", + "parquet": "data/chunk-018/episode_018257.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018257.mp4" + }, + { + "episode_id": 20730, + "source_index": 20730, + "raw_length": 37, + "instruction": "Move the red object to the upper left side of the table", + "canonical_instruction": "move the red object to the upper left side of the table", + "parquet": "data/chunk-020/episode_020730.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020730.mp4" + }, + { + "episode_id": 15164, + "source_index": 15164, + "raw_length": 46, + "instruction": "put the green cloth in the white basket", + "canonical_instruction": "put the green cloth in the white basket", + "parquet": "data/chunk-015/episode_015164.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015164.mp4" + }, + { + "episode_id": 20391, + "source_index": 20391, + "raw_length": 42, + "instruction": "put the knife in top of silver pot", + "canonical_instruction": "put the knife in top of silver pot", + "parquet": "data/chunk-020/episode_020391.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020391.mp4" + }, + { + "episode_id": 13292, + "source_index": 13292, + "raw_length": 23, + "instruction": "grab the white basket", + "canonical_instruction": "grab the white basket", + "parquet": "data/chunk-013/episode_013292.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013292.mp4" + }, + { + "episode_id": 2520, + "source_index": 2520, + "raw_length": 23, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-002/episode_002520.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002520.mp4" + }, + { + "episode_id": 37543, + "source_index": 37543, + "raw_length": 31, + "instruction": "put the blue brush in the lower right side of the burner.", + "canonical_instruction": "put the blue brush in the lower right side of the burner", + "parquet": "data/chunk-037/episode_037543.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037543.mp4" + }, + { + "episode_id": 45960, + "source_index": 45960, + "raw_length": 30, + "instruction": "put the can at the left side burner", + "canonical_instruction": "put the can at the left side burner", + "parquet": "data/chunk-045/episode_045960.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045960.mp4" + }, + { + "episode_id": 16964, + "source_index": 16964, + "raw_length": 46, + "instruction": "move the yellow cube to the right and placed it on top of the green cube", + "canonical_instruction": "move the yellow cube to the right and placed it on top of the green cube", + "parquet": "data/chunk-016/episode_016964.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016964.mp4" + }, + { + "episode_id": 15049, + "source_index": 15049, + "raw_length": 34, + "instruction": "put the lid on upper right burner", + "canonical_instruction": "put the lid on upper right burner", + "parquet": "data/chunk-015/episode_015049.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015049.mp4" + }, + { + "episode_id": 10389, + "source_index": 10389, + "raw_length": 21, + "instruction": "put pot or pan on stove", + "canonical_instruction": "put pot or pan on stove", + "parquet": "data/chunk-010/episode_010389.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010389.mp4" + }, + { + "episode_id": 4171, + "source_index": 4171, + "raw_length": 26, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-004/episode_004171.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004171.mp4" + }, + { + "episode_id": 5418, + "source_index": 5418, + "raw_length": 36, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-005/episode_005418.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005418.mp4" + }, + { + "episode_id": 24350, + "source_index": 24350, + "raw_length": 46, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-024/episode_024350.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024350.mp4" + }, + { + "episode_id": 37224, + "source_index": 37224, + "raw_length": 33, + "instruction": "put sushi in pot cardboard fence", + "canonical_instruction": "put sushi in pot cardboard fence", + "parquet": "data/chunk-037/episode_037224.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037224.mp4" + }, + { + "episode_id": 12739, + "source_index": 12739, + "raw_length": 30, + "instruction": "moving the cucumber from ground and placed on the table", + "canonical_instruction": "moving the cucumber from ground and placed on the table", + "parquet": "data/chunk-012/episode_012739.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012739.mp4" + }, + { + "episode_id": 7722, + "source_index": 7722, + "raw_length": 46, + "instruction": "The robot folds the cloth from the top right to the bottom left", + "canonical_instruction": "the robot folds the cloth from the top right to the bottom left", + "parquet": "data/chunk-007/episode_007722.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007722.mp4" + }, + { + "episode_id": 3644, + "source_index": 3644, + "raw_length": 30, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-003/episode_003644.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003644.mp4" + }, + { + "episode_id": 28826, + "source_index": 28826, + "raw_length": 45, + "instruction": "take the object in the red pot and put it on the lower left burner", + "canonical_instruction": "take the object in the red pot and put it on the lower left burner", + "parquet": "data/chunk-028/episode_028826.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028826.mp4" + }, + { + "episode_id": 13230, + "source_index": 13230, + "raw_length": 26, + "instruction": "move the green object to the lower middle of the table", + "canonical_instruction": "move the green object to the lower middle of the table", + "parquet": "data/chunk-013/episode_013230.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013230.mp4" + }, + { + "episode_id": 29726, + "source_index": 29726, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-029/episode_029726.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029726.mp4" + }, + { + "episode_id": 38865, + "source_index": 38865, + "raw_length": 32, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-038/episode_038865.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038865.mp4" + }, + { + "episode_id": 30957, + "source_index": 30957, + "raw_length": 31, + "instruction": "move the little box to the top right side of the stove", + "canonical_instruction": "move the little box to the top right side of the stove", + "parquet": "data/chunk-030/episode_030957.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030957.mp4" + }, + { + "episode_id": 39344, + "source_index": 39344, + "raw_length": 64, + "instruction": "put potato on plate and strawberry in pot or pan in sink", + "canonical_instruction": "put potato on plate and strawberry in pot or pan in sink", + "parquet": "data/chunk-039/episode_039344.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039344.mp4" + }, + { + "episode_id": 1597, + "source_index": 1597, + "raw_length": 31, + "instruction": "put the banana on the yellow cloth", + "canonical_instruction": "put the banana on the yellow cloth", + "parquet": "data/chunk-001/episode_001597.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001597.mp4" + }, + { + "episode_id": 26754, + "source_index": 26754, + "raw_length": 28, + "instruction": "PICK UP THE SPOON AND KEEP NEAR TO THE WHITE TOWEL", + "canonical_instruction": "pick up the spoon and keep near to the white towel", + "parquet": "data/chunk-026/episode_026754.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026754.mp4" + }, + { + "episode_id": 14654, + "source_index": 14654, + "raw_length": 30, + "instruction": "move the blue block to the edge of the cloth", + "canonical_instruction": "move the blue block to the edge of the cloth", + "parquet": "data/chunk-014/episode_014654.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014654.mp4" + }, + { + "episode_id": 35008, + "source_index": 35008, + "raw_length": 46, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-035/episode_035008.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035008.mp4" + }, + { + "episode_id": 21971, + "source_index": 21971, + "raw_length": 37, + "instruction": "pick up the cloth and place it to the right of the table", + "canonical_instruction": "pick up the cloth and place it to the right of the table", + "parquet": "data/chunk-021/episode_021971.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021971.mp4" + }, + { + "episode_id": 5315, + "source_index": 5315, + "raw_length": 42, + "instruction": "Place the knife on the purple cloth.", + "canonical_instruction": "place the knife on the purple cloth", + "parquet": "data/chunk-005/episode_005315.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005315.mp4" + }, + { + "episode_id": 30366, + "source_index": 30366, + "raw_length": 56, + "instruction": "move the cleaver to the metal pot", + "canonical_instruction": "move the cleaver to the metal pot", + "parquet": "data/chunk-030/episode_030366.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030366.mp4" + }, + { + "episode_id": 13032, + "source_index": 13032, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-013/episode_013032.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013032.mp4" + }, + { + "episode_id": 19793, + "source_index": 19793, + "raw_length": 22, + "instruction": "moved the thing to the left side of the table", + "canonical_instruction": "moved the thing to the left side of the table", + "parquet": "data/chunk-019/episode_019793.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019793.mp4" + }, + { + "episode_id": 19100, + "source_index": 19100, + "raw_length": 28, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-019/episode_019100.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019100.mp4" + }, + { + "episode_id": 40106, + "source_index": 40106, + "raw_length": 24, + "instruction": "Place the mushroom inside of the metal pot", + "canonical_instruction": "place the mushroom inside of the metal pot", + "parquet": "data/chunk-040/episode_040106.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040106.mp4" + }, + { + "episode_id": 6217, + "source_index": 6217, + "raw_length": 31, + "instruction": "Put the pepper inside the pan", + "canonical_instruction": "put the pepper inside the pan", + "parquet": "data/chunk-006/episode_006217.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006217.mp4" + }, + { + "episode_id": 34336, + "source_index": 34336, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-034/episode_034336.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034336.mp4" + }, + { + "episode_id": 37902, + "source_index": 37902, + "raw_length": 29, + "instruction": "Put the napkin on the bottom right.", + "canonical_instruction": "put the napkin on the bottom right", + "parquet": "data/chunk-037/episode_037902.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037902.mp4" + }, + { + "episode_id": 14309, + "source_index": 14309, + "raw_length": 33, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-014/episode_014309.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014309.mp4" + }, + { + "episode_id": 18398, + "source_index": 18398, + "raw_length": 27, + "instruction": "move the fork above cloth", + "canonical_instruction": "move the fork above cloth", + "parquet": "data/chunk-018/episode_018398.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018398.mp4" + }, + { + "episode_id": 10830, + "source_index": 10830, + "raw_length": 34, + "instruction": "move the red thing in the middle of the spoon and red box to upper left part of the table", + "canonical_instruction": "move the red thing in the middle of the spoon and red box to upper left part of the table", + "parquet": "data/chunk-010/episode_010830.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010830.mp4" + }, + { + "episode_id": 48020, + "source_index": 48020, + "raw_length": 35, + "instruction": "move the cloth", + "canonical_instruction": "move the cloth", + "parquet": "data/chunk-048/episode_048020.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048020.mp4" + }, + { + "episode_id": 35203, + "source_index": 35203, + "raw_length": 24, + "instruction": "moved the cloth to the top left edge of the table", + "canonical_instruction": "moved the cloth to the top left edge of the table", + "parquet": "data/chunk-035/episode_035203.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035203.mp4" + }, + { + "episode_id": 12635, + "source_index": 12635, + "raw_length": 37, + "instruction": "take the blue cloth and put it in the white basket", + "canonical_instruction": "take the blue cloth and put it in the white basket", + "parquet": "data/chunk-012/episode_012635.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012635.mp4" + }, + { + "episode_id": 21460, + "source_index": 21460, + "raw_length": 46, + "instruction": "Move the blue fork to the left of the pot", + "canonical_instruction": "move the blue fork to the left of the pot", + "parquet": "data/chunk-021/episode_021460.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021460.mp4" + }, + { + "episode_id": 40599, + "source_index": 40599, + "raw_length": 34, + "instruction": "move vessel diagonally on the right from top to bottom", + "canonical_instruction": "move vessel diagonally on the right from top to bottom", + "parquet": "data/chunk-040/episode_040599.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040599.mp4" + }, + { + "episode_id": 11515, + "source_index": 11515, + "raw_length": 46, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-011/episode_011515.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011515.mp4" + }, + { + "episode_id": 43183, + "source_index": 43183, + "raw_length": 35, + "instruction": "closed the drawer", + "canonical_instruction": "closed the drawer", + "parquet": "data/chunk-043/episode_043183.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043183.mp4" + }, + { + "episode_id": 35490, + "source_index": 35490, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-035/episode_035490.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035490.mp4" + }, + { + "episode_id": 41611, + "source_index": 41611, + "raw_length": 22, + "instruction": "nothing", + "canonical_instruction": "nothing", + "parquet": "data/chunk-041/episode_041611.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041611.mp4" + }, + { + "episode_id": 15136, + "source_index": 15136, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-015/episode_015136.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015136.mp4" + }, + { + "episode_id": 38898, + "source_index": 38898, + "raw_length": 33, + "instruction": "Move the spoon so it's above the pot.", + "canonical_instruction": "move the spoon so it's above the pot", + "parquet": "data/chunk-038/episode_038898.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038898.mp4" + }, + { + "episode_id": 22620, + "source_index": 22620, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-022/episode_022620.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022620.mp4" + }, + { + "episode_id": 21552, + "source_index": 21552, + "raw_length": 30, + "instruction": "Move the pot from corner to the edge of the table.", + "canonical_instruction": "move the pot from corner to the edge of the table", + "parquet": "data/chunk-021/episode_021552.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021552.mp4" + }, + { + "episode_id": 9651, + "source_index": 9651, + "raw_length": 37, + "instruction": "Unfold the cloth from top to bottom", + "canonical_instruction": "unfold the cloth from top to bottom", + "parquet": "data/chunk-009/episode_009651.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009651.mp4" + }, + { + "episode_id": 44814, + "source_index": 44814, + "raw_length": 43, + "instruction": "Put the red spoon in between the pan and the green cloth", + "canonical_instruction": "put the red spoon in between the pan and the green cloth", + "parquet": "data/chunk-044/episode_044814.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044814.mp4" + }, + { + "episode_id": 26, + "source_index": 26, + "raw_length": 46, + "instruction": "take the yellow cube and move in to the left", + "canonical_instruction": "take the yellow cube and move in to the left", + "parquet": "data/chunk-000/episode_000026.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000026.mp4" + }, + { + "episode_id": 15350, + "source_index": 15350, + "raw_length": 46, + "instruction": "put the pot to the left burner", + "canonical_instruction": "put the pot to the left burner", + "parquet": "data/chunk-015/episode_015350.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015350.mp4" + }, + { + "episode_id": 28066, + "source_index": 28066, + "raw_length": 35, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-028/episode_028066.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028066.mp4" + }, + { + "episode_id": 17788, + "source_index": 17788, + "raw_length": 36, + "instruction": "Take the red thing out of the drawer and put on the upper left side of the drawer", + "canonical_instruction": "take the red thing out of the drawer and put on the upper left side of the drawer", + "parquet": "data/chunk-017/episode_017788.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017788.mp4" + }, + { + "episode_id": 43353, + "source_index": 43353, + "raw_length": 21, + "instruction": "zip zipper bag", + "canonical_instruction": "zip zipper bag", + "parquet": "data/chunk-043/episode_043353.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043353.mp4" + }, + { + "episode_id": 8045, + "source_index": 8045, + "raw_length": 35, + "instruction": "take the blue figure from the top edge of the cloth to the table", + "canonical_instruction": "take the blue figure from the top edge of the cloth to the table", + "parquet": "data/chunk-008/episode_008045.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008045.mp4" + }, + { + "episode_id": 12804, + "source_index": 12804, + "raw_length": 33, + "instruction": "take sushi off plate", + "canonical_instruction": "take sushi off plate", + "parquet": "data/chunk-012/episode_012804.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012804.mp4" + }, + { + "episode_id": 47010, + "source_index": 47010, + "raw_length": 45, + "instruction": "put the cylinder on top of the yellow cube", + "canonical_instruction": "put the cylinder on top of the yellow cube", + "parquet": "data/chunk-047/episode_047010.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047010.mp4" + }, + { + "episode_id": 1115, + "source_index": 1115, + "raw_length": 34, + "instruction": "déplacer l objet argenté à coter droite du bruleur", + "canonical_instruction": "déplacer l objet argenté à coter droite du bruleur", + "parquet": "data/chunk-001/episode_001115.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001115.mp4" + }, + { + "episode_id": 27858, + "source_index": 27858, + "raw_length": 22, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-027/episode_027858.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027858.mp4" + }, + { + "episode_id": 34588, + "source_index": 34588, + "raw_length": 50, + "instruction": "the mango with a bite was taken from the right side of the burner and placed inside the pot", + "canonical_instruction": "the mango with a bite was taken from the right side of the burner and placed inside the pot", + "parquet": "data/chunk-034/episode_034588.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034588.mp4" + }, + { + "episode_id": 26373, + "source_index": 26373, + "raw_length": 31, + "instruction": "move the object beside the cover", + "canonical_instruction": "move the object beside the cover", + "parquet": "data/chunk-026/episode_026373.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026373.mp4" + }, + { + "episode_id": 16188, + "source_index": 16188, + "raw_length": 38, + "instruction": "fold the cloth from right to middle", + "canonical_instruction": "fold the cloth from right to middle", + "parquet": "data/chunk-016/episode_016188.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016188.mp4" + }, + { + "episode_id": 561, + "source_index": 561, + "raw_length": 28, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-000/episode_000561.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000561.mp4" + }, + { + "episode_id": 17547, + "source_index": 17547, + "raw_length": 39, + "instruction": "Move the can to the back of the table in front of the red spoon and close to the wall.", + "canonical_instruction": "move the can to the back of the table in front of the red spoon and close to the wall", + "parquet": "data/chunk-017/episode_017547.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017547.mp4" + }, + { + "episode_id": 33111, + "source_index": 33111, + "raw_length": 46, + "instruction": "Move the fish to the far left of the spoon.", + "canonical_instruction": "move the fish to the far left of the spoon", + "parquet": "data/chunk-033/episode_033111.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033111.mp4" + }, + { + "episode_id": 31841, + "source_index": 31841, + "raw_length": 31, + "instruction": "opened the box thne put a banana then closed the box", + "canonical_instruction": "opened the box thne put a banana then closed the box", + "parquet": "data/chunk-031/episode_031841.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031841.mp4" + }, + { + "episode_id": 47853, + "source_index": 47853, + "raw_length": 24, + "instruction": "put corn on plate", + "canonical_instruction": "put corn on plate", + "parquet": "data/chunk-047/episode_047853.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047853.mp4" + }, + { + "episode_id": 31508, + "source_index": 31508, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-031/episode_031508.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031508.mp4" + }, + { + "episode_id": 31402, + "source_index": 31402, + "raw_length": 46, + "instruction": "move the red fork to the middle of the stove", + "canonical_instruction": "move the red fork to the middle of the stove", + "parquet": "data/chunk-031/episode_031402.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031402.mp4" + }, + { + "episode_id": 50956, + "source_index": 50956, + "raw_length": 42, + "instruction": "Move the spatula to the left side of the table.", + "canonical_instruction": "move the spatula to the left side of the table", + "parquet": "data/chunk-050/episode_050956.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050956.mp4" + }, + { + "episode_id": 16586, + "source_index": 16586, + "raw_length": 41, + "instruction": "put the yellow cube on top of the tower", + "canonical_instruction": "put the yellow cube on top of the tower", + "parquet": "data/chunk-016/episode_016586.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016586.mp4" + }, + { + "episode_id": 29984, + "source_index": 29984, + "raw_length": 17, + "instruction": "put potato in pot or pan", + "canonical_instruction": "put potato in pot or pan", + "parquet": "data/chunk-029/episode_029984.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029984.mp4" + }, + { + "episode_id": 16725, + "source_index": 16725, + "raw_length": 23, + "instruction": "Move the blue cloth in front of the microwave", + "canonical_instruction": "move the blue cloth in front of the microwave", + "parquet": "data/chunk-016/episode_016725.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016725.mp4" + }, + { + "episode_id": 45915, + "source_index": 45915, + "raw_length": 56, + "instruction": "put the red object on the left burner", + "canonical_instruction": "put the red object on the left burner", + "parquet": "data/chunk-045/episode_045915.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045915.mp4" + }, + { + "episode_id": 29968, + "source_index": 29968, + "raw_length": 46, + "instruction": "move the potato from left side to right side", + "canonical_instruction": "move the potato from left side to right side", + "parquet": "data/chunk-029/episode_029968.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029968.mp4" + }, + { + "episode_id": 43604, + "source_index": 43604, + "raw_length": 18, + "instruction": "move the can to the bottom left side of the table", + "canonical_instruction": "move the can to the bottom left side of the table", + "parquet": "data/chunk-043/episode_043604.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043604.mp4" + }, + { + "episode_id": 26843, + "source_index": 26843, + "raw_length": 19, + "instruction": "put the yellow duck on top of the drawer", + "canonical_instruction": "put the yellow duck on top of the drawer", + "parquet": "data/chunk-026/episode_026843.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026843.mp4" + }, + { + "episode_id": 39688, + "source_index": 39688, + "raw_length": 39, + "instruction": "place of the cucumber between vessel and spatula.", + "canonical_instruction": "place of the cucumber between vessel and spatula", + "parquet": "data/chunk-039/episode_039688.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039688.mp4" + }, + { + "episode_id": 7897, + "source_index": 7897, + "raw_length": 32, + "instruction": "Move the pan towards the bottom of the left burner.", + "canonical_instruction": "move the pan towards the bottom of the left burner", + "parquet": "data/chunk-007/episode_007897.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007897.mp4" + }, + { + "episode_id": 50818, + "source_index": 50818, + "raw_length": 46, + "instruction": "removed the pink spoon away from the cooker", + "canonical_instruction": "removed the pink spoon away from the cooker", + "parquet": "data/chunk-050/episode_050818.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050818.mp4" + }, + { + "episode_id": 18539, + "source_index": 18539, + "raw_length": 46, + "instruction": "put the blue object on the top middle of the table", + "canonical_instruction": "put the blue object on the top middle of the table", + "parquet": "data/chunk-018/episode_018539.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018539.mp4" + }, + { + "episode_id": 25130, + "source_index": 25130, + "raw_length": 34, + "instruction": "Place the red pepper on the yellow cloth.", + "canonical_instruction": "place the red pepper on the yellow cloth", + "parquet": "data/chunk-025/episode_025130.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025130.mp4" + }, + { + "episode_id": 2548, + "source_index": 2548, + "raw_length": 21, + "instruction": "put cup into pot or pan", + "canonical_instruction": "put cup into pot or pan", + "parquet": "data/chunk-002/episode_002548.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002548.mp4" + }, + { + "episode_id": 44040, + "source_index": 44040, + "raw_length": 65, + "instruction": "put pot or pan on stove and put mushroom in pot or pan", + "canonical_instruction": "put pot or pan on stove and put mushroom in pot or pan", + "parquet": "data/chunk-044/episode_044040.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044040.mp4" + }, + { + "episode_id": 29234, + "source_index": 29234, + "raw_length": 31, + "instruction": "Put the orange pot on the top right side of the table", + "canonical_instruction": "put the orange pot on the top right side of the table", + "parquet": "data/chunk-029/episode_029234.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029234.mp4" + }, + { + "episode_id": 5126, + "source_index": 5126, + "raw_length": 46, + "instruction": "Put the red arch on top of another red arch", + "canonical_instruction": "put the red arch on top of another red arch", + "parquet": "data/chunk-005/episode_005126.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005126.mp4" + }, + { + "episode_id": 15558, + "source_index": 15558, + "raw_length": 36, + "instruction": "take lid off pot", + "canonical_instruction": "take lid off pot", + "parquet": "data/chunk-015/episode_015558.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015558.mp4" + }, + { + "episode_id": 23549, + "source_index": 23549, + "raw_length": 41, + "instruction": "Place the fork in front of the microwave.", + "canonical_instruction": "place the fork in front of the microwave", + "parquet": "data/chunk-023/episode_023549.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023549.mp4" + }, + { + "episode_id": 15942, + "source_index": 15942, + "raw_length": 46, + "instruction": "move the purple object to the top of the clothe", + "canonical_instruction": "move the purple object to the top of the clothe", + "parquet": "data/chunk-015/episode_015942.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015942.mp4" + }, + { + "episode_id": 21278, + "source_index": 21278, + "raw_length": 39, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-021/episode_021278.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021278.mp4" + }, + { + "episode_id": 6251, + "source_index": 6251, + "raw_length": 46, + "instruction": "move blue spoon diagonally little bit down", + "canonical_instruction": "move blue spoon diagonally little bit down", + "parquet": "data/chunk-006/episode_006251.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006251.mp4" + }, + { + "episode_id": 11284, + "source_index": 11284, + "raw_length": 37, + "instruction": "put the cloth on the left side of the burner", + "canonical_instruction": "put the cloth on the left side of the burner", + "parquet": "data/chunk-011/episode_011284.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011284.mp4" + }, + { + "episode_id": 33826, + "source_index": 33826, + "raw_length": 33, + "instruction": "move the can to the lower right corner of table", + "canonical_instruction": "move the can to the lower right corner of table", + "parquet": "data/chunk-033/episode_033826.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033826.mp4" + }, + { + "episode_id": 20112, + "source_index": 20112, + "raw_length": 40, + "instruction": "Place spoon on the bottom edge", + "canonical_instruction": "place spoon on the bottom edge", + "parquet": "data/chunk-020/episode_020112.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020112.mp4" + }, + { + "episode_id": 46805, + "source_index": 46805, + "raw_length": 69, + "instruction": "put blueberry on plate and potato in pot or pan on stove", + "canonical_instruction": "put blueberry on plate and potato in pot or pan on stove", + "parquet": "data/chunk-046/episode_046805.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046805.mp4" + }, + { + "episode_id": 47449, + "source_index": 47449, + "raw_length": 21, + "instruction": "Move the red object on the green napkin", + "canonical_instruction": "move the red object on the green napkin", + "parquet": "data/chunk-047/episode_047449.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047449.mp4" + }, + { + "episode_id": 6684, + "source_index": 6684, + "raw_length": 30, + "instruction": "take spoon out of bowl sink", + "canonical_instruction": "take spoon out of bowl sink", + "parquet": "data/chunk-006/episode_006684.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006684.mp4" + }, + { + "episode_id": 24428, + "source_index": 24428, + "raw_length": 46, + "instruction": "put the green arch on the top of blue rectangular block", + "canonical_instruction": "put the green arch on the top of blue rectangular block", + "parquet": "data/chunk-024/episode_024428.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024428.mp4" + }, + { + "episode_id": 21333, + "source_index": 21333, + "raw_length": 44, + "instruction": "put the silver pot to the left side plate in the burner", + "canonical_instruction": "put the silver pot to the left side plate in the burner", + "parquet": "data/chunk-021/episode_021333.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021333.mp4" + }, + { + "episode_id": 49607, + "source_index": 49607, + "raw_length": 49, + "instruction": "take the object to put on the right", + "canonical_instruction": "take the object to put on the right", + "parquet": "data/chunk-049/episode_049607.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049607.mp4" + }, + { + "episode_id": 43186, + "source_index": 43186, + "raw_length": 32, + "instruction": "moved the yellow knife to the left side of the table", + "canonical_instruction": "moved the yellow knife to the left side of the table", + "parquet": "data/chunk-043/episode_043186.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043186.mp4" + }, + { + "episode_id": 48447, + "source_index": 48447, + "raw_length": 32, + "instruction": "Move the pepper to the center of the counter's close edge.", + "canonical_instruction": "move the pepper to the center of the counter's close edge", + "parquet": "data/chunk-048/episode_048447.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048447.mp4" + }, + { + "episode_id": 49304, + "source_index": 49304, + "raw_length": 46, + "instruction": "Place the banana inside the orange pot", + "canonical_instruction": "place the banana inside the orange pot", + "parquet": "data/chunk-049/episode_049304.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049304.mp4" + }, + { + "episode_id": 47304, + "source_index": 47304, + "raw_length": 38, + "instruction": "move the blue spoon to the left of the sink", + "canonical_instruction": "move the blue spoon to the left of the sink", + "parquet": "data/chunk-047/episode_047304.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047304.mp4" + }, + { + "episode_id": 46099, + "source_index": 46099, + "raw_length": 38, + "instruction": "moved the blue elephant to the left side of the table", + "canonical_instruction": "moved the blue elephant to the left side of the table", + "parquet": "data/chunk-046/episode_046099.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046099.mp4" + }, + { + "episode_id": 17859, + "source_index": 17859, + "raw_length": 32, + "instruction": "topple basil bottle cardboard fence", + "canonical_instruction": "topple basil bottle cardboard fence", + "parquet": "data/chunk-017/episode_017859.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017859.mp4" + }, + { + "episode_id": 42291, + "source_index": 42291, + "raw_length": 31, + "instruction": "Place the bowl between the blue spoon and green towel", + "canonical_instruction": "place the bowl between the blue spoon and green towel", + "parquet": "data/chunk-042/episode_042291.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042291.mp4" + }, + { + "episode_id": 8390, + "source_index": 8390, + "raw_length": 18, + "instruction": "move the blue cloth in front of the microwave oven", + "canonical_instruction": "move the blue cloth in front of the microwave oven", + "parquet": "data/chunk-008/episode_008390.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008390.mp4" + }, + { + "episode_id": 41579, + "source_index": 41579, + "raw_length": 36, + "instruction": "put cup on plate", + "canonical_instruction": "put cup on plate", + "parquet": "data/chunk-041/episode_041579.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041579.mp4" + }, + { + "episode_id": 48452, + "source_index": 48452, + "raw_length": 46, + "instruction": "Open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-048/episode_048452.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048452.mp4" + }, + { + "episode_id": 35974, + "source_index": 35974, + "raw_length": 40, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-035/episode_035974.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035974.mp4" + }, + { + "episode_id": 31063, + "source_index": 31063, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-031/episode_031063.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031063.mp4" + }, + { + "episode_id": 33130, + "source_index": 33130, + "raw_length": 78, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-033/episode_033130.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033130.mp4" + }, + { + "episode_id": 6452, + "source_index": 6452, + "raw_length": 45, + "instruction": "moved the blue towel left of the silver pot", + "canonical_instruction": "moved the blue towel left of the silver pot", + "parquet": "data/chunk-006/episode_006452.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006452.mp4" + }, + { + "episode_id": 16482, + "source_index": 16482, + "raw_length": 41, + "instruction": "put the ball in the cup", + "canonical_instruction": "put the ball in the cup", + "parquet": "data/chunk-016/episode_016482.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016482.mp4" + }, + { + "episode_id": 49374, + "source_index": 49374, + "raw_length": 36, + "instruction": "take sushi out of pot cardboard fence", + "canonical_instruction": "take sushi out of pot cardboard fence", + "parquet": "data/chunk-049/episode_049374.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049374.mp4" + }, + { + "episode_id": 32574, + "source_index": 32574, + "raw_length": 44, + "instruction": "moved the spoon to the right side of the stove", + "canonical_instruction": "moved the spoon to the right side of the stove", + "parquet": "data/chunk-032/episode_032574.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032574.mp4" + }, + { + "episode_id": 31970, + "source_index": 31970, + "raw_length": 29, + "instruction": "put the sashimi to top of the stove", + "canonical_instruction": "put the sashimi to top of the stove", + "parquet": "data/chunk-031/episode_031970.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031970.mp4" + }, + { + "episode_id": 4454, + "source_index": 4454, + "raw_length": 32, + "instruction": "open cabinet", + "canonical_instruction": "open cabinet", + "parquet": "data/chunk-004/episode_004454.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004454.mp4" + }, + { + "episode_id": 16095, + "source_index": 16095, + "raw_length": 27, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-016/episode_016095.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016095.mp4" + }, + { + "episode_id": 9053, + "source_index": 9053, + "raw_length": 21, + "instruction": "move faucet front to left", + "canonical_instruction": "move faucet front to left", + "parquet": "data/chunk-009/episode_009053.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009053.mp4" + }, + { + "episode_id": 9972, + "source_index": 9972, + "raw_length": 17, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-009/episode_009972.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009972.mp4" + }, + { + "episode_id": 25980, + "source_index": 25980, + "raw_length": 31, + "instruction": "move the can to the bottom of the right side burner", + "canonical_instruction": "move the can to the bottom of the right side burner", + "parquet": "data/chunk-025/episode_025980.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025980.mp4" + }, + { + "episode_id": 12844, + "source_index": 12844, + "raw_length": 34, + "instruction": "Move the mushroom from the top left of the table to the bottom right of the table.", + "canonical_instruction": "move the mushroom from the top left of the table to the bottom right of the table", + "parquet": "data/chunk-012/episode_012844.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012844.mp4" + }, + { + "episode_id": 10644, + "source_index": 10644, + "raw_length": 46, + "instruction": "move yellow cube from tower and place it on top of cylinder", + "canonical_instruction": "move yellow cube from tower and place it on top of cylinder", + "parquet": "data/chunk-010/episode_010644.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010644.mp4" + }, + { + "episode_id": 20896, + "source_index": 20896, + "raw_length": 32, + "instruction": "move the croissant above the blue cloth", + "canonical_instruction": "move the croissant above the blue cloth", + "parquet": "data/chunk-020/episode_020896.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020896.mp4" + }, + { + "episode_id": 2545, + "source_index": 2545, + "raw_length": 27, + "instruction": "folds the cloth from bottom left to top right", + "canonical_instruction": "folds the cloth from bottom left to top right", + "parquet": "data/chunk-002/episode_002545.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002545.mp4" + }, + { + "episode_id": 44614, + "source_index": 44614, + "raw_length": 17, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-044/episode_044614.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044614.mp4" + }, + { + "episode_id": 27543, + "source_index": 27543, + "raw_length": 20, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-027/episode_027543.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027543.mp4" + }, + { + "episode_id": 36441, + "source_index": 36441, + "raw_length": 46, + "instruction": "Pick up the red fruit and put it in the pot", + "canonical_instruction": "pick up the red fruit and put it in the pot", + "parquet": "data/chunk-036/episode_036441.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036441.mp4" + }, + { + "episode_id": 48108, + "source_index": 48108, + "raw_length": 21, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-048/episode_048108.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048108.mp4" + }, + { + "episode_id": 24316, + "source_index": 24316, + "raw_length": 46, + "instruction": "put mushroom on the blue towel", + "canonical_instruction": "put mushroom on the blue towel", + "parquet": "data/chunk-024/episode_024316.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024316.mp4" + }, + { + "episode_id": 46432, + "source_index": 46432, + "raw_length": 39, + "instruction": "unfold the cloth from top left to right", + "canonical_instruction": "unfold the cloth from top left to right", + "parquet": "data/chunk-046/episode_046432.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046432.mp4" + }, + { + "episode_id": 32597, + "source_index": 32597, + "raw_length": 28, + "instruction": "Poor quality images", + "canonical_instruction": "poor quality images", + "parquet": "data/chunk-032/episode_032597.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032597.mp4" + }, + { + "episode_id": 29235, + "source_index": 29235, + "raw_length": 33, + "instruction": "Pick up the mushroom and place it in the metal pot.", + "canonical_instruction": "pick up the mushroom and place it in the metal pot", + "parquet": "data/chunk-029/episode_029235.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029235.mp4" + }, + { + "episode_id": 7209, + "source_index": 7209, + "raw_length": 35, + "instruction": "move the green cloth beside the blue fork", + "canonical_instruction": "move the green cloth beside the blue fork", + "parquet": "data/chunk-007/episode_007209.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007209.mp4" + }, + { + "episode_id": 7721, + "source_index": 7721, + "raw_length": 40, + "instruction": "move the silver bowl to the upper left side of the stove", + "canonical_instruction": "move the silver bowl to the upper left side of the stove", + "parquet": "data/chunk-007/episode_007721.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007721.mp4" + }, + { + "episode_id": 31543, + "source_index": 31543, + "raw_length": 23, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-031/episode_031543.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031543.mp4" + }, + { + "episode_id": 51274, + "source_index": 51274, + "raw_length": 40, + "instruction": "Move the blue towel from the back of the board to the front of the board.", + "canonical_instruction": "move the blue towel from the back of the board to the front of the board", + "parquet": "data/chunk-051/episode_051274.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051274.mp4" + }, + { + "episode_id": 40376, + "source_index": 40376, + "raw_length": 24, + "instruction": "put pepper in pan", + "canonical_instruction": "put pepper in pan", + "parquet": "data/chunk-040/episode_040376.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040376.mp4" + }, + { + "episode_id": 50214, + "source_index": 50214, + "raw_length": 30, + "instruction": "moved the toy to the bottom right side of the burner", + "canonical_instruction": "moved the toy to the bottom right side of the burner", + "parquet": "data/chunk-050/episode_050214.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050214.mp4" + }, + { + "episode_id": 7352, + "source_index": 7352, + "raw_length": 27, + "instruction": "Place the yellow brush on top of the yellow towel", + "canonical_instruction": "place the yellow brush on top of the yellow towel", + "parquet": "data/chunk-007/episode_007352.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007352.mp4" + }, + { + "episode_id": 23247, + "source_index": 23247, + "raw_length": 34, + "instruction": "move the blue fork to the bottom left burner", + "canonical_instruction": "move the blue fork to the bottom left burner", + "parquet": "data/chunk-023/episode_023247.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023247.mp4" + }, + { + "episode_id": 16527, + "source_index": 16527, + "raw_length": 26, + "instruction": "Put the blue cloth to the left side of the pot", + "canonical_instruction": "put the blue cloth to the left side of the pot", + "parquet": "data/chunk-016/episode_016527.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016527.mp4" + }, + { + "episode_id": 28195, + "source_index": 28195, + "raw_length": 41, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-028/episode_028195.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028195.mp4" + }, + { + "episode_id": 8027, + "source_index": 8027, + "raw_length": 32, + "instruction": "move cloth to the right", + "canonical_instruction": "move cloth to the right", + "parquet": "data/chunk-008/episode_008027.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008027.mp4" + }, + { + "episode_id": 9865, + "source_index": 9865, + "raw_length": 24, + "instruction": "take the object on top of the drawer then put it in the middle left of the table", + "canonical_instruction": "take the object on top of the drawer then put it in the middle left of the table", + "parquet": "data/chunk-009/episode_009865.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009865.mp4" + }, + { + "episode_id": 40639, + "source_index": 40639, + "raw_length": 56, + "instruction": "put the pot in the top right burner", + "canonical_instruction": "put the pot in the top right burner", + "parquet": "data/chunk-040/episode_040639.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040639.mp4" + }, + { + "episode_id": 3578, + "source_index": 3578, + "raw_length": 76, + "instruction": "put crackerbox on plate and spatula in pot or pan on stove", + "canonical_instruction": "put crackerbox on plate and spatula in pot or pan on stove", + "parquet": "data/chunk-003/episode_003578.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003578.mp4" + }, + { + "episode_id": 12355, + "source_index": 12355, + "raw_length": 27, + "instruction": "pick up blue pen and put into drawer", + "canonical_instruction": "pick up blue pen and put into drawer", + "parquet": "data/chunk-012/episode_012355.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012355.mp4" + }, + { + "episode_id": 28610, + "source_index": 28610, + "raw_length": 33, + "instruction": "Move the red spoon to the left side of the burner.", + "canonical_instruction": "move the red spoon to the left side of the burner", + "parquet": "data/chunk-028/episode_028610.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028610.mp4" + }, + { + "episode_id": 23860, + "source_index": 23860, + "raw_length": 42, + "instruction": "Move the spoon to the left of the yellow cloth.", + "canonical_instruction": "move the spoon to the left of the yellow cloth", + "parquet": "data/chunk-023/episode_023860.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023860.mp4" + }, + { + "episode_id": 8964, + "source_index": 8964, + "raw_length": 36, + "instruction": "Place the pot on top of towel.", + "canonical_instruction": "place the pot on top of towel", + "parquet": "data/chunk-008/episode_008964.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008964.mp4" + }, + { + "episode_id": 12056, + "source_index": 12056, + "raw_length": 38, + "instruction": "move the silver basket to the right burner", + "canonical_instruction": "move the silver basket to the right burner", + "parquet": "data/chunk-012/episode_012056.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012056.mp4" + }, + { + "episode_id": 38228, + "source_index": 38228, + "raw_length": 46, + "instruction": "put the yellow bell pepper on top of the drawer", + "canonical_instruction": "put the yellow bell pepper on top of the drawer", + "parquet": "data/chunk-038/episode_038228.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038228.mp4" + }, + { + "episode_id": 21781, + "source_index": 21781, + "raw_length": 24, + "instruction": "pick up scissors and put into drawer", + "canonical_instruction": "pick up scissors and put into drawer", + "parquet": "data/chunk-021/episode_021781.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021781.mp4" + }, + { + "episode_id": 47428, + "source_index": 47428, + "raw_length": 26, + "instruction": "put corn into bowl", + "canonical_instruction": "put corn into bowl", + "parquet": "data/chunk-047/episode_047428.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047428.mp4" + }, + { + "episode_id": 4972, + "source_index": 4972, + "raw_length": 42, + "instruction": "fold the cloth from top left to bottom right with blue figure inside", + "canonical_instruction": "fold the cloth from top left to bottom right with blue figure inside", + "parquet": "data/chunk-004/episode_004972.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004972.mp4" + }, + { + "episode_id": 49722, + "source_index": 49722, + "raw_length": 88, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-049/episode_049722.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049722.mp4" + }, + { + "episode_id": 49624, + "source_index": 49624, + "raw_length": 24, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-049/episode_049624.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049624.mp4" + }, + { + "episode_id": 30802, + "source_index": 30802, + "raw_length": 19, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-030/episode_030802.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030802.mp4" + }, + { + "episode_id": 12740, + "source_index": 12740, + "raw_length": 24, + "instruction": "put the orange and white object in the bottom middle of the table", + "canonical_instruction": "put the orange and white object in the bottom middle of the table", + "parquet": "data/chunk-012/episode_012740.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012740.mp4" + }, + { + "episode_id": 10603, + "source_index": 10603, + "raw_length": 25, + "instruction": "fold the blue cloth from left to right", + "canonical_instruction": "fold the blue cloth from left to right", + "parquet": "data/chunk-010/episode_010603.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010603.mp4" + }, + { + "episode_id": 46228, + "source_index": 46228, + "raw_length": 46, + "instruction": "put the brown rectangular block with a red paint on top of the tower", + "canonical_instruction": "put the brown rectangular block with a red paint on top of the tower", + "parquet": "data/chunk-046/episode_046228.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046228.mp4" + }, + { + "episode_id": 34281, + "source_index": 34281, + "raw_length": 21, + "instruction": "put carrot on cutting board", + "canonical_instruction": "put carrot on cutting board", + "parquet": "data/chunk-034/episode_034281.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034281.mp4" + }, + { + "episode_id": 2658, + "source_index": 2658, + "raw_length": 36, + "instruction": "upright basil bottle cardboard fence", + "canonical_instruction": "upright basil bottle cardboard fence", + "parquet": "data/chunk-002/episode_002658.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002658.mp4" + }, + { + "episode_id": 45923, + "source_index": 45923, + "raw_length": 22, + "instruction": "put the pink fish to the top of the drawer", + "canonical_instruction": "put the pink fish to the top of the drawer", + "parquet": "data/chunk-045/episode_045923.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045923.mp4" + }, + { + "episode_id": 7482, + "source_index": 7482, + "raw_length": 62, + "instruction": "put pan on stove and put stuffedpig in pan", + "canonical_instruction": "put pan on stove and put stuffedpig in pan", + "parquet": "data/chunk-007/episode_007482.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007482.mp4" + }, + { + "episode_id": 48779, + "source_index": 48779, + "raw_length": 49, + "instruction": "move the can align to the another can", + "canonical_instruction": "move the can align to the another can", + "parquet": "data/chunk-048/episode_048779.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048779.mp4" + }, + { + "episode_id": 9461, + "source_index": 9461, + "raw_length": 34, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-009/episode_009461.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009461.mp4" + }, + { + "episode_id": 47669, + "source_index": 47669, + "raw_length": 36, + "instruction": "take carrot out of pot cardboard fence", + "canonical_instruction": "take carrot out of pot cardboard fence", + "parquet": "data/chunk-047/episode_047669.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047669.mp4" + }, + { + "episode_id": 51142, + "source_index": 51142, + "raw_length": 26, + "instruction": "unfold the cloth from the right to the left", + "canonical_instruction": "unfold the cloth from the right to the left", + "parquet": "data/chunk-051/episode_051142.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051142.mp4" + }, + { + "episode_id": 53043, + "source_index": 53043, + "raw_length": 41, + "instruction": "move the silver pot to the left side of the burner", + "canonical_instruction": "move the silver pot to the left side of the burner", + "parquet": "data/chunk-053/episode_053043.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053043.mp4" + }, + { + "episode_id": 50513, + "source_index": 50513, + "raw_length": 22, + "instruction": "rotate the folded cloth counter clockwise", + "canonical_instruction": "rotate the folded cloth counter clockwise", + "parquet": "data/chunk-050/episode_050513.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050513.mp4" + }, + { + "episode_id": 22663, + "source_index": 22663, + "raw_length": 31, + "instruction": "Place the spatula just behind the egg plant", + "canonical_instruction": "place the spatula just behind the egg plant", + "parquet": "data/chunk-022/episode_022663.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022663.mp4" + }, + { + "episode_id": 46761, + "source_index": 46761, + "raw_length": 26, + "instruction": "move the gray object to the bottom of the table", + "canonical_instruction": "move the gray object to the bottom of the table", + "parquet": "data/chunk-046/episode_046761.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046761.mp4" + }, + { + "episode_id": 31177, + "source_index": 31177, + "raw_length": 33, + "instruction": "move stainless pot between the two burners on the left", + "canonical_instruction": "move stainless pot between the two burners on the left", + "parquet": "data/chunk-031/episode_031177.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031177.mp4" + }, + { + "episode_id": 12308, + "source_index": 12308, + "raw_length": 46, + "instruction": "Move the pot to the front right corner of the table", + "canonical_instruction": "move the pot to the front right corner of the table", + "parquet": "data/chunk-012/episode_012308.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012308.mp4" + }, + { + "episode_id": 6400, + "source_index": 6400, + "raw_length": 25, + "instruction": "take spatula off plate sink", + "canonical_instruction": "take spatula off plate sink", + "parquet": "data/chunk-006/episode_006400.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006400.mp4" + }, + { + "episode_id": 2922, + "source_index": 2922, + "raw_length": 38, + "instruction": "Move the blue cloth behind the pot with the chicken leg piece", + "canonical_instruction": "move the blue cloth behind the pot with the chicken leg piece", + "parquet": "data/chunk-002/episode_002922.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002922.mp4" + }, + { + "episode_id": 36599, + "source_index": 36599, + "raw_length": 42, + "instruction": "MOVE THE YELLOW KNIFE FROM INBETWEEN THE LEFT BURNER AND THE CAN AND PUT IT TO BOTTOM OF LEFT BURNER", + "canonical_instruction": "move the yellow knife from inbetween the left burner and the can and put it to bottom of left burner", + "parquet": "data/chunk-036/episode_036599.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036599.mp4" + }, + { + "episode_id": 3051, + "source_index": 3051, + "raw_length": 46, + "instruction": "Place the silver bowl left of the orange cloth.", + "canonical_instruction": "place the silver bowl left of the orange cloth", + "parquet": "data/chunk-003/episode_003051.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003051.mp4" + }, + { + "episode_id": 1014, + "source_index": 1014, + "raw_length": 43, + "instruction": "Move the pot towards the top of the counter.", + "canonical_instruction": "move the pot towards the top of the counter", + "parquet": "data/chunk-001/episode_001014.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001014.mp4" + }, + { + "episode_id": 5313, + "source_index": 5313, + "raw_length": 28, + "instruction": "put something on the top of yellow cloth", + "canonical_instruction": "put something on the top of yellow cloth", + "parquet": "data/chunk-005/episode_005313.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005313.mp4" + }, + { + "episode_id": 38889, + "source_index": 38889, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-038/episode_038889.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038889.mp4" + }, + { + "episode_id": 5666, + "source_index": 5666, + "raw_length": 29, + "instruction": "move the bear and put it inside the drawer", + "canonical_instruction": "move the bear and put it inside the drawer", + "parquet": "data/chunk-005/episode_005666.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005666.mp4" + }, + { + "episode_id": 40611, + "source_index": 40611, + "raw_length": 33, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-040/episode_040611.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040611.mp4" + }, + { + "episode_id": 27614, + "source_index": 27614, + "raw_length": 21, + "instruction": "put knife in pot or pan", + "canonical_instruction": "put knife in pot or pan", + "parquet": "data/chunk-027/episode_027614.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027614.mp4" + }, + { + "episode_id": 15786, + "source_index": 15786, + "raw_length": 30, + "instruction": "move the cloth to the right side of the stove", + "canonical_instruction": "move the cloth to the right side of the stove", + "parquet": "data/chunk-015/episode_015786.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015786.mp4" + }, + { + "episode_id": 7390, + "source_index": 7390, + "raw_length": 19, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-007/episode_007390.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007390.mp4" + }, + { + "episode_id": 46000, + "source_index": 46000, + "raw_length": 30, + "instruction": "move the plastic green pepper to the bottom right corner of the stove", + "canonical_instruction": "move the plastic green pepper to the bottom right corner of the stove", + "parquet": "data/chunk-046/episode_046000.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046000.mp4" + }, + { + "episode_id": 28134, + "source_index": 28134, + "raw_length": 40, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-028/episode_028134.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028134.mp4" + }, + { + "episode_id": 21719, + "source_index": 21719, + "raw_length": 90, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-021/episode_021719.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021719.mp4" + }, + { + "episode_id": 3940, + "source_index": 3940, + "raw_length": 36, + "instruction": "take lid off pot", + "canonical_instruction": "take lid off pot", + "parquet": "data/chunk-003/episode_003940.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003940.mp4" + }, + { + "episode_id": 18741, + "source_index": 18741, + "raw_length": 35, + "instruction": "Move the silver pot to the center of the table.", + "canonical_instruction": "move the silver pot to the center of the table", + "parquet": "data/chunk-018/episode_018741.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018741.mp4" + }, + { + "episode_id": 42059, + "source_index": 42059, + "raw_length": 43, + "instruction": "move the yellow cloth near the blue fork", + "canonical_instruction": "move the yellow cloth near the blue fork", + "parquet": "data/chunk-042/episode_042059.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042059.mp4" + }, + { + "episode_id": 4544, + "source_index": 4544, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-004/episode_004544.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004544.mp4" + }, + { + "episode_id": 25788, + "source_index": 25788, + "raw_length": 17, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-025/episode_025788.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025788.mp4" + }, + { + "episode_id": 3437, + "source_index": 3437, + "raw_length": 34, + "instruction": "fold the cloth from the left to right", + "canonical_instruction": "fold the cloth from the left to right", + "parquet": "data/chunk-003/episode_003437.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003437.mp4" + }, + { + "episode_id": 1169, + "source_index": 1169, + "raw_length": 38, + "instruction": "move the chicken leg to the upper side of the table", + "canonical_instruction": "move the chicken leg to the upper side of the table", + "parquet": "data/chunk-001/episode_001169.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001169.mp4" + }, + { + "episode_id": 52536, + "source_index": 52536, + "raw_length": 40, + "instruction": "Pick up the red spoon and place it to the right of the pot", + "canonical_instruction": "pick up the red spoon and place it to the right of the pot", + "parquet": "data/chunk-052/episode_052536.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052536.mp4" + }, + { + "episode_id": 20662, + "source_index": 20662, + "raw_length": 39, + "instruction": "moved the thing outside of the drawer", + "canonical_instruction": "moved the thing outside of the drawer", + "parquet": "data/chunk-020/episode_020662.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020662.mp4" + }, + { + "episode_id": 2600, + "source_index": 2600, + "raw_length": 39, + "instruction": "Stack the cube on top of the other", + "canonical_instruction": "stack the cube on top of the other", + "parquet": "data/chunk-002/episode_002600.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002600.mp4" + }, + { + "episode_id": 5369, + "source_index": 5369, + "raw_length": 33, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-005/episode_005369.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005369.mp4" + }, + { + "episode_id": 34733, + "source_index": 34733, + "raw_length": 26, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-034/episode_034733.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034733.mp4" + }, + { + "episode_id": 2923, + "source_index": 2923, + "raw_length": 37, + "instruction": "move the orange jar to the middle of the table", + "canonical_instruction": "move the orange jar to the middle of the table", + "parquet": "data/chunk-002/episode_002923.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002923.mp4" + }, + { + "episode_id": 22857, + "source_index": 22857, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-022/episode_022857.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022857.mp4" + }, + { + "episode_id": 31408, + "source_index": 31408, + "raw_length": 35, + "instruction": "take the cloth out the machine and put it in the basket", + "canonical_instruction": "take the cloth out the machine and put it in the basket", + "parquet": "data/chunk-031/episode_031408.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031408.mp4" + }, + { + "episode_id": 21174, + "source_index": 21174, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-021/episode_021174.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021174.mp4" + }, + { + "episode_id": 36817, + "source_index": 36817, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-036/episode_036817.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036817.mp4" + }, + { + "episode_id": 6335, + "source_index": 6335, + "raw_length": 23, + "instruction": "move the blue fork to the left upper side of the burner", + "canonical_instruction": "move the blue fork to the left upper side of the burner", + "parquet": "data/chunk-006/episode_006335.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006335.mp4" + }, + { + "episode_id": 10816, + "source_index": 10816, + "raw_length": 18, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-010/episode_010816.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010816.mp4" + }, + { + "episode_id": 32538, + "source_index": 32538, + "raw_length": 29, + "instruction": "Pick up the white item and move it to the right of the pan", + "canonical_instruction": "pick up the white item and move it to the right of the pan", + "parquet": "data/chunk-032/episode_032538.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032538.mp4" + }, + { + "episode_id": 40055, + "source_index": 40055, + "raw_length": 32, + "instruction": "move the stuffed toy in front of the microwave", + "canonical_instruction": "move the stuffed toy in front of the microwave", + "parquet": "data/chunk-040/episode_040055.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040055.mp4" + }, + { + "episode_id": 27415, + "source_index": 27415, + "raw_length": 33, + "instruction": "put the violet cloth on the floor", + "canonical_instruction": "put the violet cloth on the floor", + "parquet": "data/chunk-027/episode_027415.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027415.mp4" + }, + { + "episode_id": 6072, + "source_index": 6072, + "raw_length": 22, + "instruction": "put pear on plate", + "canonical_instruction": "put pear on plate", + "parquet": "data/chunk-006/episode_006072.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006072.mp4" + }, + { + "episode_id": 44563, + "source_index": 44563, + "raw_length": 27, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-044/episode_044563.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044563.mp4" + }, + { + "episode_id": 43439, + "source_index": 43439, + "raw_length": 32, + "instruction": "move blue cloth from bottom to top of the table", + "canonical_instruction": "move blue cloth from bottom to top of the table", + "parquet": "data/chunk-043/episode_043439.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043439.mp4" + }, + { + "episode_id": 11226, + "source_index": 11226, + "raw_length": 26, + "instruction": "arranged the cloth from the center to bottom left", + "canonical_instruction": "arranged the cloth from the center to bottom left", + "parquet": "data/chunk-011/episode_011226.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011226.mp4" + }, + { + "episode_id": 28952, + "source_index": 28952, + "raw_length": 36, + "instruction": "Place the carrot inside the silver bowl", + "canonical_instruction": "place the carrot inside the silver bowl", + "parquet": "data/chunk-028/episode_028952.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028952.mp4" + }, + { + "episode_id": 17279, + "source_index": 17279, + "raw_length": 76, + "instruction": "put cereal on plate and sweetpotato in pot or pan in sink", + "canonical_instruction": "put cereal on plate and sweetpotato in pot or pan in sink", + "parquet": "data/chunk-017/episode_017279.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017279.mp4" + }, + { + "episode_id": 32806, + "source_index": 32806, + "raw_length": 25, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-032/episode_032806.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032806.mp4" + }, + { + "episode_id": 28806, + "source_index": 28806, + "raw_length": 29, + "instruction": "move the gray monkey toy to the left bottom corner of the table", + "canonical_instruction": "move the gray monkey toy to the left bottom corner of the table", + "parquet": "data/chunk-028/episode_028806.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028806.mp4" + }, + { + "episode_id": 47802, + "source_index": 47802, + "raw_length": 21, + "instruction": "put pot on stove which is near stove", + "canonical_instruction": "put pot on stove which is near stove", + "parquet": "data/chunk-047/episode_047802.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047802.mp4" + }, + { + "episode_id": 22500, + "source_index": 22500, + "raw_length": 43, + "instruction": "Unfolding the clothes from top left to bottom right", + "canonical_instruction": "unfolding the clothes from top left to bottom right", + "parquet": "data/chunk-022/episode_022500.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022500.mp4" + }, + { + "episode_id": 23801, + "source_index": 23801, + "raw_length": 36, + "instruction": "right pepper shaker", + "canonical_instruction": "right pepper shaker", + "parquet": "data/chunk-023/episode_023801.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023801.mp4" + }, + { + "episode_id": 8492, + "source_index": 8492, + "raw_length": 35, + "instruction": "put cucumber in cup", + "canonical_instruction": "put cucumber in cup", + "parquet": "data/chunk-008/episode_008492.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008492.mp4" + }, + { + "episode_id": 37171, + "source_index": 37171, + "raw_length": 33, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-037/episode_037171.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037171.mp4" + }, + { + "episode_id": 45759, + "source_index": 45759, + "raw_length": 32, + "instruction": "Put orange and green object in silver pan", + "canonical_instruction": "put orange and green object in silver pan", + "parquet": "data/chunk-045/episode_045759.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045759.mp4" + }, + { + "episode_id": 26214, + "source_index": 26214, + "raw_length": 28, + "instruction": "moved object out of drawer and to the upper right", + "canonical_instruction": "moved object out of drawer and to the upper right", + "parquet": "data/chunk-026/episode_026214.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026214.mp4" + }, + { + "episode_id": 32731, + "source_index": 32731, + "raw_length": 38, + "instruction": "move the blue plastic cup to the right side of the dish towel", + "canonical_instruction": "move the blue plastic cup to the right side of the dish towel", + "parquet": "data/chunk-032/episode_032731.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032731.mp4" + }, + { + "episode_id": 24878, + "source_index": 24878, + "raw_length": 46, + "instruction": "unfold the cloth from the left to the right", + "canonical_instruction": "unfold the cloth from the left to the right", + "parquet": "data/chunk-024/episode_024878.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024878.mp4" + }, + { + "episode_id": 25205, + "source_index": 25205, + "raw_length": 27, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-025/episode_025205.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025205.mp4" + }, + { + "episode_id": 21773, + "source_index": 21773, + "raw_length": 46, + "instruction": "Slide the yellow rag back so that it touches the wall.", + "canonical_instruction": "slide the yellow rag back so that it touches the wall", + "parquet": "data/chunk-021/episode_021773.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021773.mp4" + }, + { + "episode_id": 30710, + "source_index": 30710, + "raw_length": 37, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-030/episode_030710.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030710.mp4" + }, + { + "episode_id": 42893, + "source_index": 42893, + "raw_length": 34, + "instruction": "Place the mushroom into the metal pot.", + "canonical_instruction": "place the mushroom into the metal pot", + "parquet": "data/chunk-042/episode_042893.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042893.mp4" + }, + { + "episode_id": 42538, + "source_index": 42538, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-042/episode_042538.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042538.mp4" + }, + { + "episode_id": 30152, + "source_index": 30152, + "raw_length": 47, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-030/episode_030152.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030152.mp4" + }, + { + "episode_id": 28667, + "source_index": 28667, + "raw_length": 46, + "instruction": "Place the red spoon on the left of the yellow cloth", + "canonical_instruction": "place the red spoon on the left of the yellow cloth", + "parquet": "data/chunk-028/episode_028667.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028667.mp4" + }, + { + "episode_id": 52112, + "source_index": 52112, + "raw_length": 33, + "instruction": "Move the spoon to the lower left side of the table", + "canonical_instruction": "move the spoon to the lower left side of the table", + "parquet": "data/chunk-052/episode_052112.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052112.mp4" + }, + { + "episode_id": 25674, + "source_index": 25674, + "raw_length": 28, + "instruction": "move the purple cloth in the middle of the burner", + "canonical_instruction": "move the purple cloth in the middle of the burner", + "parquet": "data/chunk-025/episode_025674.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025674.mp4" + }, + { + "episode_id": 47251, + "source_index": 47251, + "raw_length": 31, + "instruction": "take cucumber out of cup", + "canonical_instruction": "take cucumber out of cup", + "parquet": "data/chunk-047/episode_047251.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047251.mp4" + }, + { + "episode_id": 17957, + "source_index": 17957, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-017/episode_017957.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017957.mp4" + }, + { + "episode_id": 43523, + "source_index": 43523, + "raw_length": 37, + "instruction": "Pick up the bread and place it on the green cloth", + "canonical_instruction": "pick up the bread and place it on the green cloth", + "parquet": "data/chunk-043/episode_043523.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043523.mp4" + }, + { + "episode_id": 24263, + "source_index": 24263, + "raw_length": 44, + "instruction": "moved a fork to the upper right side of the table", + "canonical_instruction": "moved a fork to the upper right side of the table", + "parquet": "data/chunk-024/episode_024263.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024263.mp4" + }, + { + "episode_id": 7616, + "source_index": 7616, + "raw_length": 18, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-007/episode_007616.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007616.mp4" + }, + { + "episode_id": 48914, + "source_index": 48914, + "raw_length": 17, + "instruction": "put spoon into pan", + "canonical_instruction": "put spoon into pan", + "parquet": "data/chunk-048/episode_048914.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048914.mp4" + }, + { + "episode_id": 31660, + "source_index": 31660, + "raw_length": 37, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-031/episode_031660.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031660.mp4" + }, + { + "episode_id": 48170, + "source_index": 48170, + "raw_length": 39, + "instruction": "move the blue fork to the bottom left burner", + "canonical_instruction": "move the blue fork to the bottom left burner", + "parquet": "data/chunk-048/episode_048170.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048170.mp4" + }, + { + "episode_id": 19987, + "source_index": 19987, + "raw_length": 24, + "instruction": "Move the towel behind the spoon", + "canonical_instruction": "move the towel behind the spoon", + "parquet": "data/chunk-019/episode_019987.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019987.mp4" + }, + { + "episode_id": 37085, + "source_index": 37085, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-037/episode_037085.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037085.mp4" + }, + { + "episode_id": 46884, + "source_index": 46884, + "raw_length": 27, + "instruction": "opened the lid of the silver pot and put it on top of the blue cloth", + "canonical_instruction": "opened the lid of the silver pot and put it on top of the blue cloth", + "parquet": "data/chunk-046/episode_046884.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046884.mp4" + }, + { + "episode_id": 35418, + "source_index": 35418, + "raw_length": 35, + "instruction": "take carrot out of pot cardboard fence", + "canonical_instruction": "take carrot out of pot cardboard fence", + "parquet": "data/chunk-035/episode_035418.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035418.mp4" + }, + { + "episode_id": 51694, + "source_index": 51694, + "raw_length": 42, + "instruction": "move the cloth to the right at the top of the pot", + "canonical_instruction": "move the cloth to the right at the top of the pot", + "parquet": "data/chunk-051/episode_051694.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051694.mp4" + }, + { + "episode_id": 4628, + "source_index": 4628, + "raw_length": 30, + "instruction": "picked the yellow thing and placed it on the left side of the table", + "canonical_instruction": "picked the yellow thing and placed it on the left side of the table", + "parquet": "data/chunk-004/episode_004628.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004628.mp4" + }, + { + "episode_id": 25483, + "source_index": 25483, + "raw_length": 41, + "instruction": "Folding The Cloth From Top Left To Bottom Right", + "canonical_instruction": "folding the cloth from top left to bottom right", + "parquet": "data/chunk-025/episode_025483.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025483.mp4" + }, + { + "episode_id": 12609, + "source_index": 12609, + "raw_length": 46, + "instruction": "put the blue cube on top of the green cube", + "canonical_instruction": "put the blue cube on top of the green cube", + "parquet": "data/chunk-012/episode_012609.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012609.mp4" + }, + { + "episode_id": 34327, + "source_index": 34327, + "raw_length": 46, + "instruction": "moves the cloth to the top edge of the table", + "canonical_instruction": "moves the cloth to the top edge of the table", + "parquet": "data/chunk-034/episode_034327.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034327.mp4" + }, + { + "episode_id": 10766, + "source_index": 10766, + "raw_length": 46, + "instruction": "remove the green cube on top of the yellow cuboid and put it on top of the blue cube", + "canonical_instruction": "remove the green cube on top of the yellow cuboid and put it on top of the blue cube", + "parquet": "data/chunk-010/episode_010766.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010766.mp4" + }, + { + "episode_id": 20665, + "source_index": 20665, + "raw_length": 26, + "instruction": "put fork from basket to tray", + "canonical_instruction": "put fork from basket to tray", + "parquet": "data/chunk-020/episode_020665.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020665.mp4" + }, + { + "episode_id": 25279, + "source_index": 25279, + "raw_length": 44, + "instruction": "Place the object onto the table.", + "canonical_instruction": "place the object onto the table", + "parquet": "data/chunk-025/episode_025279.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025279.mp4" + }, + { + "episode_id": 47731, + "source_index": 47731, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-047/episode_047731.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047731.mp4" + }, + { + "episode_id": 35929, + "source_index": 35929, + "raw_length": 36, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-035/episode_035929.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035929.mp4" + }, + { + "episode_id": 42788, + "source_index": 42788, + "raw_length": 44, + "instruction": "toma el conejo de peluche y pon en la cubeta roja", + "canonical_instruction": "toma el conejo de peluche y pon en la cubeta roja", + "parquet": "data/chunk-042/episode_042788.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042788.mp4" + }, + { + "episode_id": 52701, + "source_index": 52701, + "raw_length": 37, + "instruction": "put the green cloth to the top of the stove", + "canonical_instruction": "put the green cloth to the top of the stove", + "parquet": "data/chunk-052/episode_052701.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052701.mp4" + }, + { + "episode_id": 46923, + "source_index": 46923, + "raw_length": 34, + "instruction": "move the pan to the bottom right side of the burner", + "canonical_instruction": "move the pan to the bottom right side of the burner", + "parquet": "data/chunk-046/episode_046923.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046923.mp4" + }, + { + "episode_id": 12085, + "source_index": 12085, + "raw_length": 40, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-012/episode_012085.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012085.mp4" + }, + { + "episode_id": 46027, + "source_index": 46027, + "raw_length": 26, + "instruction": "put broccoli in pot or pan", + "canonical_instruction": "put broccoli in pot or pan", + "parquet": "data/chunk-046/episode_046027.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046027.mp4" + }, + { + "episode_id": 23315, + "source_index": 23315, + "raw_length": 21, + "instruction": "put eggplant on plate", + "canonical_instruction": "put eggplant on plate", + "parquet": "data/chunk-023/episode_023315.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023315.mp4" + }, + { + "episode_id": 27173, + "source_index": 27173, + "raw_length": 35, + "instruction": "close cabinet", + "canonical_instruction": "close cabinet", + "parquet": "data/chunk-027/episode_027173.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027173.mp4" + }, + { + "episode_id": 17189, + "source_index": 17189, + "raw_length": 26, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-017/episode_017189.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017189.mp4" + }, + { + "episode_id": 34314, + "source_index": 34314, + "raw_length": 36, + "instruction": "unfold cloth from right to left", + "canonical_instruction": "unfold cloth from right to left", + "parquet": "data/chunk-034/episode_034314.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034314.mp4" + }, + { + "episode_id": 44844, + "source_index": 44844, + "raw_length": 21, + "instruction": "put cap on container", + "canonical_instruction": "put cap on container", + "parquet": "data/chunk-044/episode_044844.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044844.mp4" + }, + { + "episode_id": 46672, + "source_index": 46672, + "raw_length": 30, + "instruction": "Pick up the blue spoon and place it next to the yellow cloth.", + "canonical_instruction": "pick up the blue spoon and place it next to the yellow cloth", + "parquet": "data/chunk-046/episode_046672.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046672.mp4" + }, + { + "episode_id": 46949, + "source_index": 46949, + "raw_length": 37, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-046/episode_046949.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046949.mp4" + }, + { + "episode_id": 12885, + "source_index": 12885, + "raw_length": 25, + "instruction": "remove the lid of the silver pot and put it to the right side of the pot", + "canonical_instruction": "remove the lid of the silver pot and put it to the right side of the pot", + "parquet": "data/chunk-012/episode_012885.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012885.mp4" + }, + { + "episode_id": 36734, + "source_index": 36734, + "raw_length": 46, + "instruction": "put the blue triangle on top of the green cube", + "canonical_instruction": "put the blue triangle on top of the green cube", + "parquet": "data/chunk-036/episode_036734.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036734.mp4" + }, + { + "episode_id": 24894, + "source_index": 24894, + "raw_length": 34, + "instruction": "take the orange object and put it in the pot", + "canonical_instruction": "take the orange object and put it in the pot", + "parquet": "data/chunk-024/episode_024894.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024894.mp4" + }, + { + "episode_id": 46808, + "source_index": 46808, + "raw_length": 18, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-046/episode_046808.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046808.mp4" + }, + { + "episode_id": 45703, + "source_index": 45703, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-045/episode_045703.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045703.mp4" + }, + { + "episode_id": 20145, + "source_index": 20145, + "raw_length": 31, + "instruction": "put the red figure on the bottom left edge of the cloth", + "canonical_instruction": "put the red figure on the bottom left edge of the cloth", + "parquet": "data/chunk-020/episode_020145.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020145.mp4" + }, + { + "episode_id": 51393, + "source_index": 51393, + "raw_length": 29, + "instruction": "Move the spoon and place it towards bottom of pot.", + "canonical_instruction": "move the spoon and place it towards bottom of pot", + "parquet": "data/chunk-051/episode_051393.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051393.mp4" + }, + { + "episode_id": 52023, + "source_index": 52023, + "raw_length": 46, + "instruction": "Put the silver pan in the opposite corner of the table.", + "canonical_instruction": "put the silver pan in the opposite corner of the table", + "parquet": "data/chunk-052/episode_052023.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052023.mp4" + }, + { + "episode_id": 38132, + "source_index": 38132, + "raw_length": 31, + "instruction": "take bowl off plate", + "canonical_instruction": "take bowl off plate", + "parquet": "data/chunk-038/episode_038132.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038132.mp4" + }, + { + "episode_id": 41150, + "source_index": 41150, + "raw_length": 25, + "instruction": "Move the blue cloth to the back right corner of the stove", + "canonical_instruction": "move the blue cloth to the back right corner of the stove", + "parquet": "data/chunk-041/episode_041150.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041150.mp4" + }, + { + "episode_id": 39900, + "source_index": 39900, + "raw_length": 41, + "instruction": "Place the pot on top of the orange towel", + "canonical_instruction": "place the pot on top of the orange towel", + "parquet": "data/chunk-039/episode_039900.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039900.mp4" + }, + { + "episode_id": 31901, + "source_index": 31901, + "raw_length": 46, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-031/episode_031901.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031901.mp4" + }, + { + "episode_id": 47290, + "source_index": 47290, + "raw_length": 46, + "instruction": "Place the blue cloth in front of the metal pot.", + "canonical_instruction": "place the blue cloth in front of the metal pot", + "parquet": "data/chunk-047/episode_047290.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047290.mp4" + }, + { + "episode_id": 4019, + "source_index": 4019, + "raw_length": 46, + "instruction": "put the blue cube on top of the plus", + "canonical_instruction": "put the blue cube on top of the plus", + "parquet": "data/chunk-004/episode_004019.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004019.mp4" + }, + { + "episode_id": 42656, + "source_index": 42656, + "raw_length": 34, + "instruction": "Move cone on yellow cloth to top middle of table", + "canonical_instruction": "move cone on yellow cloth to top middle of table", + "parquet": "data/chunk-042/episode_042656.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042656.mp4" + }, + { + "episode_id": 22190, + "source_index": 22190, + "raw_length": 46, + "instruction": "put the white block on top of the arch", + "canonical_instruction": "put the white block on top of the arch", + "parquet": "data/chunk-022/episode_022190.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022190.mp4" + }, + { + "episode_id": 38857, + "source_index": 38857, + "raw_length": 34, + "instruction": "put the purple object into the silver saucepan", + "canonical_instruction": "put the purple object into the silver saucepan", + "parquet": "data/chunk-038/episode_038857.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038857.mp4" + }, + { + "episode_id": 17133, + "source_index": 17133, + "raw_length": 22, + "instruction": "Move the blue towel to the right of the spoon", + "canonical_instruction": "move the blue towel to the right of the spoon", + "parquet": "data/chunk-017/episode_017133.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017133.mp4" + }, + { + "episode_id": 44633, + "source_index": 44633, + "raw_length": 28, + "instruction": "move the silver pot to the lower left of the stove.", + "canonical_instruction": "move the silver pot to the lower left of the stove", + "parquet": "data/chunk-044/episode_044633.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044633.mp4" + }, + { + "episode_id": 4900, + "source_index": 4900, + "raw_length": 33, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-004/episode_004900.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004900.mp4" + }, + { + "episode_id": 30805, + "source_index": 30805, + "raw_length": 38, + "instruction": "Move the vessel with handle and place it on the yellow cloth.", + "canonical_instruction": "move the vessel with handle and place it on the yellow cloth", + "parquet": "data/chunk-030/episode_030805.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030805.mp4" + }, + { + "episode_id": 40431, + "source_index": 40431, + "raw_length": 46, + "instruction": "take the arck off the wiht cylinder", + "canonical_instruction": "take the arck off the wiht cylinder", + "parquet": "data/chunk-040/episode_040431.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040431.mp4" + }, + { + "episode_id": 26132, + "source_index": 26132, + "raw_length": 68, + "instruction": "put pan on stove and put stuffedpig in pan", + "canonical_instruction": "put pan on stove and put stuffedpig in pan", + "parquet": "data/chunk-026/episode_026132.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026132.mp4" + }, + { + "episode_id": 1871, + "source_index": 1871, + "raw_length": 46, + "instruction": "picked yellow rectangular cube and placed on a tower", + "canonical_instruction": "picked yellow rectangular cube and placed on a tower", + "parquet": "data/chunk-001/episode_001871.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001871.mp4" + }, + { + "episode_id": 41037, + "source_index": 41037, + "raw_length": 32, + "instruction": "open a drawer", + "canonical_instruction": "open a drawer", + "parquet": "data/chunk-041/episode_041037.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041037.mp4" + }, + { + "episode_id": 44973, + "source_index": 44973, + "raw_length": 41, + "instruction": "Place the yellow thing over the yellow cloth.", + "canonical_instruction": "place the yellow thing over the yellow cloth", + "parquet": "data/chunk-044/episode_044973.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044973.mp4" + }, + { + "episode_id": 51348, + "source_index": 51348, + "raw_length": 25, + "instruction": "Place the egg inside the pot", + "canonical_instruction": "place the egg inside the pot", + "parquet": "data/chunk-051/episode_051348.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051348.mp4" + }, + { + "episode_id": 6134, + "source_index": 6134, + "raw_length": 36, + "instruction": "move the yellow object to the bottom right burner", + "canonical_instruction": "move the yellow object to the bottom right burner", + "parquet": "data/chunk-006/episode_006134.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006134.mp4" + }, + { + "episode_id": 29070, + "source_index": 29070, + "raw_length": 39, + "instruction": "put the plus on top of the green cube", + "canonical_instruction": "put the plus on top of the green cube", + "parquet": "data/chunk-029/episode_029070.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029070.mp4" + }, + { + "episode_id": 8254, + "source_index": 8254, + "raw_length": 30, + "instruction": "Put the pan on the green cloth", + "canonical_instruction": "put the pan on the green cloth", + "parquet": "data/chunk-008/episode_008254.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008254.mp4" + }, + { + "episode_id": 50761, + "source_index": 50761, + "raw_length": 46, + "instruction": "put the ball on the cup", + "canonical_instruction": "put the ball on the cup", + "parquet": "data/chunk-050/episode_050761.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050761.mp4" + }, + { + "episode_id": 10485, + "source_index": 10485, + "raw_length": 17, + "instruction": "put sweet potato in pan which is on stove", + "canonical_instruction": "put sweet potato in pan which is on stove", + "parquet": "data/chunk-010/episode_010485.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010485.mp4" + }, + { + "episode_id": 23466, + "source_index": 23466, + "raw_length": 44, + "instruction": "move the white basket to the right side of the table", + "canonical_instruction": "move the white basket to the right side of the table", + "parquet": "data/chunk-023/episode_023466.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023466.mp4" + }, + { + "episode_id": 46107, + "source_index": 46107, + "raw_length": 22, + "instruction": "move the purple can to the center of the table", + "canonical_instruction": "move the purple can to the center of the table", + "parquet": "data/chunk-046/episode_046107.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046107.mp4" + }, + { + "episode_id": 51875, + "source_index": 51875, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-051/episode_051875.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051875.mp4" + }, + { + "episode_id": 31690, + "source_index": 31690, + "raw_length": 27, + "instruction": "move the lion toy to the bottom left corner side of the table", + "canonical_instruction": "move the lion toy to the bottom left corner side of the table", + "parquet": "data/chunk-031/episode_031690.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031690.mp4" + }, + { + "episode_id": 34225, + "source_index": 34225, + "raw_length": 30, + "instruction": "move the brown object to the drawer", + "canonical_instruction": "move the brown object to the drawer", + "parquet": "data/chunk-034/episode_034225.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034225.mp4" + }, + { + "episode_id": 30338, + "source_index": 30338, + "raw_length": 30, + "instruction": "put red ball on the vessel", + "canonical_instruction": "put red ball on the vessel", + "parquet": "data/chunk-030/episode_030338.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030338.mp4" + }, + { + "episode_id": 7804, + "source_index": 7804, + "raw_length": 46, + "instruction": "move the cloth from bottom to the top of the table", + "canonical_instruction": "move the cloth from bottom to the top of the table", + "parquet": "data/chunk-007/episode_007804.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007804.mp4" + }, + { + "episode_id": 6742, + "source_index": 6742, + "raw_length": 46, + "instruction": "fold the cloth from left to right", + "canonical_instruction": "fold the cloth from left to right", + "parquet": "data/chunk-006/episode_006742.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006742.mp4" + }, + { + "episode_id": 44527, + "source_index": 44527, + "raw_length": 46, + "instruction": "put the red cube on top of the tower", + "canonical_instruction": "put the red cube on top of the tower", + "parquet": "data/chunk-044/episode_044527.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044527.mp4" + }, + { + "episode_id": 20378, + "source_index": 20378, + "raw_length": 37, + "instruction": "move the silver pot to the left burner", + "canonical_instruction": "move the silver pot to the left burner", + "parquet": "data/chunk-020/episode_020378.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020378.mp4" + }, + { + "episode_id": 1783, + "source_index": 1783, + "raw_length": 22, + "instruction": "Place the mushroom in the pot.", + "canonical_instruction": "place the mushroom in the pot", + "parquet": "data/chunk-001/episode_001783.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001783.mp4" + }, + { + "episode_id": 24159, + "source_index": 24159, + "raw_length": 23, + "instruction": "put banana in colander", + "canonical_instruction": "put banana in colander", + "parquet": "data/chunk-024/episode_024159.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024159.mp4" + }, + { + "episode_id": 37149, + "source_index": 37149, + "raw_length": 33, + "instruction": "move the can to the top left of the stove", + "canonical_instruction": "move the can to the top left of the stove", + "parquet": "data/chunk-037/episode_037149.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037149.mp4" + }, + { + "episode_id": 49705, + "source_index": 49705, + "raw_length": 31, + "instruction": "move the silver pot to the top left side of the burner", + "canonical_instruction": "move the silver pot to the top left side of the burner", + "parquet": "data/chunk-049/episode_049705.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049705.mp4" + }, + { + "episode_id": 28883, + "source_index": 28883, + "raw_length": 35, + "instruction": "take out the pink and white toy from the drawer and put it on the left side of the table", + "canonical_instruction": "take out the pink and white toy from the drawer and put it on the left side of the table", + "parquet": "data/chunk-028/episode_028883.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028883.mp4" + }, + { + "episode_id": 37387, + "source_index": 37387, + "raw_length": 36, + "instruction": "Place the sushi to the left of the orange towel", + "canonical_instruction": "place the sushi to the left of the orange towel", + "parquet": "data/chunk-037/episode_037387.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037387.mp4" + }, + { + "episode_id": 52330, + "source_index": 52330, + "raw_length": 20, + "instruction": "put eggplant into pot or pan", + "canonical_instruction": "put eggplant into pot or pan", + "parquet": "data/chunk-052/episode_052330.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052330.mp4" + }, + { + "episode_id": 20294, + "source_index": 20294, + "raw_length": 40, + "instruction": "move the yellow rectangular block to the left", + "canonical_instruction": "move the yellow rectangular block to the left", + "parquet": "data/chunk-020/episode_020294.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020294.mp4" + }, + { + "episode_id": 19946, + "source_index": 19946, + "raw_length": 23, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-019/episode_019946.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019946.mp4" + }, + { + "episode_id": 8598, + "source_index": 8598, + "raw_length": 29, + "instruction": "Pick up the pot and place it in front of the sushi", + "canonical_instruction": "pick up the pot and place it in front of the sushi", + "parquet": "data/chunk-008/episode_008598.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008598.mp4" + }, + { + "episode_id": 47115, + "source_index": 47115, + "raw_length": 38, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-047/episode_047115.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047115.mp4" + }, + { + "episode_id": 38978, + "source_index": 38978, + "raw_length": 35, + "instruction": "Move the blue spoon to the bottom right of the table.", + "canonical_instruction": "move the blue spoon to the bottom right of the table", + "parquet": "data/chunk-038/episode_038978.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038978.mp4" + }, + { + "episode_id": 51500, + "source_index": 51500, + "raw_length": 26, + "instruction": "put the blue spatula on the green cloth", + "canonical_instruction": "put the blue spatula on the green cloth", + "parquet": "data/chunk-051/episode_051500.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051500.mp4" + }, + { + "episode_id": 22617, + "source_index": 22617, + "raw_length": 41, + "instruction": "remove the ball from the cup and put it behind the blue arch", + "canonical_instruction": "remove the ball from the cup and put it behind the blue arch", + "parquet": "data/chunk-022/episode_022617.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022617.mp4" + }, + { + "episode_id": 31808, + "source_index": 31808, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-031/episode_031808.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031808.mp4" + }, + { + "episode_id": 9196, + "source_index": 9196, + "raw_length": 30, + "instruction": "Place pot on yellow cloth.", + "canonical_instruction": "place pot on yellow cloth", + "parquet": "data/chunk-009/episode_009196.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009196.mp4" + }, + { + "episode_id": 4128, + "source_index": 4128, + "raw_length": 35, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-004/episode_004128.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004128.mp4" + }, + { + "episode_id": 42880, + "source_index": 42880, + "raw_length": 35, + "instruction": "Pick up pot an place directly at the corner in front of microwave", + "canonical_instruction": "pick up pot an place directly at the corner in front of microwave", + "parquet": "data/chunk-042/episode_042880.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042880.mp4" + }, + { + "episode_id": 51870, + "source_index": 51870, + "raw_length": 33, + "instruction": "move the green object from the upper left of the table to the middle left of it", + "canonical_instruction": "move the green object from the upper left of the table to the middle left of it", + "parquet": "data/chunk-051/episode_051870.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051870.mp4" + }, + { + "episode_id": 9451, + "source_index": 9451, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-009/episode_009451.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009451.mp4" + }, + { + "episode_id": 21383, + "source_index": 21383, + "raw_length": 20, + "instruction": "move the pink toy away from the drawer", + "canonical_instruction": "move the pink toy away from the drawer", + "parquet": "data/chunk-021/episode_021383.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021383.mp4" + }, + { + "episode_id": 21769, + "source_index": 21769, + "raw_length": 46, + "instruction": "placed cube on table", + "canonical_instruction": "placed cube on table", + "parquet": "data/chunk-021/episode_021769.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021769.mp4" + }, + { + "episode_id": 51245, + "source_index": 51245, + "raw_length": 23, + "instruction": "Move the blue cloth and place it to the far edge of the stove.", + "canonical_instruction": "move the blue cloth and place it to the far edge of the stove", + "parquet": "data/chunk-051/episode_051245.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051245.mp4" + }, + { + "episode_id": 19519, + "source_index": 19519, + "raw_length": 21, + "instruction": "pick up bowl and put in small4fbox", + "canonical_instruction": "pick up bowl and put in small4fbox", + "parquet": "data/chunk-019/episode_019519.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019519.mp4" + }, + { + "episode_id": 21718, + "source_index": 21718, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-021/episode_021718.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021718.mp4" + }, + { + "episode_id": 43613, + "source_index": 43613, + "raw_length": 35, + "instruction": "Moved the silver pot from the front burner in the left side to the front burner in the right side.", + "canonical_instruction": "moved the silver pot from the front burner in the left side to the front burner in the right side", + "parquet": "data/chunk-043/episode_043613.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043613.mp4" + }, + { + "episode_id": 16662, + "source_index": 16662, + "raw_length": 35, + "instruction": "cover the purple eggplant from right to left", + "canonical_instruction": "cover the purple eggplant from right to left", + "parquet": "data/chunk-016/episode_016662.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016662.mp4" + }, + { + "episode_id": 49621, + "source_index": 49621, + "raw_length": 28, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-049/episode_049621.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049621.mp4" + }, + { + "episode_id": 2681, + "source_index": 2681, + "raw_length": 46, + "instruction": "put the blue cube on top of the green cube", + "canonical_instruction": "put the blue cube on top of the green cube", + "parquet": "data/chunk-002/episode_002681.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002681.mp4" + }, + { + "episode_id": 17047, + "source_index": 17047, + "raw_length": 36, + "instruction": "take lid off pot", + "canonical_instruction": "take lid off pot", + "parquet": "data/chunk-017/episode_017047.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017047.mp4" + }, + { + "episode_id": 28898, + "source_index": 28898, + "raw_length": 46, + "instruction": "close the box", + "canonical_instruction": "close the box", + "parquet": "data/chunk-028/episode_028898.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028898.mp4" + }, + { + "episode_id": 11354, + "source_index": 11354, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-011/episode_011354.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011354.mp4" + }, + { + "episode_id": 48649, + "source_index": 48649, + "raw_length": 33, + "instruction": "Place the knife on the bottom left corner", + "canonical_instruction": "place the knife on the bottom left corner", + "parquet": "data/chunk-048/episode_048649.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048649.mp4" + }, + { + "episode_id": 39128, + "source_index": 39128, + "raw_length": 30, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-039/episode_039128.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039128.mp4" + }, + { + "episode_id": 32413, + "source_index": 32413, + "raw_length": 23, + "instruction": "Move the corn to right of brush in front of microwave.", + "canonical_instruction": "move the corn to right of brush in front of microwave", + "parquet": "data/chunk-032/episode_032413.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032413.mp4" + }, + { + "episode_id": 26397, + "source_index": 26397, + "raw_length": 26, + "instruction": "Move the white object near the left side of the drawer", + "canonical_instruction": "move the white object near the left side of the drawer", + "parquet": "data/chunk-026/episode_026397.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026397.mp4" + }, + { + "episode_id": 3673, + "source_index": 3673, + "raw_length": 32, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-003/episode_003673.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003673.mp4" + }, + { + "episode_id": 5034, + "source_index": 5034, + "raw_length": 25, + "instruction": "picked blue cloth", + "canonical_instruction": "picked blue cloth", + "parquet": "data/chunk-005/episode_005034.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005034.mp4" + }, + { + "episode_id": 37682, + "source_index": 37682, + "raw_length": 23, + "instruction": "Place the green cloth near the brush.", + "canonical_instruction": "place the green cloth near the brush", + "parquet": "data/chunk-037/episode_037682.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037682.mp4" + }, + { + "episode_id": 28942, + "source_index": 28942, + "raw_length": 43, + "instruction": "Move the metal pot to the front left corner of the table.", + "canonical_instruction": "move the metal pot to the front left corner of the table", + "parquet": "data/chunk-028/episode_028942.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028942.mp4" + }, + { + "episode_id": 12967, + "source_index": 12967, + "raw_length": 81, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-012/episode_012967.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012967.mp4" + }, + { + "episode_id": 34563, + "source_index": 34563, + "raw_length": 27, + "instruction": "push the orange napkin to the top left side of the table", + "canonical_instruction": "push the orange napkin to the top left side of the table", + "parquet": "data/chunk-034/episode_034563.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034563.mp4" + }, + { + "episode_id": 23706, + "source_index": 23706, + "raw_length": 26, + "instruction": "put the corn in between the mushroom and the towel", + "canonical_instruction": "put the corn in between the mushroom and the towel", + "parquet": "data/chunk-023/episode_023706.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023706.mp4" + }, + { + "episode_id": 34920, + "source_index": 34920, + "raw_length": 27, + "instruction": "fold fabric bottom to top and right to left", + "canonical_instruction": "fold fabric bottom to top and right to left", + "parquet": "data/chunk-034/episode_034920.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034920.mp4" + }, + { + "episode_id": 18962, + "source_index": 18962, + "raw_length": 31, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-018/episode_018962.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018962.mp4" + }, + { + "episode_id": 5830, + "source_index": 5830, + "raw_length": 35, + "instruction": "put the silver pot on the left burner", + "canonical_instruction": "put the silver pot on the left burner", + "parquet": "data/chunk-005/episode_005830.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005830.mp4" + }, + { + "episode_id": 9376, + "source_index": 9376, + "raw_length": 29, + "instruction": "place the violet cloth in the lower right corner of the burner", + "canonical_instruction": "place the violet cloth in the lower right corner of the burner", + "parquet": "data/chunk-009/episode_009376.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009376.mp4" + }, + { + "episode_id": 9102, + "source_index": 9102, + "raw_length": 40, + "instruction": "move the laundry basket to the left", + "canonical_instruction": "move the laundry basket to the left", + "parquet": "data/chunk-009/episode_009102.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009102.mp4" + }, + { + "episode_id": 25038, + "source_index": 25038, + "raw_length": 45, + "instruction": "Hold the red pear from inside the pan which is in center of the table and place it in left edge of the table.", + "canonical_instruction": "hold the red pear from inside the pan which is in center of the table and place it in left edge of the table", + "parquet": "data/chunk-025/episode_025038.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025038.mp4" + }, + { + "episode_id": 21878, + "source_index": 21878, + "raw_length": 29, + "instruction": "move the yellow cloth to the left burner", + "canonical_instruction": "move the yellow cloth to the left burner", + "parquet": "data/chunk-021/episode_021878.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021878.mp4" + }, + { + "episode_id": 14648, + "source_index": 14648, + "raw_length": 74, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-014/episode_014648.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014648.mp4" + }, + { + "episode_id": 47649, + "source_index": 47649, + "raw_length": 19, + "instruction": "pick up violet Allen key", + "canonical_instruction": "pick up violet allen key", + "parquet": "data/chunk-047/episode_047649.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047649.mp4" + }, + { + "episode_id": 44873, + "source_index": 44873, + "raw_length": 46, + "instruction": "take the red object out of the drawer.", + "canonical_instruction": "take the red object out of the drawer", + "parquet": "data/chunk-044/episode_044873.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044873.mp4" + }, + { + "episode_id": 17895, + "source_index": 17895, + "raw_length": 29, + "instruction": "move the scoop to the top left below the microwave", + "canonical_instruction": "move the scoop to the top left below the microwave", + "parquet": "data/chunk-017/episode_017895.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017895.mp4" + }, + { + "episode_id": 28884, + "source_index": 28884, + "raw_length": 20, + "instruction": "Move the purple towel to the back right corner of the stove", + "canonical_instruction": "move the purple towel to the back right corner of the stove", + "parquet": "data/chunk-028/episode_028884.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028884.mp4" + }, + { + "episode_id": 42195, + "source_index": 42195, + "raw_length": 40, + "instruction": "move the green arch into the top of the blue block", + "canonical_instruction": "move the green arch into the top of the blue block", + "parquet": "data/chunk-042/episode_042195.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042195.mp4" + }, + { + "episode_id": 43705, + "source_index": 43705, + "raw_length": 29, + "instruction": "picks the orange thing and puts it on the blue cloth", + "canonical_instruction": "picks the orange thing and puts it on the blue cloth", + "parquet": "data/chunk-043/episode_043705.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043705.mp4" + }, + { + "episode_id": 52961, + "source_index": 52961, + "raw_length": 27, + "instruction": "move brush to left of blue towel", + "canonical_instruction": "move brush to left of blue towel", + "parquet": "data/chunk-052/episode_052961.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052961.mp4" + }, + { + "episode_id": 19241, + "source_index": 19241, + "raw_length": 27, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-019/episode_019241.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019241.mp4" + }, + { + "episode_id": 49104, + "source_index": 49104, + "raw_length": 38, + "instruction": "move the salt shaker to the bottom right corner of the table", + "canonical_instruction": "move the salt shaker to the bottom right corner of the table", + "parquet": "data/chunk-049/episode_049104.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049104.mp4" + }, + { + "episode_id": 27594, + "source_index": 27594, + "raw_length": 33, + "instruction": "Put the blue cloth inside the white basket.", + "canonical_instruction": "put the blue cloth inside the white basket", + "parquet": "data/chunk-027/episode_027594.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027594.mp4" + }, + { + "episode_id": 2244, + "source_index": 2244, + "raw_length": 30, + "instruction": "Place the spoon on top of the blue cloth", + "canonical_instruction": "place the spoon on top of the blue cloth", + "parquet": "data/chunk-002/episode_002244.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002244.mp4" + }, + { + "episode_id": 34, + "source_index": 34, + "raw_length": 36, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-000/episode_000034.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000034.mp4" + }, + { + "episode_id": 36710, + "source_index": 36710, + "raw_length": 24, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-036/episode_036710.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036710.mp4" + }, + { + "episode_id": 45028, + "source_index": 45028, + "raw_length": 37, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-045/episode_045028.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045028.mp4" + }, + { + "episode_id": 15760, + "source_index": 15760, + "raw_length": 33, + "instruction": "Move the blue spoon to the front right corner.", + "canonical_instruction": "move the blue spoon to the front right corner", + "parquet": "data/chunk-015/episode_015760.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015760.mp4" + }, + { + "episode_id": 51891, + "source_index": 51891, + "raw_length": 33, + "instruction": "Move the pot on top of the blue cloth.", + "canonical_instruction": "move the pot on top of the blue cloth", + "parquet": "data/chunk-051/episode_051891.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051891.mp4" + }, + { + "episode_id": 15507, + "source_index": 15507, + "raw_length": 32, + "instruction": "take a carrots into the pot and put it in the right burners", + "canonical_instruction": "take a carrots into the pot and put it in the right burners", + "parquet": "data/chunk-015/episode_015507.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015507.mp4" + }, + { + "episode_id": 47328, + "source_index": 47328, + "raw_length": 36, + "instruction": "put knife on cutting board cardboard fence", + "canonical_instruction": "put knife on cutting board cardboard fence", + "parquet": "data/chunk-047/episode_047328.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047328.mp4" + }, + { + "episode_id": 43463, + "source_index": 43463, + "raw_length": 66, + "instruction": "put pan on stove and put blueberry in pan", + "canonical_instruction": "put pan on stove and put blueberry in pan", + "parquet": "data/chunk-043/episode_043463.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043463.mp4" + }, + { + "episode_id": 39126, + "source_index": 39126, + "raw_length": 38, + "instruction": "moved the wooden spatula from the top of the yellow basket and put it inside", + "canonical_instruction": "moved the wooden spatula from the top of the yellow basket and put it inside", + "parquet": "data/chunk-039/episode_039126.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039126.mp4" + }, + { + "episode_id": 12876, + "source_index": 12876, + "raw_length": 33, + "instruction": "cover the white figure from the right to left", + "canonical_instruction": "cover the white figure from the right to left", + "parquet": "data/chunk-012/episode_012876.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012876.mp4" + }, + { + "episode_id": 25855, + "source_index": 25855, + "raw_length": 26, + "instruction": "put the carrot in the silver pot", + "canonical_instruction": "put the carrot in the silver pot", + "parquet": "data/chunk-025/episode_025855.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025855.mp4" + }, + { + "episode_id": 25711, + "source_index": 25711, + "raw_length": 40, + "instruction": "Place the beetroot just behind the vessel.", + "canonical_instruction": "place the beetroot just behind the vessel", + "parquet": "data/chunk-025/episode_025711.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025711.mp4" + }, + { + "episode_id": 25730, + "source_index": 25730, + "raw_length": 39, + "instruction": "Pick the towel lying behind vessel and place it on the side of the vessel.", + "canonical_instruction": "pick the towel lying behind vessel and place it on the side of the vessel", + "parquet": "data/chunk-025/episode_025730.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025730.mp4" + }, + { + "episode_id": 9921, + "source_index": 9921, + "raw_length": 39, + "instruction": "put the banana in the drawer", + "canonical_instruction": "put the banana in the drawer", + "parquet": "data/chunk-009/episode_009921.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009921.mp4" + }, + { + "episode_id": 26645, + "source_index": 26645, + "raw_length": 28, + "instruction": "Move spatula on top of the orange cloth.", + "canonical_instruction": "move spatula on top of the orange cloth", + "parquet": "data/chunk-026/episode_026645.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026645.mp4" + }, + { + "episode_id": 31766, + "source_index": 31766, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-031/episode_031766.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031766.mp4" + }, + { + "episode_id": 28327, + "source_index": 28327, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-028/episode_028327.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028327.mp4" + }, + { + "episode_id": 49252, + "source_index": 49252, + "raw_length": 36, + "instruction": "take carrot out of pot cardboard fence", + "canonical_instruction": "take carrot out of pot cardboard fence", + "parquet": "data/chunk-049/episode_049252.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049252.mp4" + }, + { + "episode_id": 25277, + "source_index": 25277, + "raw_length": 18, + "instruction": "put eggplant into pot or pan", + "canonical_instruction": "put eggplant into pot or pan", + "parquet": "data/chunk-025/episode_025277.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025277.mp4" + }, + { + "episode_id": 8889, + "source_index": 8889, + "raw_length": 19, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-008/episode_008889.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008889.mp4" + }, + { + "episode_id": 14325, + "source_index": 14325, + "raw_length": 18, + "instruction": "flip pot upright which is in sink", + "canonical_instruction": "flip pot upright which is in sink", + "parquet": "data/chunk-014/episode_014325.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014325.mp4" + }, + { + "episode_id": 6468, + "source_index": 6468, + "raw_length": 25, + "instruction": "pick up blue pen and put into drawer", + "canonical_instruction": "pick up blue pen and put into drawer", + "parquet": "data/chunk-006/episode_006468.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006468.mp4" + }, + { + "episode_id": 40542, + "source_index": 40542, + "raw_length": 45, + "instruction": "move red objects in the pan on the green cloth", + "canonical_instruction": "move red objects in the pan on the green cloth", + "parquet": "data/chunk-040/episode_040542.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040542.mp4" + }, + { + "episode_id": 29450, + "source_index": 29450, + "raw_length": 51, + "instruction": "moved the gray pot to the right side of the table", + "canonical_instruction": "moved the gray pot to the right side of the table", + "parquet": "data/chunk-029/episode_029450.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029450.mp4" + }, + { + "episode_id": 35123, + "source_index": 35123, + "raw_length": 21, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-035/episode_035123.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035123.mp4" + }, + { + "episode_id": 6046, + "source_index": 6046, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-006/episode_006046.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006046.mp4" + }, + { + "episode_id": 50058, + "source_index": 50058, + "raw_length": 36, + "instruction": "moved the yellow duck to the right side of the silver pot", + "canonical_instruction": "moved the yellow duck to the right side of the silver pot", + "parquet": "data/chunk-050/episode_050058.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050058.mp4" + }, + { + "episode_id": 43075, + "source_index": 43075, + "raw_length": 20, + "instruction": "put pot or pan on stove", + "canonical_instruction": "put pot or pan on stove", + "parquet": "data/chunk-043/episode_043075.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043075.mp4" + }, + { + "episode_id": 49998, + "source_index": 49998, + "raw_length": 25, + "instruction": "move the can in bottom of the switch burner", + "canonical_instruction": "move the can in bottom of the switch burner", + "parquet": "data/chunk-049/episode_049998.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049998.mp4" + }, + { + "episode_id": 2522, + "source_index": 2522, + "raw_length": 32, + "instruction": "move the silver cover in the left side of the table", + "canonical_instruction": "move the silver cover in the left side of the table", + "parquet": "data/chunk-002/episode_002522.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002522.mp4" + }, + { + "episode_id": 41975, + "source_index": 41975, + "raw_length": 21, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-041/episode_041975.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041975.mp4" + }, + { + "episode_id": 17907, + "source_index": 17907, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-017/episode_017907.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017907.mp4" + }, + { + "episode_id": 39325, + "source_index": 39325, + "raw_length": 21, + "instruction": "put eggplant in pot or pan", + "canonical_instruction": "put eggplant in pot or pan", + "parquet": "data/chunk-039/episode_039325.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039325.mp4" + }, + { + "episode_id": 24025, + "source_index": 24025, + "raw_length": 33, + "instruction": "fold the cloth from bottom to top", + "canonical_instruction": "fold the cloth from bottom to top", + "parquet": "data/chunk-024/episode_024025.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024025.mp4" + }, + { + "episode_id": 28128, + "source_index": 28128, + "raw_length": 46, + "instruction": "put the ball in the cup", + "canonical_instruction": "put the ball in the cup", + "parquet": "data/chunk-028/episode_028128.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028128.mp4" + }, + { + "episode_id": 17346, + "source_index": 17346, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-017/episode_017346.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017346.mp4" + }, + { + "episode_id": 2689, + "source_index": 2689, + "raw_length": 34, + "instruction": "moved blue spoon to the right side of the table above can", + "canonical_instruction": "moved blue spoon to the right side of the table above can", + "parquet": "data/chunk-002/episode_002689.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002689.mp4" + }, + { + "episode_id": 42940, + "source_index": 42940, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-042/episode_042940.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042940.mp4" + }, + { + "episode_id": 33132, + "source_index": 33132, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-033/episode_033132.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033132.mp4" + }, + { + "episode_id": 41545, + "source_index": 41545, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-041/episode_041545.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041545.mp4" + }, + { + "episode_id": 9518, + "source_index": 9518, + "raw_length": 40, + "instruction": "put the long block on top of arch with a ridge", + "canonical_instruction": "put the long block on top of arch with a ridge", + "parquet": "data/chunk-009/episode_009518.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009518.mp4" + }, + { + "episode_id": 30278, + "source_index": 30278, + "raw_length": 30, + "instruction": "move the cloth to the left bottom of the table", + "canonical_instruction": "move the cloth to the left bottom of the table", + "parquet": "data/chunk-030/episode_030278.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030278.mp4" + }, + { + "episode_id": 50938, + "source_index": 50938, + "raw_length": 18, + "instruction": "moved the orange cloth to the top right side of the table", + "canonical_instruction": "moved the orange cloth to the top right side of the table", + "parquet": "data/chunk-050/episode_050938.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050938.mp4" + }, + { + "episode_id": 14012, + "source_index": 14012, + "raw_length": 35, + "instruction": "put spatula on cutting board", + "canonical_instruction": "put spatula on cutting board", + "parquet": "data/chunk-014/episode_014012.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014012.mp4" + }, + { + "episode_id": 39728, + "source_index": 39728, + "raw_length": 31, + "instruction": "move the red object to the upper left of the burner", + "canonical_instruction": "move the red object to the upper left of the burner", + "parquet": "data/chunk-039/episode_039728.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039728.mp4" + }, + { + "episode_id": 42758, + "source_index": 42758, + "raw_length": 30, + "instruction": "upright basil bottle cardboard fence", + "canonical_instruction": "upright basil bottle cardboard fence", + "parquet": "data/chunk-042/episode_042758.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042758.mp4" + }, + { + "episode_id": 10076, + "source_index": 10076, + "raw_length": 31, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-010/episode_010076.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010076.mp4" + }, + { + "episode_id": 28681, + "source_index": 28681, + "raw_length": 38, + "instruction": "moved the blue and white can to the middle of the table", + "canonical_instruction": "moved the blue and white can to the middle of the table", + "parquet": "data/chunk-028/episode_028681.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028681.mp4" + }, + { + "episode_id": 20360, + "source_index": 20360, + "raw_length": 52, + "instruction": "moved a yellow spoon to the upper side of the table", + "canonical_instruction": "moved a yellow spoon to the upper side of the table", + "parquet": "data/chunk-020/episode_020360.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020360.mp4" + }, + { + "episode_id": 40922, + "source_index": 40922, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-040/episode_040922.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040922.mp4" + }, + { + "episode_id": 7693, + "source_index": 7693, + "raw_length": 29, + "instruction": "Place the grapes into the steel pan", + "canonical_instruction": "place the grapes into the steel pan", + "parquet": "data/chunk-007/episode_007693.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007693.mp4" + }, + { + "episode_id": 1451, + "source_index": 1451, + "raw_length": 33, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-001/episode_001451.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001451.mp4" + }, + { + "episode_id": 22357, + "source_index": 22357, + "raw_length": 18, + "instruction": "put strawberry in pot", + "canonical_instruction": "put strawberry in pot", + "parquet": "data/chunk-022/episode_022357.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022357.mp4" + }, + { + "episode_id": 5334, + "source_index": 5334, + "raw_length": 38, + "instruction": "put the blue brush on top of the blue cloth", + "canonical_instruction": "put the blue brush on top of the blue cloth", + "parquet": "data/chunk-005/episode_005334.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005334.mp4" + }, + { + "episode_id": 60, + "source_index": 60, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-000/episode_000060.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000060.mp4" + }, + { + "episode_id": 32119, + "source_index": 32119, + "raw_length": 25, + "instruction": "take bowl off plate cardboard fence", + "canonical_instruction": "take bowl off plate cardboard fence", + "parquet": "data/chunk-032/episode_032119.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032119.mp4" + }, + { + "episode_id": 8928, + "source_index": 8928, + "raw_length": 38, + "instruction": "Place the white cube directly right of the purple cloth.", + "canonical_instruction": "place the white cube directly right of the purple cloth", + "parquet": "data/chunk-008/episode_008928.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008928.mp4" + }, + { + "episode_id": 52449, + "source_index": 52449, + "raw_length": 29, + "instruction": "moved the pot to the right side of the table", + "canonical_instruction": "moved the pot to the right side of the table", + "parquet": "data/chunk-052/episode_052449.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052449.mp4" + }, + { + "episode_id": 15289, + "source_index": 15289, + "raw_length": 35, + "instruction": "Move the chicken to the far left edge of the counter.", + "canonical_instruction": "move the chicken to the far left edge of the counter", + "parquet": "data/chunk-015/episode_015289.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015289.mp4" + }, + { + "episode_id": 4898, + "source_index": 4898, + "raw_length": 22, + "instruction": "pick up glass cup", + "canonical_instruction": "pick up glass cup", + "parquet": "data/chunk-004/episode_004898.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004898.mp4" + }, + { + "episode_id": 28880, + "source_index": 28880, + "raw_length": 37, + "instruction": "put the green cube on top of the arch", + "canonical_instruction": "put the green cube on top of the arch", + "parquet": "data/chunk-028/episode_028880.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028880.mp4" + }, + { + "episode_id": 46442, + "source_index": 46442, + "raw_length": 39, + "instruction": "Move the blue brush to the left of the orange towel", + "canonical_instruction": "move the blue brush to the left of the orange towel", + "parquet": "data/chunk-046/episode_046442.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046442.mp4" + }, + { + "episode_id": 6113, + "source_index": 6113, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-006/episode_006113.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006113.mp4" + }, + { + "episode_id": 35103, + "source_index": 35103, + "raw_length": 23, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-035/episode_035103.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035103.mp4" + }, + { + "episode_id": 39697, + "source_index": 39697, + "raw_length": 39, + "instruction": "move the orange cloth the bottom left corner of the table", + "canonical_instruction": "move the orange cloth the bottom left corner of the table", + "parquet": "data/chunk-039/episode_039697.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039697.mp4" + }, + { + "episode_id": 22004, + "source_index": 22004, + "raw_length": 26, + "instruction": "place the silver bowl on top of the purple cloth", + "canonical_instruction": "place the silver bowl on top of the purple cloth", + "parquet": "data/chunk-022/episode_022004.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022004.mp4" + }, + { + "episode_id": 35345, + "source_index": 35345, + "raw_length": 31, + "instruction": "Move the orange table cloth to the edge of the table.", + "canonical_instruction": "move the orange table cloth to the edge of the table", + "parquet": "data/chunk-035/episode_035345.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035345.mp4" + }, + { + "episode_id": 40751, + "source_index": 40751, + "raw_length": 20, + "instruction": "move the carrot on the yellow cloth", + "canonical_instruction": "move the carrot on the yellow cloth", + "parquet": "data/chunk-040/episode_040751.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040751.mp4" + }, + { + "episode_id": 16580, + "source_index": 16580, + "raw_length": 46, + "instruction": "Place the red bottle on the far edge of the table.", + "canonical_instruction": "place the red bottle on the far edge of the table", + "parquet": "data/chunk-016/episode_016580.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016580.mp4" + }, + { + "episode_id": 41008, + "source_index": 41008, + "raw_length": 46, + "instruction": "put one block on top of the arch", + "canonical_instruction": "put one block on top of the arch", + "parquet": "data/chunk-041/episode_041008.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041008.mp4" + }, + { + "episode_id": 37863, + "source_index": 37863, + "raw_length": 58, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-037/episode_037863.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037863.mp4" + }, + { + "episode_id": 41792, + "source_index": 41792, + "raw_length": 26, + "instruction": "Moved the blue spoon to the top right corner of the surface", + "canonical_instruction": "moved the blue spoon to the top right corner of the surface", + "parquet": "data/chunk-041/episode_041792.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041792.mp4" + }, + { + "episode_id": 33349, + "source_index": 33349, + "raw_length": 25, + "instruction": "put the mushroom in the pot", + "canonical_instruction": "put the mushroom in the pot", + "parquet": "data/chunk-033/episode_033349.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033349.mp4" + }, + { + "episode_id": 22363, + "source_index": 22363, + "raw_length": 46, + "instruction": "put the yellow square on top of the tower", + "canonical_instruction": "put the yellow square on top of the tower", + "parquet": "data/chunk-022/episode_022363.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022363.mp4" + }, + { + "episode_id": 51029, + "source_index": 51029, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-051/episode_051029.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051029.mp4" + }, + { + "episode_id": 21336, + "source_index": 21336, + "raw_length": 56, + "instruction": "put the broccoli in the silver pot", + "canonical_instruction": "put the broccoli in the silver pot", + "parquet": "data/chunk-021/episode_021336.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021336.mp4" + }, + { + "episode_id": 33135, + "source_index": 33135, + "raw_length": 36, + "instruction": "take the red object out of the pot and put it on the left burner", + "canonical_instruction": "take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-033/episode_033135.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033135.mp4" + }, + { + "episode_id": 23577, + "source_index": 23577, + "raw_length": 20, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-023/episode_023577.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023577.mp4" + }, + { + "episode_id": 24198, + "source_index": 24198, + "raw_length": 28, + "instruction": "cover the red object with the purple cloth", + "canonical_instruction": "cover the red object with the purple cloth", + "parquet": "data/chunk-024/episode_024198.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024198.mp4" + }, + { + "episode_id": 34674, + "source_index": 34674, + "raw_length": 39, + "instruction": "dropped the green object to the bottom", + "canonical_instruction": "dropped the green object to the bottom", + "parquet": "data/chunk-034/episode_034674.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034674.mp4" + }, + { + "episode_id": 26180, + "source_index": 26180, + "raw_length": 72, + "instruction": "put yellowpepper on plate and cookiebox in pot or pan on stove", + "canonical_instruction": "put yellowpepper on plate and cookiebox in pot or pan on stove", + "parquet": "data/chunk-026/episode_026180.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026180.mp4" + }, + { + "episode_id": 19187, + "source_index": 19187, + "raw_length": 29, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-019/episode_019187.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019187.mp4" + }, + { + "episode_id": 47468, + "source_index": 47468, + "raw_length": 33, + "instruction": "Place the metal pot on the yellow cloth.", + "canonical_instruction": "place the metal pot on the yellow cloth", + "parquet": "data/chunk-047/episode_047468.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047468.mp4" + }, + { + "episode_id": 49750, + "source_index": 49750, + "raw_length": 46, + "instruction": "put the green arch on top of the red arch", + "canonical_instruction": "put the green arch on top of the red arch", + "parquet": "data/chunk-049/episode_049750.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049750.mp4" + }, + { + "episode_id": 50142, + "source_index": 50142, + "raw_length": 44, + "instruction": "Take a red square block and put it next to the blue square block", + "canonical_instruction": "take a red square block and put it next to the blue square block", + "parquet": "data/chunk-050/episode_050142.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050142.mp4" + }, + { + "episode_id": 39916, + "source_index": 39916, + "raw_length": 22, + "instruction": "fold the cloth from bottom left to right", + "canonical_instruction": "fold the cloth from bottom left to right", + "parquet": "data/chunk-039/episode_039916.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039916.mp4" + }, + { + "episode_id": 36151, + "source_index": 36151, + "raw_length": 37, + "instruction": "Moved the half carrot from the right side to the left side of the cabinet", + "canonical_instruction": "moved the half carrot from the right side to the left side of the cabinet", + "parquet": "data/chunk-036/episode_036151.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036151.mp4" + }, + { + "episode_id": 1547, + "source_index": 1547, + "raw_length": 35, + "instruction": "The robot placed the cloth on the butane gas burner", + "canonical_instruction": "the robot placed the cloth on the butane gas burner", + "parquet": "data/chunk-001/episode_001547.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001547.mp4" + }, + { + "episode_id": 3676, + "source_index": 3676, + "raw_length": 18, + "instruction": "flip pot upright which is in sink", + "canonical_instruction": "flip pot upright which is in sink", + "parquet": "data/chunk-003/episode_003676.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003676.mp4" + }, + { + "episode_id": 39051, + "source_index": 39051, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-039/episode_039051.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039051.mp4" + }, + { + "episode_id": 52056, + "source_index": 52056, + "raw_length": 21, + "instruction": "put sushi in pot or pan", + "canonical_instruction": "put sushi in pot or pan", + "parquet": "data/chunk-052/episode_052056.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052056.mp4" + }, + { + "episode_id": 26112, + "source_index": 26112, + "raw_length": 41, + "instruction": "Move the spoon to the left of the towel", + "canonical_instruction": "move the spoon to the left of the towel", + "parquet": "data/chunk-026/episode_026112.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026112.mp4" + }, + { + "episode_id": 21626, + "source_index": 21626, + "raw_length": 48, + "instruction": "put the pot with the red and yellow object from the right stove on the left stove", + "canonical_instruction": "put the pot with the red and yellow object from the right stove on the left stove", + "parquet": "data/chunk-021/episode_021626.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021626.mp4" + }, + { + "episode_id": 19307, + "source_index": 19307, + "raw_length": 44, + "instruction": "Take the Blue object from the drawer and put it left side", + "canonical_instruction": "take the blue object from the drawer and put it left side", + "parquet": "data/chunk-019/episode_019307.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019307.mp4" + }, + { + "episode_id": 23869, + "source_index": 23869, + "raw_length": 37, + "instruction": "put the yellow duck in the drawer", + "canonical_instruction": "put the yellow duck in the drawer", + "parquet": "data/chunk-023/episode_023869.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023869.mp4" + }, + { + "episode_id": 1627, + "source_index": 1627, + "raw_length": 45, + "instruction": "Place the sushi behind the yellow towel", + "canonical_instruction": "place the sushi behind the yellow towel", + "parquet": "data/chunk-001/episode_001627.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001627.mp4" + }, + { + "episode_id": 16997, + "source_index": 16997, + "raw_length": 34, + "instruction": "take the purple cloth and put it inside the machine", + "canonical_instruction": "take the purple cloth and put it inside the machine", + "parquet": "data/chunk-016/episode_016997.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016997.mp4" + }, + { + "episode_id": 13508, + "source_index": 13508, + "raw_length": 46, + "instruction": "move the orange and place it on green cloth", + "canonical_instruction": "move the orange and place it on green cloth", + "parquet": "data/chunk-013/episode_013508.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013508.mp4" + }, + { + "episode_id": 38529, + "source_index": 38529, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-038/episode_038529.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038529.mp4" + }, + { + "episode_id": 37762, + "source_index": 37762, + "raw_length": 31, + "instruction": "put the pot at the top right of the burner", + "canonical_instruction": "put the pot at the top right of the burner", + "parquet": "data/chunk-037/episode_037762.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037762.mp4" + }, + { + "episode_id": 5657, + "source_index": 5657, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-005/episode_005657.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005657.mp4" + }, + { + "episode_id": 36322, + "source_index": 36322, + "raw_length": 47, + "instruction": "moved the pot in between the right burner", + "canonical_instruction": "moved the pot in between the right burner", + "parquet": "data/chunk-036/episode_036322.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036322.mp4" + }, + { + "episode_id": 44138, + "source_index": 44138, + "raw_length": 21, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-044/episode_044138.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044138.mp4" + }, + { + "episode_id": 16020, + "source_index": 16020, + "raw_length": 21, + "instruction": "put the red fork on top of the blue cloth", + "canonical_instruction": "put the red fork on top of the blue cloth", + "parquet": "data/chunk-016/episode_016020.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016020.mp4" + }, + { + "episode_id": 23743, + "source_index": 23743, + "raw_length": 28, + "instruction": "PICK UP THE VESSEL AND PUT ANOTHER SIDE OF THE TABLE", + "canonical_instruction": "pick up the vessel and put another side of the table", + "parquet": "data/chunk-023/episode_023743.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023743.mp4" + }, + { + "episode_id": 33055, + "source_index": 33055, + "raw_length": 32, + "instruction": "Put the pan in the upper left side of the table", + "canonical_instruction": "put the pan in the upper left side of the table", + "parquet": "data/chunk-033/episode_033055.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033055.mp4" + }, + { + "episode_id": 3586, + "source_index": 3586, + "raw_length": 28, + "instruction": "move the green object from the cloth to the top right of the cloth", + "canonical_instruction": "move the green object from the cloth to the top right of the cloth", + "parquet": "data/chunk-003/episode_003586.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003586.mp4" + }, + { + "episode_id": 49473, + "source_index": 49473, + "raw_length": 37, + "instruction": "Pick up the yellow stick and place it behind the green cloth", + "canonical_instruction": "pick up the yellow stick and place it behind the green cloth", + "parquet": "data/chunk-049/episode_049473.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049473.mp4" + }, + { + "episode_id": 28476, + "source_index": 28476, + "raw_length": 34, + "instruction": "take cucumber out of cup", + "canonical_instruction": "take cucumber out of cup", + "parquet": "data/chunk-028/episode_028476.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028476.mp4" + }, + { + "episode_id": 21435, + "source_index": 21435, + "raw_length": 25, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-021/episode_021435.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021435.mp4" + }, + { + "episode_id": 10414, + "source_index": 10414, + "raw_length": 34, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-010/episode_010414.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010414.mp4" + }, + { + "episode_id": 43866, + "source_index": 43866, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-043/episode_043866.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043866.mp4" + }, + { + "episode_id": 33203, + "source_index": 33203, + "raw_length": 28, + "instruction": "move the green cloth to the right side of the table", + "canonical_instruction": "move the green cloth to the right side of the table", + "parquet": "data/chunk-033/episode_033203.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033203.mp4" + }, + { + "episode_id": 21815, + "source_index": 21815, + "raw_length": 32, + "instruction": "Move the spoon from the right side of the cooker to the top of the left cooker", + "canonical_instruction": "move the spoon from the right side of the cooker to the top of the left cooker", + "parquet": "data/chunk-021/episode_021815.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021815.mp4" + }, + { + "episode_id": 1201, + "source_index": 1201, + "raw_length": 41, + "instruction": "fold the cloth from the right to the left", + "canonical_instruction": "fold the cloth from the right to the left", + "parquet": "data/chunk-001/episode_001201.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001201.mp4" + }, + { + "episode_id": 51235, + "source_index": 51235, + "raw_length": 30, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-051/episode_051235.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051235.mp4" + }, + { + "episode_id": 9235, + "source_index": 9235, + "raw_length": 42, + "instruction": "put the blue object in the drawer", + "canonical_instruction": "put the blue object in the drawer", + "parquet": "data/chunk-009/episode_009235.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009235.mp4" + }, + { + "episode_id": 12471, + "source_index": 12471, + "raw_length": 31, + "instruction": "MOVE THE BLENDER INSIDE THE VESSEL", + "canonical_instruction": "move the blender inside the vessel", + "parquet": "data/chunk-012/episode_012471.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012471.mp4" + }, + { + "episode_id": 41077, + "source_index": 41077, + "raw_length": 21, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-041/episode_041077.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041077.mp4" + }, + { + "episode_id": 47625, + "source_index": 47625, + "raw_length": 21, + "instruction": "put knife in pot or pan", + "canonical_instruction": "put knife in pot or pan", + "parquet": "data/chunk-047/episode_047625.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047625.mp4" + }, + { + "episode_id": 45503, + "source_index": 45503, + "raw_length": 41, + "instruction": "move the pot on the left side of burner", + "canonical_instruction": "move the pot on the left side of burner", + "parquet": "data/chunk-045/episode_045503.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045503.mp4" + }, + { + "episode_id": 38352, + "source_index": 38352, + "raw_length": 36, + "instruction": "take brown stuffed toy and put it in the silver pot", + "canonical_instruction": "take brown stuffed toy and put it in the silver pot", + "parquet": "data/chunk-038/episode_038352.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038352.mp4" + }, + { + "episode_id": 2124, + "source_index": 2124, + "raw_length": 32, + "instruction": "put the red spoon on the right burner", + "canonical_instruction": "put the red spoon on the right burner", + "parquet": "data/chunk-002/episode_002124.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002124.mp4" + }, + { + "episode_id": 22029, + "source_index": 22029, + "raw_length": 41, + "instruction": "move the silver pot to the top right corner of the burner", + "canonical_instruction": "move the silver pot to the top right corner of the burner", + "parquet": "data/chunk-022/episode_022029.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022029.mp4" + }, + { + "episode_id": 44622, + "source_index": 44622, + "raw_length": 32, + "instruction": "move the orange thing to the top right side of the table", + "canonical_instruction": "move the orange thing to the top right side of the table", + "parquet": "data/chunk-044/episode_044622.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044622.mp4" + }, + { + "episode_id": 31264, + "source_index": 31264, + "raw_length": 34, + "instruction": "put the can to upper right of the table", + "canonical_instruction": "put the can to upper right of the table", + "parquet": "data/chunk-031/episode_031264.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031264.mp4" + }, + { + "episode_id": 29336, + "source_index": 29336, + "raw_length": 25, + "instruction": "Pick up the pot and put it on the stove with the heat on.", + "canonical_instruction": "pick up the pot and put it on the stove with the heat on", + "parquet": "data/chunk-029/episode_029336.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029336.mp4" + }, + { + "episode_id": 38349, + "source_index": 38349, + "raw_length": 32, + "instruction": "move the white dish on the right side of the board", + "canonical_instruction": "move the white dish on the right side of the board", + "parquet": "data/chunk-038/episode_038349.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038349.mp4" + }, + { + "episode_id": 6531, + "source_index": 6531, + "raw_length": 35, + "instruction": "move the carrot to the right side of the silver pot", + "canonical_instruction": "move the carrot to the right side of the silver pot", + "parquet": "data/chunk-006/episode_006531.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006531.mp4" + }, + { + "episode_id": 2293, + "source_index": 2293, + "raw_length": 23, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-002/episode_002293.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002293.mp4" + }, + { + "episode_id": 31974, + "source_index": 31974, + "raw_length": 21, + "instruction": "Move the towel to the left side of the table", + "canonical_instruction": "move the towel to the left side of the table", + "parquet": "data/chunk-031/episode_031974.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031974.mp4" + }, + { + "episode_id": 503, + "source_index": 503, + "raw_length": 46, + "instruction": "take the white object out of the drawer", + "canonical_instruction": "take the white object out of the drawer", + "parquet": "data/chunk-000/episode_000503.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000503.mp4" + }, + { + "episode_id": 45030, + "source_index": 45030, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-045/episode_045030.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045030.mp4" + }, + { + "episode_id": 27879, + "source_index": 27879, + "raw_length": 46, + "instruction": "Place the spatula on the blue cloth.", + "canonical_instruction": "place the spatula on the blue cloth", + "parquet": "data/chunk-027/episode_027879.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027879.mp4" + }, + { + "episode_id": 30236, + "source_index": 30236, + "raw_length": 21, + "instruction": "mouve in object", + "canonical_instruction": "mouve in object", + "parquet": "data/chunk-030/episode_030236.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030236.mp4" + }, + { + "episode_id": 19637, + "source_index": 19637, + "raw_length": 43, + "instruction": "Move the blue spoon to the lower left edge of table", + "canonical_instruction": "move the blue spoon to the lower left edge of table", + "parquet": "data/chunk-019/episode_019637.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019637.mp4" + }, + { + "episode_id": 52643, + "source_index": 52643, + "raw_length": 26, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-052/episode_052643.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052643.mp4" + }, + { + "episode_id": 4835, + "source_index": 4835, + "raw_length": 37, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-004/episode_004835.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004835.mp4" + }, + { + "episode_id": 52295, + "source_index": 52295, + "raw_length": 35, + "instruction": "take banana out of colander", + "canonical_instruction": "take banana out of colander", + "parquet": "data/chunk-052/episode_052295.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052295.mp4" + }, + { + "episode_id": 46935, + "source_index": 46935, + "raw_length": 40, + "instruction": "take the red object out of the pot and put it on the left burner", + "canonical_instruction": "take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-046/episode_046935.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046935.mp4" + }, + { + "episode_id": 41240, + "source_index": 41240, + "raw_length": 38, + "instruction": "put the blue fork on top of the green cloth", + "canonical_instruction": "put the blue fork on top of the green cloth", + "parquet": "data/chunk-041/episode_041240.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041240.mp4" + }, + { + "episode_id": 43643, + "source_index": 43643, + "raw_length": 39, + "instruction": "moved the silver lid to the upper middle of the table", + "canonical_instruction": "moved the silver lid to the upper middle of the table", + "parquet": "data/chunk-043/episode_043643.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043643.mp4" + }, + { + "episode_id": 49179, + "source_index": 49179, + "raw_length": 42, + "instruction": "put the ball in the cup", + "canonical_instruction": "put the ball in the cup", + "parquet": "data/chunk-049/episode_049179.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049179.mp4" + }, + { + "episode_id": 27746, + "source_index": 27746, + "raw_length": 38, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-027/episode_027746.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027746.mp4" + }, + { + "episode_id": 18472, + "source_index": 18472, + "raw_length": 42, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-018/episode_018472.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018472.mp4" + }, + { + "episode_id": 44510, + "source_index": 44510, + "raw_length": 34, + "instruction": "move the cloth at the center of the table", + "canonical_instruction": "move the cloth at the center of the table", + "parquet": "data/chunk-044/episode_044510.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044510.mp4" + }, + { + "episode_id": 28237, + "source_index": 28237, + "raw_length": 36, + "instruction": "move the salmon on the upper right of the stove", + "canonical_instruction": "move the salmon on the upper right of the stove", + "parquet": "data/chunk-028/episode_028237.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028237.mp4" + }, + { + "episode_id": 52837, + "source_index": 52837, + "raw_length": 46, + "instruction": "take the figure out of the cloth and put it outside of the table", + "canonical_instruction": "take the figure out of the cloth and put it outside of the table", + "parquet": "data/chunk-052/episode_052837.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052837.mp4" + }, + { + "episode_id": 17245, + "source_index": 17245, + "raw_length": 37, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-017/episode_017245.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017245.mp4" + }, + { + "episode_id": 46236, + "source_index": 46236, + "raw_length": 36, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-046/episode_046236.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046236.mp4" + }, + { + "episode_id": 28047, + "source_index": 28047, + "raw_length": 46, + "instruction": "Place the red bottle on the far edge of the table.", + "canonical_instruction": "place the red bottle on the far edge of the table", + "parquet": "data/chunk-028/episode_028047.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028047.mp4" + }, + { + "episode_id": 7356, + "source_index": 7356, + "raw_length": 23, + "instruction": "put the can above the igniter buttons", + "canonical_instruction": "put the can above the igniter buttons", + "parquet": "data/chunk-007/episode_007356.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007356.mp4" + }, + { + "episode_id": 50791, + "source_index": 50791, + "raw_length": 37, + "instruction": "move the green cloth to the bottom of the left side stove", + "canonical_instruction": "move the green cloth to the bottom of the left side stove", + "parquet": "data/chunk-050/episode_050791.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050791.mp4" + }, + { + "episode_id": 9099, + "source_index": 9099, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-009/episode_009099.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009099.mp4" + }, + { + "episode_id": 882, + "source_index": 882, + "raw_length": 34, + "instruction": "Place the yellow cloth on the far edge of the table", + "canonical_instruction": "place the yellow cloth on the far edge of the table", + "parquet": "data/chunk-000/episode_000882.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000882.mp4" + }, + { + "episode_id": 52318, + "source_index": 52318, + "raw_length": 18, + "instruction": "close white1fbox flap", + "canonical_instruction": "close white1fbox flap", + "parquet": "data/chunk-052/episode_052318.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052318.mp4" + }, + { + "episode_id": 798, + "source_index": 798, + "raw_length": 37, + "instruction": "move a red tumbler from bottom left to the top right", + "canonical_instruction": "move a red tumbler from bottom left to the top right", + "parquet": "data/chunk-000/episode_000798.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000798.mp4" + }, + { + "episode_id": 38751, + "source_index": 38751, + "raw_length": 46, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-038/episode_038751.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038751.mp4" + }, + { + "episode_id": 5941, + "source_index": 5941, + "raw_length": 39, + "instruction": "take the tomato in the pot and put it on the left side of the blue spatula.", + "canonical_instruction": "take the tomato in the pot and put it on the left side of the blue spatula", + "parquet": "data/chunk-005/episode_005941.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005941.mp4" + }, + { + "episode_id": 5047, + "source_index": 5047, + "raw_length": 26, + "instruction": "pick up green mug", + "canonical_instruction": "pick up green mug", + "parquet": "data/chunk-005/episode_005047.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005047.mp4" + }, + { + "episode_id": 39771, + "source_index": 39771, + "raw_length": 32, + "instruction": "Move the blue brush to the bottom left corner of the table.", + "canonical_instruction": "move the blue brush to the bottom left corner of the table", + "parquet": "data/chunk-039/episode_039771.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039771.mp4" + }, + { + "episode_id": 42787, + "source_index": 42787, + "raw_length": 23, + "instruction": "move the green object to bottom left of the table", + "canonical_instruction": "move the green object to bottom left of the table", + "parquet": "data/chunk-042/episode_042787.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042787.mp4" + }, + { + "episode_id": 33320, + "source_index": 33320, + "raw_length": 31, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-033/episode_033320.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033320.mp4" + }, + { + "episode_id": 43547, + "source_index": 43547, + "raw_length": 46, + "instruction": "move the red spoon to the right burner", + "canonical_instruction": "move the red spoon to the right burner", + "parquet": "data/chunk-043/episode_043547.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043547.mp4" + }, + { + "episode_id": 24248, + "source_index": 24248, + "raw_length": 22, + "instruction": "move the yellow cloth to the left side on the table", + "canonical_instruction": "move the yellow cloth to the left side on the table", + "parquet": "data/chunk-024/episode_024248.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024248.mp4" + }, + { + "episode_id": 35075, + "source_index": 35075, + "raw_length": 30, + "instruction": "Place the eggplant on the green cloth.", + "canonical_instruction": "place the eggplant on the green cloth", + "parquet": "data/chunk-035/episode_035075.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035075.mp4" + }, + { + "episode_id": 15955, + "source_index": 15955, + "raw_length": 22, + "instruction": "move the orange cloth to the top right corner of the table", + "canonical_instruction": "move the orange cloth to the top right corner of the table", + "parquet": "data/chunk-015/episode_015955.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015955.mp4" + }, + { + "episode_id": 40393, + "source_index": 40393, + "raw_length": 77, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-040/episode_040393.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040393.mp4" + }, + { + "episode_id": 25679, + "source_index": 25679, + "raw_length": 17, + "instruction": "moves the bottle from right to the left of the hanging table", + "canonical_instruction": "moves the bottle from right to the left of the hanging table", + "parquet": "data/chunk-025/episode_025679.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025679.mp4" + }, + { + "episode_id": 46237, + "source_index": 46237, + "raw_length": 36, + "instruction": "put the red thing to the top center of the table", + "canonical_instruction": "put the red thing to the top center of the table", + "parquet": "data/chunk-046/episode_046237.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046237.mp4" + }, + { + "episode_id": 39385, + "source_index": 39385, + "raw_length": 43, + "instruction": "Move the blue brush to upper side of the stove next to yellow cloth", + "canonical_instruction": "move the blue brush to upper side of the stove next to yellow cloth", + "parquet": "data/chunk-039/episode_039385.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039385.mp4" + }, + { + "episode_id": 16700, + "source_index": 16700, + "raw_length": 43, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-016/episode_016700.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016700.mp4" + }, + { + "episode_id": 31212, + "source_index": 31212, + "raw_length": 59, + "instruction": "put pickle on plate and mushroom in pot or pan on stove", + "canonical_instruction": "put pickle on plate and mushroom in pot or pan on stove", + "parquet": "data/chunk-031/episode_031212.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031212.mp4" + }, + { + "episode_id": 43801, + "source_index": 43801, + "raw_length": 24, + "instruction": "Move the cloth to the back of the stove", + "canonical_instruction": "move the cloth to the back of the stove", + "parquet": "data/chunk-043/episode_043801.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043801.mp4" + }, + { + "episode_id": 4170, + "source_index": 4170, + "raw_length": 27, + "instruction": "put potato in pot cardboard fence", + "canonical_instruction": "put potato in pot cardboard fence", + "parquet": "data/chunk-004/episode_004170.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004170.mp4" + }, + { + "episode_id": 43657, + "source_index": 43657, + "raw_length": 39, + "instruction": "moved the fork to the upper right of the burner", + "canonical_instruction": "moved the fork to the upper right of the burner", + "parquet": "data/chunk-043/episode_043657.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043657.mp4" + }, + { + "episode_id": 1747, + "source_index": 1747, + "raw_length": 25, + "instruction": "Place the pot on the lower right edge of the burner", + "canonical_instruction": "place the pot on the lower right edge of the burner", + "parquet": "data/chunk-001/episode_001747.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001747.mp4" + }, + { + "episode_id": 44042, + "source_index": 44042, + "raw_length": 28, + "instruction": "move the pot cover from the top of the silver pot to behind the blue fork", + "canonical_instruction": "move the pot cover from the top of the silver pot to behind the blue fork", + "parquet": "data/chunk-044/episode_044042.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044042.mp4" + }, + { + "episode_id": 43577, + "source_index": 43577, + "raw_length": 30, + "instruction": "close cabinet", + "canonical_instruction": "close cabinet", + "parquet": "data/chunk-043/episode_043577.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043577.mp4" + }, + { + "episode_id": 1437, + "source_index": 1437, + "raw_length": 46, + "instruction": "Unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-001/episode_001437.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001437.mp4" + }, + { + "episode_id": 8445, + "source_index": 8445, + "raw_length": 46, + "instruction": "move the pot from left side to right side", + "canonical_instruction": "move the pot from left side to right side", + "parquet": "data/chunk-008/episode_008445.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008445.mp4" + }, + { + "episode_id": 34101, + "source_index": 34101, + "raw_length": 31, + "instruction": "fold the cloth from left to right", + "canonical_instruction": "fold the cloth from left to right", + "parquet": "data/chunk-034/episode_034101.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034101.mp4" + }, + { + "episode_id": 18405, + "source_index": 18405, + "raw_length": 33, + "instruction": "place blue cloth on the table", + "canonical_instruction": "place blue cloth on the table", + "parquet": "data/chunk-018/episode_018405.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018405.mp4" + }, + { + "episode_id": 27923, + "source_index": 27923, + "raw_length": 26, + "instruction": "put the brown object above the silver pot", + "canonical_instruction": "put the brown object above the silver pot", + "parquet": "data/chunk-027/episode_027923.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027923.mp4" + }, + { + "episode_id": 45664, + "source_index": 45664, + "raw_length": 37, + "instruction": "Place the egg to back end of the table", + "canonical_instruction": "place the egg to back end of the table", + "parquet": "data/chunk-045/episode_045664.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045664.mp4" + }, + { + "episode_id": 4832, + "source_index": 4832, + "raw_length": 41, + "instruction": "silver pot removed from yellow cloth", + "canonical_instruction": "silver pot removed from yellow cloth", + "parquet": "data/chunk-004/episode_004832.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004832.mp4" + }, + { + "episode_id": 50282, + "source_index": 50282, + "raw_length": 18, + "instruction": "Move the yellow towel to the front edge of the table", + "canonical_instruction": "move the yellow towel to the front edge of the table", + "parquet": "data/chunk-050/episode_050282.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050282.mp4" + }, + { + "episode_id": 31697, + "source_index": 31697, + "raw_length": 28, + "instruction": "moved the blue fork the the left side of the left burner", + "canonical_instruction": "moved the blue fork the the left side of the left burner", + "parquet": "data/chunk-031/episode_031697.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031697.mp4" + }, + { + "episode_id": 22889, + "source_index": 22889, + "raw_length": 43, + "instruction": "put the orange shrimp to the top left of the green thing", + "canonical_instruction": "put the orange shrimp to the top left of the green thing", + "parquet": "data/chunk-022/episode_022889.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022889.mp4" + }, + { + "episode_id": 34673, + "source_index": 34673, + "raw_length": 35, + "instruction": "puting th yellow block on top of the arc", + "canonical_instruction": "puting th yellow block on top of the arc", + "parquet": "data/chunk-034/episode_034673.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034673.mp4" + }, + { + "episode_id": 31857, + "source_index": 31857, + "raw_length": 26, + "instruction": "moved the blue spoon to the bottom right burner", + "canonical_instruction": "moved the blue spoon to the bottom right burner", + "parquet": "data/chunk-031/episode_031857.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031857.mp4" + }, + { + "episode_id": 6913, + "source_index": 6913, + "raw_length": 33, + "instruction": "move the gray object to the top left of the stove", + "canonical_instruction": "move the gray object to the top left of the stove", + "parquet": "data/chunk-006/episode_006913.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006913.mp4" + }, + { + "episode_id": 45335, + "source_index": 45335, + "raw_length": 35, + "instruction": "close low fridge", + "canonical_instruction": "close low fridge", + "parquet": "data/chunk-045/episode_045335.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045335.mp4" + }, + { + "episode_id": 36325, + "source_index": 36325, + "raw_length": 29, + "instruction": "Take the cucumber out of the pot and move it to the middle of the stove.", + "canonical_instruction": "take the cucumber out of the pot and move it to the middle of the stove", + "parquet": "data/chunk-036/episode_036325.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036325.mp4" + }, + { + "episode_id": 31188, + "source_index": 31188, + "raw_length": 33, + "instruction": "put the sushi inside the silver pot", + "canonical_instruction": "put the sushi inside the silver pot", + "parquet": "data/chunk-031/episode_031188.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031188.mp4" + }, + { + "episode_id": 42964, + "source_index": 42964, + "raw_length": 37, + "instruction": "move the blue spoon to the left bottom of burner", + "canonical_instruction": "move the blue spoon to the left bottom of burner", + "parquet": "data/chunk-042/episode_042964.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042964.mp4" + }, + { + "episode_id": 21041, + "source_index": 21041, + "raw_length": 34, + "instruction": "PICK UP THE ORANGE TOWEL AND MOVE ANOTHER SIDE OF TABLE", + "canonical_instruction": "pick up the orange towel and move another side of table", + "parquet": "data/chunk-021/episode_021041.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021041.mp4" + }, + { + "episode_id": 38629, + "source_index": 38629, + "raw_length": 24, + "instruction": "take bowl off plate cardboard fence", + "canonical_instruction": "take bowl off plate cardboard fence", + "parquet": "data/chunk-038/episode_038629.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038629.mp4" + }, + { + "episode_id": 11390, + "source_index": 11390, + "raw_length": 48, + "instruction": "Move the yellow spoon into the yellow tray on the left side", + "canonical_instruction": "move the yellow spoon into the yellow tray on the left side", + "parquet": "data/chunk-011/episode_011390.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011390.mp4" + }, + { + "episode_id": 25854, + "source_index": 25854, + "raw_length": 39, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-025/episode_025854.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025854.mp4" + }, + { + "episode_id": 28072, + "source_index": 28072, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-028/episode_028072.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028072.mp4" + }, + { + "episode_id": 49870, + "source_index": 49870, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-049/episode_049870.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049870.mp4" + }, + { + "episode_id": 10352, + "source_index": 10352, + "raw_length": 29, + "instruction": "move the blue to top side of cloth", + "canonical_instruction": "move the blue to top side of cloth", + "parquet": "data/chunk-010/episode_010352.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010352.mp4" + }, + { + "episode_id": 28743, + "source_index": 28743, + "raw_length": 46, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-028/episode_028743.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028743.mp4" + }, + { + "episode_id": 26623, + "source_index": 26623, + "raw_length": 36, + "instruction": "Pick up the mushroom and put it near the right corner of the table near the stove.", + "canonical_instruction": "pick up the mushroom and put it near the right corner of the table near the stove", + "parquet": "data/chunk-026/episode_026623.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026623.mp4" + }, + { + "episode_id": 4610, + "source_index": 4610, + "raw_length": 25, + "instruction": "Place the pan on the far right edge of the stove", + "canonical_instruction": "place the pan on the far right edge of the stove", + "parquet": "data/chunk-004/episode_004610.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004610.mp4" + }, + { + "episode_id": 12957, + "source_index": 12957, + "raw_length": 27, + "instruction": "Move the purple cloth to the lower right side of the table", + "canonical_instruction": "move the purple cloth to the lower right side of the table", + "parquet": "data/chunk-012/episode_012957.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012957.mp4" + }, + { + "episode_id": 6208, + "source_index": 6208, + "raw_length": 20, + "instruction": "put corn in pot which is in sink", + "canonical_instruction": "put corn in pot which is in sink", + "parquet": "data/chunk-006/episode_006208.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006208.mp4" + }, + { + "episode_id": 34741, + "source_index": 34741, + "raw_length": 26, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-034/episode_034741.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034741.mp4" + }, + { + "episode_id": 30729, + "source_index": 30729, + "raw_length": 46, + "instruction": "Move the towel over to the right corner of the counter.", + "canonical_instruction": "move the towel over to the right corner of the counter", + "parquet": "data/chunk-030/episode_030729.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030729.mp4" + }, + { + "episode_id": 34445, + "source_index": 34445, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-034/episode_034445.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034445.mp4" + }, + { + "episode_id": 5386, + "source_index": 5386, + "raw_length": 45, + "instruction": "Move the yellow cloth behind edge of the table", + "canonical_instruction": "move the yellow cloth behind edge of the table", + "parquet": "data/chunk-005/episode_005386.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005386.mp4" + }, + { + "episode_id": 15787, + "source_index": 15787, + "raw_length": 35, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-015/episode_015787.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015787.mp4" + }, + { + "episode_id": 28892, + "source_index": 28892, + "raw_length": 45, + "instruction": "move the yellow colth in front of table", + "canonical_instruction": "move the yellow colth in front of table", + "parquet": "data/chunk-028/episode_028892.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028892.mp4" + }, + { + "episode_id": 13210, + "source_index": 13210, + "raw_length": 21, + "instruction": "turn faucet right", + "canonical_instruction": "turn faucet right", + "parquet": "data/chunk-013/episode_013210.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013210.mp4" + }, + { + "episode_id": 6230, + "source_index": 6230, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-006/episode_006230.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006230.mp4" + }, + { + "episode_id": 14608, + "source_index": 14608, + "raw_length": 46, + "instruction": "Put the cheese inside the drawer", + "canonical_instruction": "put the cheese inside the drawer", + "parquet": "data/chunk-014/episode_014608.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014608.mp4" + }, + { + "episode_id": 8037, + "source_index": 8037, + "raw_length": 29, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-008/episode_008037.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008037.mp4" + }, + { + "episode_id": 17072, + "source_index": 17072, + "raw_length": 33, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-017/episode_017072.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017072.mp4" + }, + { + "episode_id": 26390, + "source_index": 26390, + "raw_length": 34, + "instruction": "move the cloth to the left of the burner", + "canonical_instruction": "move the cloth to the left of the burner", + "parquet": "data/chunk-026/episode_026390.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026390.mp4" + }, + { + "episode_id": 18969, + "source_index": 18969, + "raw_length": 35, + "instruction": "Description", + "canonical_instruction": "description", + "parquet": "data/chunk-018/episode_018969.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018969.mp4" + }, + { + "episode_id": 17531, + "source_index": 17531, + "raw_length": 21, + "instruction": "put eggplant in pot or pan", + "canonical_instruction": "put eggplant in pot or pan", + "parquet": "data/chunk-017/episode_017531.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017531.mp4" + }, + { + "episode_id": 14267, + "source_index": 14267, + "raw_length": 44, + "instruction": "put the plus on top of the green cube", + "canonical_instruction": "put the plus on top of the green cube", + "parquet": "data/chunk-014/episode_014267.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014267.mp4" + }, + { + "episode_id": 33220, + "source_index": 33220, + "raw_length": 25, + "instruction": "put the ladle spoon on top of the yellow cloth", + "canonical_instruction": "put the ladle spoon on top of the yellow cloth", + "parquet": "data/chunk-033/episode_033220.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033220.mp4" + }, + { + "episode_id": 42376, + "source_index": 42376, + "raw_length": 28, + "instruction": "fold the cloth from the top left to bottom right", + "canonical_instruction": "fold the cloth from the top left to bottom right", + "parquet": "data/chunk-042/episode_042376.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042376.mp4" + }, + { + "episode_id": 51666, + "source_index": 51666, + "raw_length": 44, + "instruction": "fold cloth from the top left to the bottom right", + "canonical_instruction": "fold cloth from the top left to the bottom right", + "parquet": "data/chunk-051/episode_051666.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051666.mp4" + }, + { + "episode_id": 27554, + "source_index": 27554, + "raw_length": 46, + "instruction": "Place the colander to the left of the sushi", + "canonical_instruction": "place the colander to the left of the sushi", + "parquet": "data/chunk-027/episode_027554.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027554.mp4" + }, + { + "episode_id": 16226, + "source_index": 16226, + "raw_length": 36, + "instruction": "take carrot out of pot cardboard fence", + "canonical_instruction": "take carrot out of pot cardboard fence", + "parquet": "data/chunk-016/episode_016226.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016226.mp4" + }, + { + "episode_id": 3376, + "source_index": 3376, + "raw_length": 23, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-003/episode_003376.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003376.mp4" + }, + { + "episode_id": 41693, + "source_index": 41693, + "raw_length": 24, + "instruction": "moved the green cloth to the right side of the table", + "canonical_instruction": "moved the green cloth to the right side of the table", + "parquet": "data/chunk-041/episode_041693.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041693.mp4" + }, + { + "episode_id": 29012, + "source_index": 29012, + "raw_length": 79, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-029/episode_029012.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029012.mp4" + }, + { + "episode_id": 48180, + "source_index": 48180, + "raw_length": 23, + "instruction": "move the silver pot to the top left side on the table", + "canonical_instruction": "move the silver pot to the top left side on the table", + "parquet": "data/chunk-048/episode_048180.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048180.mp4" + }, + { + "episode_id": 15934, + "source_index": 15934, + "raw_length": 46, + "instruction": "Move the spoon top left of the table", + "canonical_instruction": "move the spoon top left of the table", + "parquet": "data/chunk-015/episode_015934.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015934.mp4" + }, + { + "episode_id": 44471, + "source_index": 44471, + "raw_length": 41, + "instruction": "ALook at the sequence of images, which progresses from left", + "canonical_instruction": "alook at the sequence of images, which progresses from left", + "parquet": "data/chunk-044/episode_044471.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044471.mp4" + }, + { + "episode_id": 6926, + "source_index": 6926, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-006/episode_006926.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006926.mp4" + }, + { + "episode_id": 27162, + "source_index": 27162, + "raw_length": 18, + "instruction": "take lid off pot or pan", + "canonical_instruction": "take lid off pot or pan", + "parquet": "data/chunk-027/episode_027162.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027162.mp4" + }, + { + "episode_id": 52422, + "source_index": 52422, + "raw_length": 35, + "instruction": "take the the silver lid off the pot and put it on the middle left side of the table", + "canonical_instruction": "take the the silver lid off the pot and put it on the middle left side of the table", + "parquet": "data/chunk-052/episode_052422.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052422.mp4" + }, + { + "episode_id": 29139, + "source_index": 29139, + "raw_length": 46, + "instruction": "pick the blue spoon near red spoon and keep it next to the table", + "canonical_instruction": "pick the blue spoon near red spoon and keep it next to the table", + "parquet": "data/chunk-029/episode_029139.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029139.mp4" + }, + { + "episode_id": 12052, + "source_index": 12052, + "raw_length": 33, + "instruction": "move the cloth to the top left", + "canonical_instruction": "move the cloth to the top left", + "parquet": "data/chunk-012/episode_012052.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012052.mp4" + }, + { + "episode_id": 46551, + "source_index": 46551, + "raw_length": 33, + "instruction": "move the silver pot to the right side of the burner", + "canonical_instruction": "move the silver pot to the right side of the burner", + "parquet": "data/chunk-046/episode_046551.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046551.mp4" + }, + { + "episode_id": 52026, + "source_index": 52026, + "raw_length": 32, + "instruction": "moved the white object to the bottom right of the burner", + "canonical_instruction": "moved the white object to the bottom right of the burner", + "parquet": "data/chunk-052/episode_052026.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052026.mp4" + }, + { + "episode_id": 22259, + "source_index": 22259, + "raw_length": 34, + "instruction": "Put the pot on the upper left of the stove.", + "canonical_instruction": "put the pot on the upper left of the stove", + "parquet": "data/chunk-022/episode_022259.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022259.mp4" + }, + { + "episode_id": 25993, + "source_index": 25993, + "raw_length": 18, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-025/episode_025993.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025993.mp4" + }, + { + "episode_id": 23007, + "source_index": 23007, + "raw_length": 21, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-023/episode_023007.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023007.mp4" + }, + { + "episode_id": 26445, + "source_index": 26445, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-026/episode_026445.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026445.mp4" + }, + { + "episode_id": 38797, + "source_index": 38797, + "raw_length": 23, + "instruction": "Move the pepper to the lower right corner of table.", + "canonical_instruction": "move the pepper to the lower right corner of table", + "parquet": "data/chunk-038/episode_038797.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038797.mp4" + }, + { + "episode_id": 50518, + "source_index": 50518, + "raw_length": 32, + "instruction": "Move the pot to the front right edge of the table", + "canonical_instruction": "move the pot to the front right edge of the table", + "parquet": "data/chunk-050/episode_050518.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050518.mp4" + }, + { + "episode_id": 52894, + "source_index": 52894, + "raw_length": 43, + "instruction": "move the cup with ball in the middle of the table", + "canonical_instruction": "move the cup with ball in the middle of the table", + "parquet": "data/chunk-052/episode_052894.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052894.mp4" + }, + { + "episode_id": 6703, + "source_index": 6703, + "raw_length": 21, + "instruction": "put spoon in pot", + "canonical_instruction": "put spoon in pot", + "parquet": "data/chunk-006/episode_006703.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006703.mp4" + }, + { + "episode_id": 50522, + "source_index": 50522, + "raw_length": 35, + "instruction": "put the lid in the silver pot", + "canonical_instruction": "put the lid in the silver pot", + "parquet": "data/chunk-050/episode_050522.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050522.mp4" + }, + { + "episode_id": 9342, + "source_index": 9342, + "raw_length": 36, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-009/episode_009342.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009342.mp4" + }, + { + "episode_id": 43579, + "source_index": 43579, + "raw_length": 34, + "instruction": "Put the blue spoon on the orange cloth", + "canonical_instruction": "put the blue spoon on the orange cloth", + "parquet": "data/chunk-043/episode_043579.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043579.mp4" + }, + { + "episode_id": 26824, + "source_index": 26824, + "raw_length": 37, + "instruction": "nothing", + "canonical_instruction": "nothing", + "parquet": "data/chunk-026/episode_026824.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026824.mp4" + }, + { + "episode_id": 4745, + "source_index": 4745, + "raw_length": 43, + "instruction": "What did the robot arm do", + "canonical_instruction": "what did the robot arm do", + "parquet": "data/chunk-004/episode_004745.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004745.mp4" + }, + { + "episode_id": 10168, + "source_index": 10168, + "raw_length": 28, + "instruction": "put the red spoon on the yellow cloth", + "canonical_instruction": "put the red spoon on the yellow cloth", + "parquet": "data/chunk-010/episode_010168.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010168.mp4" + }, + { + "episode_id": 8526, + "source_index": 8526, + "raw_length": 32, + "instruction": "move the purple cloth to the top of the left burner", + "canonical_instruction": "move the purple cloth to the top of the left burner", + "parquet": "data/chunk-008/episode_008526.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008526.mp4" + }, + { + "episode_id": 24867, + "source_index": 24867, + "raw_length": 39, + "instruction": "fold the cloth from bottom right to the left", + "canonical_instruction": "fold the cloth from bottom right to the left", + "parquet": "data/chunk-024/episode_024867.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024867.mp4" + }, + { + "episode_id": 38325, + "source_index": 38325, + "raw_length": 29, + "instruction": "move the tablecloth to the lower left side of the table", + "canonical_instruction": "move the tablecloth to the lower left side of the table", + "parquet": "data/chunk-038/episode_038325.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038325.mp4" + }, + { + "episode_id": 48580, + "source_index": 48580, + "raw_length": 33, + "instruction": "Place the towel to the left of the can", + "canonical_instruction": "place the towel to the left of the can", + "parquet": "data/chunk-048/episode_048580.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048580.mp4" + }, + { + "episode_id": 38465, + "source_index": 38465, + "raw_length": 29, + "instruction": "fold the cloth from top right to top left", + "canonical_instruction": "fold the cloth from top right to top left", + "parquet": "data/chunk-038/episode_038465.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038465.mp4" + }, + { + "episode_id": 38217, + "source_index": 38217, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-038/episode_038217.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038217.mp4" + }, + { + "episode_id": 23977, + "source_index": 23977, + "raw_length": 46, + "instruction": "Covers the red figure with the cloth from bottom left to right", + "canonical_instruction": "covers the red figure with the cloth from bottom left to right", + "parquet": "data/chunk-023/episode_023977.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023977.mp4" + }, + { + "episode_id": 50022, + "source_index": 50022, + "raw_length": 21, + "instruction": "close brown1fbox flap", + "canonical_instruction": "close brown1fbox flap", + "parquet": "data/chunk-050/episode_050022.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050022.mp4" + }, + { + "episode_id": 47219, + "source_index": 47219, + "raw_length": 21, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-047/episode_047219.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047219.mp4" + }, + { + "episode_id": 3772, + "source_index": 3772, + "raw_length": 46, + "instruction": "take the white object from the blue cloth and put it on the right side burner", + "canonical_instruction": "take the white object from the blue cloth and put it on the right side burner", + "parquet": "data/chunk-003/episode_003772.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003772.mp4" + }, + { + "episode_id": 21299, + "source_index": 21299, + "raw_length": 27, + "instruction": "move the strawberry out from the silver pot and put it on the bottom right corner of the stove", + "canonical_instruction": "move the strawberry out from the silver pot and put it on the bottom right corner of the stove", + "parquet": "data/chunk-021/episode_021299.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021299.mp4" + }, + { + "episode_id": 19350, + "source_index": 19350, + "raw_length": 27, + "instruction": "pick up red srewdriver", + "canonical_instruction": "pick up red srewdriver", + "parquet": "data/chunk-019/episode_019350.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019350.mp4" + }, + { + "episode_id": 37749, + "source_index": 37749, + "raw_length": 33, + "instruction": "put corn in bowl sink", + "canonical_instruction": "put corn in bowl sink", + "parquet": "data/chunk-037/episode_037749.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037749.mp4" + }, + { + "episode_id": 41690, + "source_index": 41690, + "raw_length": 39, + "instruction": "move the silver pot to the top right of the table", + "canonical_instruction": "move the silver pot to the top right of the table", + "parquet": "data/chunk-041/episode_041690.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041690.mp4" + }, + { + "episode_id": 1991, + "source_index": 1991, + "raw_length": 35, + "instruction": "Picked up the silver pot and placed it on the lower left side of the stove", + "canonical_instruction": "picked up the silver pot and placed it on the lower left side of the stove", + "parquet": "data/chunk-001/episode_001991.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001991.mp4" + }, + { + "episode_id": 43926, + "source_index": 43926, + "raw_length": 22, + "instruction": "picked up the lid and placed it on the silver pot", + "canonical_instruction": "picked up the lid and placed it on the silver pot", + "parquet": "data/chunk-043/episode_043926.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043926.mp4" + }, + { + "episode_id": 25012, + "source_index": 25012, + "raw_length": 20, + "instruction": "pick up glue and put into drawer", + "canonical_instruction": "pick up glue and put into drawer", + "parquet": "data/chunk-025/episode_025012.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025012.mp4" + }, + { + "episode_id": 11971, + "source_index": 11971, + "raw_length": 43, + "instruction": "put the red triangle on top of the plus", + "canonical_instruction": "put the red triangle on top of the plus", + "parquet": "data/chunk-011/episode_011971.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011971.mp4" + }, + { + "episode_id": 3134, + "source_index": 3134, + "raw_length": 40, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-003/episode_003134.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003134.mp4" + }, + { + "episode_id": 33763, + "source_index": 33763, + "raw_length": 38, + "instruction": "take the red object out of the pot and put it on the left burner", + "canonical_instruction": "take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-033/episode_033763.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033763.mp4" + }, + { + "episode_id": 8153, + "source_index": 8153, + "raw_length": 29, + "instruction": "moved the fork to the upper part of the table", + "canonical_instruction": "moved the fork to the upper part of the table", + "parquet": "data/chunk-008/episode_008153.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008153.mp4" + }, + { + "episode_id": 27676, + "source_index": 27676, + "raw_length": 25, + "instruction": "put corn into bowl", + "canonical_instruction": "put corn into bowl", + "parquet": "data/chunk-027/episode_027676.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027676.mp4" + }, + { + "episode_id": 49656, + "source_index": 49656, + "raw_length": 17, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-049/episode_049656.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049656.mp4" + }, + { + "episode_id": 23397, + "source_index": 23397, + "raw_length": 34, + "instruction": "take spatula off plate sink", + "canonical_instruction": "take spatula off plate sink", + "parquet": "data/chunk-023/episode_023397.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023397.mp4" + }, + { + "episode_id": 39093, + "source_index": 39093, + "raw_length": 46, + "instruction": "put the brown roller on top the cube", + "canonical_instruction": "put the brown roller on top the cube", + "parquet": "data/chunk-039/episode_039093.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039093.mp4" + }, + { + "episode_id": 21286, + "source_index": 21286, + "raw_length": 26, + "instruction": "move the orange cloth to the left side of the wooden board", + "canonical_instruction": "move the orange cloth to the left side of the wooden board", + "parquet": "data/chunk-021/episode_021286.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021286.mp4" + }, + { + "episode_id": 12183, + "source_index": 12183, + "raw_length": 31, + "instruction": "topple hot sauce bottle cardboard fence", + "canonical_instruction": "topple hot sauce bottle cardboard fence", + "parquet": "data/chunk-012/episode_012183.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012183.mp4" + }, + { + "episode_id": 12641, + "source_index": 12641, + "raw_length": 26, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-012/episode_012641.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012641.mp4" + }, + { + "episode_id": 43762, + "source_index": 43762, + "raw_length": 44, + "instruction": "PICK UP THE SPOON ANDPUT ON THE TOWEL", + "canonical_instruction": "pick up the spoon andput on the towel", + "parquet": "data/chunk-043/episode_043762.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043762.mp4" + }, + { + "episode_id": 50384, + "source_index": 50384, + "raw_length": 42, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-050/episode_050384.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050384.mp4" + }, + { + "episode_id": 16330, + "source_index": 16330, + "raw_length": 26, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-016/episode_016330.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016330.mp4" + }, + { + "episode_id": 26347, + "source_index": 26347, + "raw_length": 25, + "instruction": "fold cloth from top right to bottom left", + "canonical_instruction": "fold cloth from top right to bottom left", + "parquet": "data/chunk-026/episode_026347.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026347.mp4" + }, + { + "episode_id": 15583, + "source_index": 15583, + "raw_length": 32, + "instruction": "move the broccoli left side edge of the left burner", + "canonical_instruction": "move the broccoli left side edge of the left burner", + "parquet": "data/chunk-015/episode_015583.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015583.mp4" + }, + { + "episode_id": 15763, + "source_index": 15763, + "raw_length": 46, + "instruction": "Place the red fork right of the metal pot.", + "canonical_instruction": "place the red fork right of the metal pot", + "parquet": "data/chunk-015/episode_015763.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015763.mp4" + }, + { + "episode_id": 25364, + "source_index": 25364, + "raw_length": 45, + "instruction": "Move the dish towels straight to the front of the counter", + "canonical_instruction": "move the dish towels straight to the front of the counter", + "parquet": "data/chunk-025/episode_025364.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025364.mp4" + }, + { + "episode_id": 1398, + "source_index": 1398, + "raw_length": 20, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-001/episode_001398.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001398.mp4" + }, + { + "episode_id": 17736, + "source_index": 17736, + "raw_length": 39, + "instruction": "picks a brown object and places it inside a drawer", + "canonical_instruction": "picks a brown object and places it inside a drawer", + "parquet": "data/chunk-017/episode_017736.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017736.mp4" + }, + { + "episode_id": 48533, + "source_index": 48533, + "raw_length": 43, + "instruction": "Move the silver pot to the bottom left of the table", + "canonical_instruction": "move the silver pot to the bottom left of the table", + "parquet": "data/chunk-048/episode_048533.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048533.mp4" + }, + { + "episode_id": 3583, + "source_index": 3583, + "raw_length": 21, + "instruction": "Move purple cloth to middle top of table", + "canonical_instruction": "move purple cloth to middle top of table", + "parquet": "data/chunk-003/episode_003583.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003583.mp4" + }, + { + "episode_id": 20560, + "source_index": 20560, + "raw_length": 46, + "instruction": "Put the fork on the left side of the pot", + "canonical_instruction": "put the fork on the left side of the pot", + "parquet": "data/chunk-020/episode_020560.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020560.mp4" + }, + { + "episode_id": 14330, + "source_index": 14330, + "raw_length": 21, + "instruction": "turn faucet front to left", + "canonical_instruction": "turn faucet front to left", + "parquet": "data/chunk-014/episode_014330.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014330.mp4" + }, + { + "episode_id": 45400, + "source_index": 45400, + "raw_length": 21, + "instruction": "open book", + "canonical_instruction": "open book", + "parquet": "data/chunk-045/episode_045400.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045400.mp4" + }, + { + "episode_id": 5478, + "source_index": 5478, + "raw_length": 35, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-005/episode_005478.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005478.mp4" + }, + { + "episode_id": 43315, + "source_index": 43315, + "raw_length": 40, + "instruction": "move the brown towel from the washer to the white bucket", + "canonical_instruction": "move the brown towel from the washer to the white bucket", + "parquet": "data/chunk-043/episode_043315.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043315.mp4" + }, + { + "episode_id": 32333, + "source_index": 32333, + "raw_length": 40, + "instruction": "put the object with a hole on top of the cylindre", + "canonical_instruction": "put the object with a hole on top of the cylindre", + "parquet": "data/chunk-032/episode_032333.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032333.mp4" + }, + { + "episode_id": 13603, + "source_index": 13603, + "raw_length": 21, + "instruction": "move the tin to the top left side of the table", + "canonical_instruction": "move the tin to the top left side of the table", + "parquet": "data/chunk-013/episode_013603.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013603.mp4" + }, + { + "episode_id": 14236, + "source_index": 14236, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-014/episode_014236.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014236.mp4" + }, + { + "episode_id": 13223, + "source_index": 13223, + "raw_length": 28, + "instruction": "mamalona lamba", + "canonical_instruction": "mamalona lamba", + "parquet": "data/chunk-013/episode_013223.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013223.mp4" + }, + { + "episode_id": 36794, + "source_index": 36794, + "raw_length": 33, + "instruction": "take the silver pot lid from bottom right of the wooden table and placed it on the silver pot", + "canonical_instruction": "take the silver pot lid from bottom right of the wooden table and placed it on the silver pot", + "parquet": "data/chunk-036/episode_036794.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036794.mp4" + }, + { + "episode_id": 35016, + "source_index": 35016, + "raw_length": 26, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-035/episode_035016.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035016.mp4" + }, + { + "episode_id": 16032, + "source_index": 16032, + "raw_length": 46, + "instruction": "moves a white object along the table", + "canonical_instruction": "moves a white object along the table", + "parquet": "data/chunk-016/episode_016032.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016032.mp4" + }, + { + "episode_id": 9176, + "source_index": 9176, + "raw_length": 43, + "instruction": "Pick up the pot and place it in front of the blue cloth", + "canonical_instruction": "pick up the pot and place it in front of the blue cloth", + "parquet": "data/chunk-009/episode_009176.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009176.mp4" + }, + { + "episode_id": 51285, + "source_index": 51285, + "raw_length": 38, + "instruction": "Move the pot to top right of the table.", + "canonical_instruction": "move the pot to top right of the table", + "parquet": "data/chunk-051/episode_051285.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051285.mp4" + }, + { + "episode_id": 30687, + "source_index": 30687, + "raw_length": 32, + "instruction": "put the blue block to the other side", + "canonical_instruction": "put the blue block to the other side", + "parquet": "data/chunk-030/episode_030687.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030687.mp4" + }, + { + "episode_id": 46126, + "source_index": 46126, + "raw_length": 27, + "instruction": "move the object to the upper middle of the table", + "canonical_instruction": "move the object to the upper middle of the table", + "parquet": "data/chunk-046/episode_046126.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046126.mp4" + }, + { + "episode_id": 20978, + "source_index": 20978, + "raw_length": 35, + "instruction": "move bigger can to the lower right of the smaller can", + "canonical_instruction": "move bigger can to the lower right of the smaller can", + "parquet": "data/chunk-020/episode_020978.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020978.mp4" + }, + { + "episode_id": 52840, + "source_index": 52840, + "raw_length": 46, + "instruction": "unfold the cloth from the left to the right", + "canonical_instruction": "unfold the cloth from the left to the right", + "parquet": "data/chunk-052/episode_052840.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052840.mp4" + }, + { + "episode_id": 5081, + "source_index": 5081, + "raw_length": 94, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-005/episode_005081.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005081.mp4" + }, + { + "episode_id": 37118, + "source_index": 37118, + "raw_length": 36, + "instruction": "Move the red arch to the left side of the table", + "canonical_instruction": "move the red arch to the left side of the table", + "parquet": "data/chunk-037/episode_037118.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037118.mp4" + }, + { + "episode_id": 22498, + "source_index": 22498, + "raw_length": 33, + "instruction": "put cucumber in cup", + "canonical_instruction": "put cucumber in cup", + "parquet": "data/chunk-022/episode_022498.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022498.mp4" + }, + { + "episode_id": 41772, + "source_index": 41772, + "raw_length": 29, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-041/episode_041772.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041772.mp4" + }, + { + "episode_id": 41680, + "source_index": 41680, + "raw_length": 26, + "instruction": "move the silver saucepan to the bottom of the blue cloth", + "canonical_instruction": "move the silver saucepan to the bottom of the blue cloth", + "parquet": "data/chunk-041/episode_041680.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041680.mp4" + }, + { + "episode_id": 45903, + "source_index": 45903, + "raw_length": 29, + "instruction": "Place the pan on the far right edge of the stove", + "canonical_instruction": "place the pan on the far right edge of the stove", + "parquet": "data/chunk-045/episode_045903.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045903.mp4" + }, + { + "episode_id": 44496, + "source_index": 44496, + "raw_length": 17, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-044/episode_044496.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044496.mp4" + }, + { + "episode_id": 43858, + "source_index": 43858, + "raw_length": 35, + "instruction": "Pick up the knife and place it on the left of the croissant", + "canonical_instruction": "pick up the knife and place it on the left of the croissant", + "parquet": "data/chunk-043/episode_043858.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043858.mp4" + }, + { + "episode_id": 2528, + "source_index": 2528, + "raw_length": 30, + "instruction": "take something blue on the cloth to come outside", + "canonical_instruction": "take something blue on the cloth to come outside", + "parquet": "data/chunk-002/episode_002528.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002528.mp4" + }, + { + "episode_id": 36447, + "source_index": 36447, + "raw_length": 35, + "instruction": ": take the red object out of the pot and put it on the left burner", + "canonical_instruction": ": take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-036/episode_036447.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036447.mp4" + }, + { + "episode_id": 6418, + "source_index": 6418, + "raw_length": 33, + "instruction": "Pick up the bottle from the pot and put it on the table", + "canonical_instruction": "pick up the bottle from the pot and put it on the table", + "parquet": "data/chunk-006/episode_006418.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006418.mp4" + }, + { + "episode_id": 5930, + "source_index": 5930, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-005/episode_005930.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005930.mp4" + }, + { + "episode_id": 24712, + "source_index": 24712, + "raw_length": 46, + "instruction": "put the cylinder on top the block", + "canonical_instruction": "put the cylinder on top the block", + "parquet": "data/chunk-024/episode_024712.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024712.mp4" + }, + { + "episode_id": 17053, + "source_index": 17053, + "raw_length": 25, + "instruction": "put lemon on plate", + "canonical_instruction": "put lemon on plate", + "parquet": "data/chunk-017/episode_017053.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017053.mp4" + }, + { + "episode_id": 32187, + "source_index": 32187, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-032/episode_032187.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032187.mp4" + }, + { + "episode_id": 27158, + "source_index": 27158, + "raw_length": 29, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-027/episode_027158.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027158.mp4" + }, + { + "episode_id": 26149, + "source_index": 26149, + "raw_length": 36, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-026/episode_026149.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026149.mp4" + }, + { + "episode_id": 48188, + "source_index": 48188, + "raw_length": 34, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-048/episode_048188.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048188.mp4" + }, + { + "episode_id": 14344, + "source_index": 14344, + "raw_length": 46, + "instruction": "Place the red fork to the left of the silver pot.", + "canonical_instruction": "place the red fork to the left of the silver pot", + "parquet": "data/chunk-014/episode_014344.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014344.mp4" + }, + { + "episode_id": 10558, + "source_index": 10558, + "raw_length": 31, + "instruction": "there is no change in the image", + "canonical_instruction": "there is no change in the image", + "parquet": "data/chunk-010/episode_010558.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010558.mp4" + }, + { + "episode_id": 48563, + "source_index": 48563, + "raw_length": 19, + "instruction": "put green squash into pot or pan", + "canonical_instruction": "put green squash into pot or pan", + "parquet": "data/chunk-048/episode_048563.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048563.mp4" + }, + { + "episode_id": 22020, + "source_index": 22020, + "raw_length": 46, + "instruction": "put the red cube on top of the block", + "canonical_instruction": "put the red cube on top of the block", + "parquet": "data/chunk-022/episode_022020.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022020.mp4" + }, + { + "episode_id": 13886, + "source_index": 13886, + "raw_length": 27, + "instruction": "pick the yellow brush from the green cloth's top and put it on the left side of the cloth", + "canonical_instruction": "pick the yellow brush from the green cloth's top and put it on the left side of the cloth", + "parquet": "data/chunk-013/episode_013886.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013886.mp4" + }, + { + "episode_id": 2045, + "source_index": 2045, + "raw_length": 24, + "instruction": "moved the orange cloth from the top right corner of the stove to the bottom right corner of the stove", + "canonical_instruction": "moved the orange cloth from the top right corner of the stove to the bottom right corner of the stove", + "parquet": "data/chunk-002/episode_002045.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002045.mp4" + }, + { + "episode_id": 39383, + "source_index": 39383, + "raw_length": 31, + "instruction": "Pick up the red fruit and place it in the pot", + "canonical_instruction": "pick up the red fruit and place it in the pot", + "parquet": "data/chunk-039/episode_039383.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039383.mp4" + }, + { + "episode_id": 40305, + "source_index": 40305, + "raw_length": 24, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-040/episode_040305.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040305.mp4" + }, + { + "episode_id": 18585, + "source_index": 18585, + "raw_length": 46, + "instruction": "Video frames not showing.", + "canonical_instruction": "video frames not showing", + "parquet": "data/chunk-018/episode_018585.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018585.mp4" + }, + { + "episode_id": 49181, + "source_index": 49181, + "raw_length": 19, + "instruction": "moved the yellow thing to the left of the table", + "canonical_instruction": "moved the yellow thing to the left of the table", + "parquet": "data/chunk-049/episode_049181.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049181.mp4" + }, + { + "episode_id": 14568, + "source_index": 14568, + "raw_length": 31, + "instruction": "moving the saucepan from the orange cloth to the center of the table", + "canonical_instruction": "moving the saucepan from the orange cloth to the center of the table", + "parquet": "data/chunk-014/episode_014568.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014568.mp4" + }, + { + "episode_id": 33796, + "source_index": 33796, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-033/episode_033796.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033796.mp4" + }, + { + "episode_id": 44030, + "source_index": 44030, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-044/episode_044030.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044030.mp4" + }, + { + "episode_id": 9250, + "source_index": 9250, + "raw_length": 38, + "instruction": "grab the orange towel that is on the left burner and place on the lower left side of the stove", + "canonical_instruction": "grab the orange towel that is on the left burner and place on the lower left side of the stove", + "parquet": "data/chunk-009/episode_009250.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009250.mp4" + }, + { + "episode_id": 33263, + "source_index": 33263, + "raw_length": 37, + "instruction": "Move the orange cloth to the bottom of right burner.", + "canonical_instruction": "move the orange cloth to the bottom of right burner", + "parquet": "data/chunk-033/episode_033263.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033263.mp4" + }, + { + "episode_id": 39246, + "source_index": 39246, + "raw_length": 31, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-039/episode_039246.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039246.mp4" + }, + { + "episode_id": 46928, + "source_index": 46928, + "raw_length": 18, + "instruction": "push the can to the top middle of the table", + "canonical_instruction": "push the can to the top middle of the table", + "parquet": "data/chunk-046/episode_046928.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046928.mp4" + }, + { + "episode_id": 29349, + "source_index": 29349, + "raw_length": 28, + "instruction": "Move the blue towel in front of the cans", + "canonical_instruction": "move the blue towel in front of the cans", + "parquet": "data/chunk-029/episode_029349.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029349.mp4" + }, + { + "episode_id": 48774, + "source_index": 48774, + "raw_length": 42, + "instruction": "put the green object inside the drawer", + "canonical_instruction": "put the green object inside the drawer", + "parquet": "data/chunk-048/episode_048774.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048774.mp4" + }, + { + "episode_id": 5654, + "source_index": 5654, + "raw_length": 37, + "instruction": "Put the bottle in the pot", + "canonical_instruction": "put the bottle in the pot", + "parquet": "data/chunk-005/episode_005654.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005654.mp4" + }, + { + "episode_id": 14084, + "source_index": 14084, + "raw_length": 43, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-014/episode_014084.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014084.mp4" + }, + { + "episode_id": 671, + "source_index": 671, + "raw_length": 29, + "instruction": "move the yellow knife to the bottom middle part of the stove", + "canonical_instruction": "move the yellow knife to the bottom middle part of the stove", + "parquet": "data/chunk-000/episode_000671.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000671.mp4" + }, + { + "episode_id": 16129, + "source_index": 16129, + "raw_length": 25, + "instruction": "took the pot lid and put it on the left side of the table", + "canonical_instruction": "took the pot lid and put it on the left side of the table", + "parquet": "data/chunk-016/episode_016129.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016129.mp4" + }, + { + "episode_id": 30754, + "source_index": 30754, + "raw_length": 33, + "instruction": "put the orange cloth on top of the blue cloth", + "canonical_instruction": "put the orange cloth on top of the blue cloth", + "parquet": "data/chunk-030/episode_030754.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030754.mp4" + }, + { + "episode_id": 22885, + "source_index": 22885, + "raw_length": 20, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-022/episode_022885.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022885.mp4" + }, + { + "episode_id": 21780, + "source_index": 21780, + "raw_length": 32, + "instruction": "open cabinet", + "canonical_instruction": "open cabinet", + "parquet": "data/chunk-021/episode_021780.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021780.mp4" + }, + { + "episode_id": 49031, + "source_index": 49031, + "raw_length": 21, + "instruction": "put pan from drying rack into sink", + "canonical_instruction": "put pan from drying rack into sink", + "parquet": "data/chunk-049/episode_049031.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049031.mp4" + }, + { + "episode_id": 13132, + "source_index": 13132, + "raw_length": 29, + "instruction": "moved the green napkin to the right side of the table", + "canonical_instruction": "moved the green napkin to the right side of the table", + "parquet": "data/chunk-013/episode_013132.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013132.mp4" + }, + { + "episode_id": 14503, + "source_index": 14503, + "raw_length": 46, + "instruction": "put red cuboid on top of white cylinder", + "canonical_instruction": "put red cuboid on top of white cylinder", + "parquet": "data/chunk-014/episode_014503.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014503.mp4" + }, + { + "episode_id": 46381, + "source_index": 46381, + "raw_length": 21, + "instruction": "put green squash in pot or pan", + "canonical_instruction": "put green squash in pot or pan", + "parquet": "data/chunk-046/episode_046381.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046381.mp4" + }, + { + "episode_id": 46264, + "source_index": 46264, + "raw_length": 30, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-046/episode_046264.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046264.mp4" + }, + { + "episode_id": 31486, + "source_index": 31486, + "raw_length": 21, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-031/episode_031486.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031486.mp4" + }, + { + "episode_id": 31498, + "source_index": 31498, + "raw_length": 33, + "instruction": "Move green cloth to the right", + "canonical_instruction": "move green cloth to the right", + "parquet": "data/chunk-031/episode_031498.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031498.mp4" + }, + { + "episode_id": 26026, + "source_index": 26026, + "raw_length": 39, + "instruction": "Move the figure to the top edge of the cloth", + "canonical_instruction": "move the figure to the top edge of the cloth", + "parquet": "data/chunk-026/episode_026026.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026026.mp4" + }, + { + "episode_id": 24127, + "source_index": 24127, + "raw_length": 26, + "instruction": "pick up sponge and wipe plate", + "canonical_instruction": "pick up sponge and wipe plate", + "parquet": "data/chunk-024/episode_024127.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024127.mp4" + }, + { + "episode_id": 15895, + "source_index": 15895, + "raw_length": 56, + "instruction": "put the orange object in the pot", + "canonical_instruction": "put the orange object in the pot", + "parquet": "data/chunk-015/episode_015895.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015895.mp4" + }, + { + "episode_id": 2550, + "source_index": 2550, + "raw_length": 30, + "instruction": "picked a red spoon and placed it on top of an orange cloth", + "canonical_instruction": "picked a red spoon and placed it on top of an orange cloth", + "parquet": "data/chunk-002/episode_002550.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002550.mp4" + }, + { + "episode_id": 29760, + "source_index": 29760, + "raw_length": 21, + "instruction": "zip zipper bag", + "canonical_instruction": "zip zipper bag", + "parquet": "data/chunk-029/episode_029760.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029760.mp4" + }, + { + "episode_id": 31490, + "source_index": 31490, + "raw_length": 47, + "instruction": "put stuffedpig in pan", + "canonical_instruction": "put stuffedpig in pan", + "parquet": "data/chunk-031/episode_031490.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031490.mp4" + }, + { + "episode_id": 24129, + "source_index": 24129, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-024/episode_024129.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024129.mp4" + }, + { + "episode_id": 20948, + "source_index": 20948, + "raw_length": 21, + "instruction": "close large4fbox flaps", + "canonical_instruction": "close large4fbox flaps", + "parquet": "data/chunk-020/episode_020948.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020948.mp4" + }, + { + "episode_id": 6901, + "source_index": 6901, + "raw_length": 39, + "instruction": "Place the pan on the far edge near the green cloth", + "canonical_instruction": "place the pan on the far edge near the green cloth", + "parquet": "data/chunk-006/episode_006901.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006901.mp4" + }, + { + "episode_id": 41973, + "source_index": 41973, + "raw_length": 43, + "instruction": "move the red hexagon from the top of a block and put it on the table", + "canonical_instruction": "move the red hexagon from the top of a block and put it on the table", + "parquet": "data/chunk-041/episode_041973.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041973.mp4" + }, + { + "episode_id": 23866, + "source_index": 23866, + "raw_length": 21, + "instruction": "take bowl off plate", + "canonical_instruction": "take bowl off plate", + "parquet": "data/chunk-023/episode_023866.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023866.mp4" + }, + { + "episode_id": 32800, + "source_index": 32800, + "raw_length": 46, + "instruction": "Move the blue sieve to the right side of the cooker", + "canonical_instruction": "move the blue sieve to the right side of the cooker", + "parquet": "data/chunk-032/episode_032800.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032800.mp4" + }, + { + "episode_id": 48269, + "source_index": 48269, + "raw_length": 36, + "instruction": "put clothes in laundry machine", + "canonical_instruction": "put clothes in laundry machine", + "parquet": "data/chunk-048/episode_048269.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048269.mp4" + }, + { + "episode_id": 35480, + "source_index": 35480, + "raw_length": 35, + "instruction": "moved blue cloth to the center of the table", + "canonical_instruction": "moved blue cloth to the center of the table", + "parquet": "data/chunk-035/episode_035480.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035480.mp4" + }, + { + "episode_id": 3285, + "source_index": 3285, + "raw_length": 35, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-003/episode_003285.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003285.mp4" + }, + { + "episode_id": 51384, + "source_index": 51384, + "raw_length": 33, + "instruction": "move the sliver pot to the upper left corner of the table", + "canonical_instruction": "move the sliver pot to the upper left corner of the table", + "parquet": "data/chunk-051/episode_051384.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051384.mp4" + }, + { + "episode_id": 18599, + "source_index": 18599, + "raw_length": 46, + "instruction": "move red to just above blue spoon", + "canonical_instruction": "move red to just above blue spoon", + "parquet": "data/chunk-018/episode_018599.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018599.mp4" + }, + { + "episode_id": 25517, + "source_index": 25517, + "raw_length": 30, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-025/episode_025517.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025517.mp4" + }, + { + "episode_id": 19129, + "source_index": 19129, + "raw_length": 26, + "instruction": "place the banana on top of the bottom right burner", + "canonical_instruction": "place the banana on top of the bottom right burner", + "parquet": "data/chunk-019/episode_019129.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019129.mp4" + }, + { + "episode_id": 50658, + "source_index": 50658, + "raw_length": 35, + "instruction": "take out the sushi out of the drawer and put it in the middle of the table", + "canonical_instruction": "take out the sushi out of the drawer and put it in the middle of the table", + "parquet": "data/chunk-050/episode_050658.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050658.mp4" + }, + { + "episode_id": 21307, + "source_index": 21307, + "raw_length": 26, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-021/episode_021307.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021307.mp4" + }, + { + "episode_id": 6772, + "source_index": 6772, + "raw_length": 27, + "instruction": "Move the silver pot from the top left to the bottom left burner", + "canonical_instruction": "move the silver pot from the top left to the bottom left burner", + "parquet": "data/chunk-006/episode_006772.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006772.mp4" + }, + { + "episode_id": 10618, + "source_index": 10618, + "raw_length": 35, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-010/episode_010618.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010618.mp4" + }, + { + "episode_id": 51176, + "source_index": 51176, + "raw_length": 29, + "instruction": "open cabinet", + "canonical_instruction": "open cabinet", + "parquet": "data/chunk-051/episode_051176.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051176.mp4" + }, + { + "episode_id": 7633, + "source_index": 7633, + "raw_length": 43, + "instruction": "put the pot to the right corner of the table", + "canonical_instruction": "put the pot to the right corner of the table", + "parquet": "data/chunk-007/episode_007633.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007633.mp4" + }, + { + "episode_id": 19147, + "source_index": 19147, + "raw_length": 36, + "instruction": "Place the yellow cloth upper middle side of the table", + "canonical_instruction": "place the yellow cloth upper middle side of the table", + "parquet": "data/chunk-019/episode_019147.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019147.mp4" + }, + { + "episode_id": 5896, + "source_index": 5896, + "raw_length": 27, + "instruction": "move the silver pot to the bottom left burner", + "canonical_instruction": "move the silver pot to the bottom left burner", + "parquet": "data/chunk-005/episode_005896.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005896.mp4" + }, + { + "episode_id": 12340, + "source_index": 12340, + "raw_length": 23, + "instruction": "move the cloth to left side on the table", + "canonical_instruction": "move the cloth to left side on the table", + "parquet": "data/chunk-012/episode_012340.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012340.mp4" + }, + { + "episode_id": 33280, + "source_index": 33280, + "raw_length": 28, + "instruction": "move the yelow object from the bottom right side to the bottom left side of the burner", + "canonical_instruction": "move the yelow object from the bottom right side to the bottom left side of the burner", + "parquet": "data/chunk-033/episode_033280.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033280.mp4" + }, + { + "episode_id": 50014, + "source_index": 50014, + "raw_length": 38, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-050/episode_050014.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050014.mp4" + }, + { + "episode_id": 16808, + "source_index": 16808, + "raw_length": 26, + "instruction": "put fork from basket to tray", + "canonical_instruction": "put fork from basket to tray", + "parquet": "data/chunk-016/episode_016808.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016808.mp4" + }, + { + "episode_id": 33523, + "source_index": 33523, + "raw_length": 29, + "instruction": "moved the silver pan to the right side of the lid", + "canonical_instruction": "moved the silver pan to the right side of the lid", + "parquet": "data/chunk-033/episode_033523.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033523.mp4" + }, + { + "episode_id": 1736, + "source_index": 1736, + "raw_length": 43, + "instruction": "Place the cauliflower on the far edge of the table", + "canonical_instruction": "place the cauliflower on the far edge of the table", + "parquet": "data/chunk-001/episode_001736.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001736.mp4" + }, + { + "episode_id": 13917, + "source_index": 13917, + "raw_length": 29, + "instruction": "Move the green beam to the center of the yellow beam and the blue beam", + "canonical_instruction": "move the green beam to the center of the yellow beam and the blue beam", + "parquet": "data/chunk-013/episode_013917.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013917.mp4" + }, + { + "episode_id": 26837, + "source_index": 26837, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-026/episode_026837.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026837.mp4" + }, + { + "episode_id": 12198, + "source_index": 12198, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-012/episode_012198.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012198.mp4" + }, + { + "episode_id": 24229, + "source_index": 24229, + "raw_length": 19, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-024/episode_024229.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024229.mp4" + }, + { + "episode_id": 6346, + "source_index": 6346, + "raw_length": 46, + "instruction": "Pick up the blue spoon and place it on the green cloth", + "canonical_instruction": "pick up the blue spoon and place it on the green cloth", + "parquet": "data/chunk-006/episode_006346.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006346.mp4" + }, + { + "episode_id": 47999, + "source_index": 47999, + "raw_length": 29, + "instruction": "Take the green hand towel out of the basket and put it on the right side of the table.", + "canonical_instruction": "take the green hand towel out of the basket and put it on the right side of the table", + "parquet": "data/chunk-047/episode_047999.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047999.mp4" + }, + { + "episode_id": 14806, + "source_index": 14806, + "raw_length": 28, + "instruction": "placed the silver lid on the silver pot", + "canonical_instruction": "placed the silver lid on the silver pot", + "parquet": "data/chunk-014/episode_014806.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014806.mp4" + }, + { + "episode_id": 48948, + "source_index": 48948, + "raw_length": 46, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-048/episode_048948.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048948.mp4" + }, + { + "episode_id": 17670, + "source_index": 17670, + "raw_length": 29, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-017/episode_017670.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017670.mp4" + }, + { + "episode_id": 18001, + "source_index": 18001, + "raw_length": 36, + "instruction": "put the purple cloth in to the washing machine", + "canonical_instruction": "put the purple cloth in to the washing machine", + "parquet": "data/chunk-018/episode_018001.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018001.mp4" + }, + { + "episode_id": 29276, + "source_index": 29276, + "raw_length": 32, + "instruction": "moved the red object to the left side of the cooker", + "canonical_instruction": "moved the red object to the left side of the cooker", + "parquet": "data/chunk-029/episode_029276.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029276.mp4" + }, + { + "episode_id": 4763, + "source_index": 4763, + "raw_length": 31, + "instruction": "moved the silver fork to the left side of the table", + "canonical_instruction": "moved the silver fork to the left side of the table", + "parquet": "data/chunk-004/episode_004763.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004763.mp4" + }, + { + "episode_id": 51486, + "source_index": 51486, + "raw_length": 19, + "instruction": "Set the blue cloth in front of the microwave.", + "canonical_instruction": "set the blue cloth in front of the microwave", + "parquet": "data/chunk-051/episode_051486.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051486.mp4" + }, + { + "episode_id": 2427, + "source_index": 2427, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-002/episode_002427.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002427.mp4" + }, + { + "episode_id": 51367, + "source_index": 51367, + "raw_length": 32, + "instruction": "move the green cloth to the left side of the table", + "canonical_instruction": "move the green cloth to the left side of the table", + "parquet": "data/chunk-051/episode_051367.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051367.mp4" + }, + { + "episode_id": 44430, + "source_index": 44430, + "raw_length": 17, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-044/episode_044430.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044430.mp4" + }, + { + "episode_id": 48917, + "source_index": 48917, + "raw_length": 25, + "instruction": "fold the cloth from bottom to top", + "canonical_instruction": "fold the cloth from bottom to top", + "parquet": "data/chunk-048/episode_048917.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048917.mp4" + }, + { + "episode_id": 50086, + "source_index": 50086, + "raw_length": 26, + "instruction": "Move the cloth to the close edge of the counter.", + "canonical_instruction": "move the cloth to the close edge of the counter", + "parquet": "data/chunk-050/episode_050086.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050086.mp4" + }, + { + "episode_id": 12521, + "source_index": 12521, + "raw_length": 21, + "instruction": "put cup from sink to drying rack", + "canonical_instruction": "put cup from sink to drying rack", + "parquet": "data/chunk-012/episode_012521.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012521.mp4" + }, + { + "episode_id": 16432, + "source_index": 16432, + "raw_length": 32, + "instruction": "place the orange cloth in the middle of the table", + "canonical_instruction": "place the orange cloth in the middle of the table", + "parquet": "data/chunk-016/episode_016432.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016432.mp4" + }, + { + "episode_id": 2816, + "source_index": 2816, + "raw_length": 44, + "instruction": "Put the silver pot on the right burner", + "canonical_instruction": "put the silver pot on the right burner", + "parquet": "data/chunk-002/episode_002816.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002816.mp4" + }, + { + "episode_id": 11276, + "source_index": 11276, + "raw_length": 24, + "instruction": "moved the blue spatula to the left side of the burner", + "canonical_instruction": "moved the blue spatula to the left side of the burner", + "parquet": "data/chunk-011/episode_011276.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011276.mp4" + }, + { + "episode_id": 2184, + "source_index": 2184, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-002/episode_002184.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002184.mp4" + }, + { + "episode_id": 19509, + "source_index": 19509, + "raw_length": 52, + "instruction": "moving the yellow pot onto the right side of the burner", + "canonical_instruction": "moving the yellow pot onto the right side of the burner", + "parquet": "data/chunk-019/episode_019509.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019509.mp4" + }, + { + "episode_id": 33194, + "source_index": 33194, + "raw_length": 37, + "instruction": "fold the fabric from bottom left to top right", + "canonical_instruction": "fold the fabric from bottom left to top right", + "parquet": "data/chunk-033/episode_033194.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033194.mp4" + }, + { + "episode_id": 14844, + "source_index": 14844, + "raw_length": 25, + "instruction": "Move the blue spoon to the front edge of the table.", + "canonical_instruction": "move the blue spoon to the front edge of the table", + "parquet": "data/chunk-014/episode_014844.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014844.mp4" + }, + { + "episode_id": 24139, + "source_index": 24139, + "raw_length": 26, + "instruction": "Moved the blue spatula on the top right side of the table", + "canonical_instruction": "moved the blue spatula on the top right side of the table", + "parquet": "data/chunk-024/episode_024139.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024139.mp4" + }, + { + "episode_id": 6798, + "source_index": 6798, + "raw_length": 37, + "instruction": "closed the drawer", + "canonical_instruction": "closed the drawer", + "parquet": "data/chunk-006/episode_006798.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006798.mp4" + }, + { + "episode_id": 33137, + "source_index": 33137, + "raw_length": 32, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-033/episode_033137.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033137.mp4" + }, + { + "episode_id": 43042, + "source_index": 43042, + "raw_length": 28, + "instruction": "take the silver lid from pot and put on the blue cloth", + "canonical_instruction": "take the silver lid from pot and put on the blue cloth", + "parquet": "data/chunk-043/episode_043042.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043042.mp4" + }, + { + "episode_id": 13567, + "source_index": 13567, + "raw_length": 35, + "instruction": "move blue spoon towards left corner of the table", + "canonical_instruction": "move blue spoon towards left corner of the table", + "parquet": "data/chunk-013/episode_013567.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013567.mp4" + }, + { + "episode_id": 4966, + "source_index": 4966, + "raw_length": 46, + "instruction": "move the silver pot to the upper right of table", + "canonical_instruction": "move the silver pot to the upper right of table", + "parquet": "data/chunk-004/episode_004966.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004966.mp4" + }, + { + "episode_id": 23565, + "source_index": 23565, + "raw_length": 31, + "instruction": "put the green cloth in the washing machine", + "canonical_instruction": "put the green cloth in the washing machine", + "parquet": "data/chunk-023/episode_023565.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023565.mp4" + }, + { + "episode_id": 47836, + "source_index": 47836, + "raw_length": 30, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-047/episode_047836.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047836.mp4" + }, + { + "episode_id": 27805, + "source_index": 27805, + "raw_length": 35, + "instruction": "Put the spoon to the left of the cloth", + "canonical_instruction": "put the spoon to the left of the cloth", + "parquet": "data/chunk-027/episode_027805.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027805.mp4" + }, + { + "episode_id": 1104, + "source_index": 1104, + "raw_length": 34, + "instruction": "Move the yellow and green object to the right of the spoon.", + "canonical_instruction": "move the yellow and green object to the right of the spoon", + "parquet": "data/chunk-001/episode_001104.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001104.mp4" + }, + { + "episode_id": 29149, + "source_index": 29149, + "raw_length": 20, + "instruction": "pick up blue pen and put into drawer", + "canonical_instruction": "pick up blue pen and put into drawer", + "parquet": "data/chunk-029/episode_029149.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029149.mp4" + }, + { + "episode_id": 13720, + "source_index": 13720, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-013/episode_013720.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013720.mp4" + }, + { + "episode_id": 26326, + "source_index": 26326, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-026/episode_026326.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026326.mp4" + }, + { + "episode_id": 24687, + "source_index": 24687, + "raw_length": 21, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-024/episode_024687.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024687.mp4" + }, + { + "episode_id": 40071, + "source_index": 40071, + "raw_length": 28, + "instruction": "Place the lobster to the right of the green cloth.", + "canonical_instruction": "place the lobster to the right of the green cloth", + "parquet": "data/chunk-040/episode_040071.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040071.mp4" + }, + { + "episode_id": 41372, + "source_index": 41372, + "raw_length": 21, + "instruction": "put eggplant on plate", + "canonical_instruction": "put eggplant on plate", + "parquet": "data/chunk-041/episode_041372.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041372.mp4" + }, + { + "episode_id": 23453, + "source_index": 23453, + "raw_length": 48, + "instruction": "move the red pot to the right burner", + "canonical_instruction": "move the red pot to the right burner", + "parquet": "data/chunk-023/episode_023453.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023453.mp4" + }, + { + "episode_id": 33233, + "source_index": 33233, + "raw_length": 20, + "instruction": "put pan from stove to sink", + "canonical_instruction": "put pan from stove to sink", + "parquet": "data/chunk-033/episode_033233.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033233.mp4" + }, + { + "episode_id": 21114, + "source_index": 21114, + "raw_length": 25, + "instruction": "move a green object to the top left of the table", + "canonical_instruction": "move a green object to the top left of the table", + "parquet": "data/chunk-021/episode_021114.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021114.mp4" + }, + { + "episode_id": 49640, + "source_index": 49640, + "raw_length": 28, + "instruction": "unfold the cloth from top left to bottom right", + "canonical_instruction": "unfold the cloth from top left to bottom right", + "parquet": "data/chunk-049/episode_049640.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049640.mp4" + }, + { + "episode_id": 5483, + "source_index": 5483, + "raw_length": 40, + "instruction": "Move the ladle to the left of the potato", + "canonical_instruction": "move the ladle to the left of the potato", + "parquet": "data/chunk-005/episode_005483.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005483.mp4" + }, + { + "episode_id": 5156, + "source_index": 5156, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-005/episode_005156.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005156.mp4" + }, + { + "episode_id": 37569, + "source_index": 37569, + "raw_length": 23, + "instruction": "Slide the towel down to the bottom of counter.", + "canonical_instruction": "slide the towel down to the bottom of counter", + "parquet": "data/chunk-037/episode_037569.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037569.mp4" + }, + { + "episode_id": 36797, + "source_index": 36797, + "raw_length": 36, + "instruction": "Move blue and gray item to the left of the pot.", + "canonical_instruction": "move blue and gray item to the left of the pot", + "parquet": "data/chunk-036/episode_036797.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036797.mp4" + }, + { + "episode_id": 6360, + "source_index": 6360, + "raw_length": 30, + "instruction": "Open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-006/episode_006360.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006360.mp4" + }, + { + "episode_id": 24124, + "source_index": 24124, + "raw_length": 75, + "instruction": "put pickle on plate and cauliflower in pot or pan in sink", + "canonical_instruction": "put pickle on plate and cauliflower in pot or pan in sink", + "parquet": "data/chunk-024/episode_024124.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024124.mp4" + }, + { + "episode_id": 3357, + "source_index": 3357, + "raw_length": 27, + "instruction": "move yellow towel to just left of metal bowl", + "canonical_instruction": "move yellow towel to just left of metal bowl", + "parquet": "data/chunk-003/episode_003357.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003357.mp4" + }, + { + "episode_id": 5475, + "source_index": 5475, + "raw_length": 33, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-005/episode_005475.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005475.mp4" + }, + { + "episode_id": 49190, + "source_index": 49190, + "raw_length": 39, + "instruction": "move the wood brush to the bottom of the right burner", + "canonical_instruction": "move the wood brush to the bottom of the right burner", + "parquet": "data/chunk-049/episode_049190.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049190.mp4" + }, + { + "episode_id": 32115, + "source_index": 32115, + "raw_length": 42, + "instruction": "move the silver basket on the right", + "canonical_instruction": "move the silver basket on the right", + "parquet": "data/chunk-032/episode_032115.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032115.mp4" + }, + { + "episode_id": 438, + "source_index": 438, + "raw_length": 37, + "instruction": "move green rectangle on right of the table", + "canonical_instruction": "move green rectangle on right of the table", + "parquet": "data/chunk-000/episode_000438.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000438.mp4" + }, + { + "episode_id": 19165, + "source_index": 19165, + "raw_length": 22, + "instruction": "moved the pot's lid to the bottom right side of the table", + "canonical_instruction": "moved the pot's lid to the bottom right side of the table", + "parquet": "data/chunk-019/episode_019165.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019165.mp4" + }, + { + "episode_id": 20593, + "source_index": 20593, + "raw_length": 45, + "instruction": "move pot onto towel", + "canonical_instruction": "move pot onto towel", + "parquet": "data/chunk-020/episode_020593.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020593.mp4" + }, + { + "episode_id": 26618, + "source_index": 26618, + "raw_length": 29, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-026/episode_026618.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026618.mp4" + }, + { + "episode_id": 23253, + "source_index": 23253, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-023/episode_023253.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023253.mp4" + }, + { + "episode_id": 53168, + "source_index": 53168, + "raw_length": 30, + "instruction": "moved the corn to the right side of the stove", + "canonical_instruction": "moved the corn to the right side of the stove", + "parquet": "data/chunk-053/episode_053168.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053168.mp4" + }, + { + "episode_id": 52849, + "source_index": 52849, + "raw_length": 43, + "instruction": "Put the mangoes in a pan.", + "canonical_instruction": "put the mangoes in a pan", + "parquet": "data/chunk-052/episode_052849.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052849.mp4" + }, + { + "episode_id": 21332, + "source_index": 21332, + "raw_length": 37, + "instruction": "Put the broccoli on the left side of the spoon.", + "canonical_instruction": "put the broccoli on the left side of the spoon", + "parquet": "data/chunk-021/episode_021332.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021332.mp4" + }, + { + "episode_id": 12126, + "source_index": 12126, + "raw_length": 21, + "instruction": "put potato in pot or pan", + "canonical_instruction": "put potato in pot or pan", + "parquet": "data/chunk-012/episode_012126.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012126.mp4" + }, + { + "episode_id": 37657, + "source_index": 37657, + "raw_length": 25, + "instruction": "move the light blue can to below the microwave", + "canonical_instruction": "move the light blue can to below the microwave", + "parquet": "data/chunk-037/episode_037657.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037657.mp4" + }, + { + "episode_id": 39043, + "source_index": 39043, + "raw_length": 40, + "instruction": "Place the red spoon near the steel pan.", + "canonical_instruction": "place the red spoon near the steel pan", + "parquet": "data/chunk-039/episode_039043.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039043.mp4" + }, + { + "episode_id": 12880, + "source_index": 12880, + "raw_length": 24, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-012/episode_012880.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012880.mp4" + }, + { + "episode_id": 25108, + "source_index": 25108, + "raw_length": 36, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-025/episode_025108.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025108.mp4" + }, + { + "episode_id": 15080, + "source_index": 15080, + "raw_length": 36, + "instruction": "move the silver pot to the top right corner of the burner", + "canonical_instruction": "move the silver pot to the top right corner of the burner", + "parquet": "data/chunk-015/episode_015080.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015080.mp4" + }, + { + "episode_id": 36237, + "source_index": 36237, + "raw_length": 42, + "instruction": "take the red object out of the pot and put it on the left burner", + "canonical_instruction": "take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-036/episode_036237.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036237.mp4" + }, + { + "episode_id": 29846, + "source_index": 29846, + "raw_length": 42, + "instruction": "move vessel from left bottom to top middle of the table", + "canonical_instruction": "move vessel from left bottom to top middle of the table", + "parquet": "data/chunk-029/episode_029846.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029846.mp4" + }, + { + "episode_id": 22575, + "source_index": 22575, + "raw_length": 34, + "instruction": "put the green thing on top of the drawer", + "canonical_instruction": "put the green thing on top of the drawer", + "parquet": "data/chunk-022/episode_022575.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022575.mp4" + }, + { + "episode_id": 35858, + "source_index": 35858, + "raw_length": 35, + "instruction": "moved the basket to the top side of the table", + "canonical_instruction": "moved the basket to the top side of the table", + "parquet": "data/chunk-035/episode_035858.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035858.mp4" + }, + { + "episode_id": 32253, + "source_index": 32253, + "raw_length": 39, + "instruction": "put the cylinder block on top of the arch", + "canonical_instruction": "put the cylinder block on top of the arch", + "parquet": "data/chunk-032/episode_032253.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032253.mp4" + }, + { + "episode_id": 36621, + "source_index": 36621, + "raw_length": 20, + "instruction": "move the green cloth to the middle bottom of the stove.", + "canonical_instruction": "move the green cloth to the middle bottom of the stove", + "parquet": "data/chunk-036/episode_036621.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036621.mp4" + }, + { + "episode_id": 8280, + "source_index": 8280, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-008/episode_008280.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008280.mp4" + }, + { + "episode_id": 19414, + "source_index": 19414, + "raw_length": 45, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-019/episode_019414.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019414.mp4" + }, + { + "episode_id": 20351, + "source_index": 20351, + "raw_length": 41, + "instruction": "take the blue towel and put inside the washing machine", + "canonical_instruction": "take the blue towel and put inside the washing machine", + "parquet": "data/chunk-020/episode_020351.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020351.mp4" + }, + { + "episode_id": 42878, + "source_index": 42878, + "raw_length": 32, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-042/episode_042878.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042878.mp4" + }, + { + "episode_id": 47911, + "source_index": 47911, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-047/episode_047911.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047911.mp4" + }, + { + "episode_id": 6296, + "source_index": 6296, + "raw_length": 32, + "instruction": "fold the cloth from the top right to bottom left", + "canonical_instruction": "fold the cloth from the top right to bottom left", + "parquet": "data/chunk-006/episode_006296.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006296.mp4" + }, + { + "episode_id": 46780, + "source_index": 46780, + "raw_length": 46, + "instruction": "take the red object out from the drawer and put it in front of the drawer", + "canonical_instruction": "take the red object out from the drawer and put it in front of the drawer", + "parquet": "data/chunk-046/episode_046780.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046780.mp4" + }, + { + "episode_id": 21565, + "source_index": 21565, + "raw_length": 46, + "instruction": "Put the sushi roll in the pan.", + "canonical_instruction": "put the sushi roll in the pan", + "parquet": "data/chunk-021/episode_021565.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021565.mp4" + }, + { + "episode_id": 43889, + "source_index": 43889, + "raw_length": 26, + "instruction": "move the can on the top side of the table", + "canonical_instruction": "move the can on the top side of the table", + "parquet": "data/chunk-043/episode_043889.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043889.mp4" + }, + { + "episode_id": 34956, + "source_index": 34956, + "raw_length": 29, + "instruction": "move the yellow stuff from the cloth to the top of the table", + "canonical_instruction": "move the yellow stuff from the cloth to the top of the table", + "parquet": "data/chunk-034/episode_034956.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034956.mp4" + }, + { + "episode_id": 16386, + "source_index": 16386, + "raw_length": 32, + "instruction": "Place the fish in front of the blue brush", + "canonical_instruction": "place the fish in front of the blue brush", + "parquet": "data/chunk-016/episode_016386.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016386.mp4" + }, + { + "episode_id": 35920, + "source_index": 35920, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-035/episode_035920.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035920.mp4" + }, + { + "episode_id": 37327, + "source_index": 37327, + "raw_length": 46, + "instruction": "unfold the cloth from center to top right", + "canonical_instruction": "unfold the cloth from center to top right", + "parquet": "data/chunk-037/episode_037327.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037327.mp4" + }, + { + "episode_id": 23243, + "source_index": 23243, + "raw_length": 24, + "instruction": "Move the pot closer to the edge of the table.", + "canonical_instruction": "move the pot closer to the edge of the table", + "parquet": "data/chunk-023/episode_023243.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023243.mp4" + }, + { + "episode_id": 26189, + "source_index": 26189, + "raw_length": 30, + "instruction": "fold the cloth from top to bottom", + "canonical_instruction": "fold the cloth from top to bottom", + "parquet": "data/chunk-026/episode_026189.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026189.mp4" + }, + { + "episode_id": 11189, + "source_index": 11189, + "raw_length": 26, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-011/episode_011189.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011189.mp4" + }, + { + "episode_id": 17834, + "source_index": 17834, + "raw_length": 28, + "instruction": "Move the pepper straight and up to the middle of the table", + "canonical_instruction": "move the pepper straight and up to the middle of the table", + "parquet": "data/chunk-017/episode_017834.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017834.mp4" + }, + { + "episode_id": 41446, + "source_index": 41446, + "raw_length": 29, + "instruction": "Move the yellow towel directly in front of the cans", + "canonical_instruction": "move the yellow towel directly in front of the cans", + "parquet": "data/chunk-041/episode_041446.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041446.mp4" + }, + { + "episode_id": 46279, + "source_index": 46279, + "raw_length": 26, + "instruction": "Place the orange cloth on the front left corner of the table.", + "canonical_instruction": "place the orange cloth on the front left corner of the table", + "parquet": "data/chunk-046/episode_046279.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046279.mp4" + }, + { + "episode_id": 3170, + "source_index": 3170, + "raw_length": 71, + "instruction": "put pot or pan on stove and put egg in pot or pan", + "canonical_instruction": "put pot or pan on stove and put egg in pot or pan", + "parquet": "data/chunk-003/episode_003170.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003170.mp4" + }, + { + "episode_id": 52329, + "source_index": 52329, + "raw_length": 21, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-052/episode_052329.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052329.mp4" + }, + { + "episode_id": 48123, + "source_index": 48123, + "raw_length": 28, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-048/episode_048123.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048123.mp4" + }, + { + "episode_id": 13519, + "source_index": 13519, + "raw_length": 21, + "instruction": "turn faucet front to right", + "canonical_instruction": "turn faucet front to right", + "parquet": "data/chunk-013/episode_013519.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013519.mp4" + }, + { + "episode_id": 29114, + "source_index": 29114, + "raw_length": 46, + "instruction": "move the silver pot to the upper right of table", + "canonical_instruction": "move the silver pot to the upper right of table", + "parquet": "data/chunk-029/episode_029114.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029114.mp4" + }, + { + "episode_id": 29889, + "source_index": 29889, + "raw_length": 25, + "instruction": "Move the brush and put it in between the burners.", + "canonical_instruction": "move the brush and put it in between the burners", + "parquet": "data/chunk-029/episode_029889.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029889.mp4" + }, + { + "episode_id": 7483, + "source_index": 7483, + "raw_length": 30, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-007/episode_007483.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007483.mp4" + }, + { + "episode_id": 52617, + "source_index": 52617, + "raw_length": 24, + "instruction": "move the cloth to the left of the table", + "canonical_instruction": "move the cloth to the left of the table", + "parquet": "data/chunk-052/episode_052617.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052617.mp4" + }, + { + "episode_id": 15228, + "source_index": 15228, + "raw_length": 46, + "instruction": "push red object with brush to left burner then place brush bottom left of the stove", + "canonical_instruction": "push red object with brush to left burner then place brush bottom left of the stove", + "parquet": "data/chunk-015/episode_015228.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015228.mp4" + }, + { + "episode_id": 27071, + "source_index": 27071, + "raw_length": 30, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-027/episode_027071.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027071.mp4" + }, + { + "episode_id": 15724, + "source_index": 15724, + "raw_length": 21, + "instruction": "turn faucet left", + "canonical_instruction": "turn faucet left", + "parquet": "data/chunk-015/episode_015724.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015724.mp4" + }, + { + "episode_id": 52070, + "source_index": 52070, + "raw_length": 26, + "instruction": "move the purple cloth to upper left side of the table", + "canonical_instruction": "move the purple cloth to upper left side of the table", + "parquet": "data/chunk-052/episode_052070.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052070.mp4" + }, + { + "episode_id": 12589, + "source_index": 12589, + "raw_length": 25, + "instruction": "Move the cup to the centre of the table", + "canonical_instruction": "move the cup to the centre of the table", + "parquet": "data/chunk-012/episode_012589.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012589.mp4" + }, + { + "episode_id": 20513, + "source_index": 20513, + "raw_length": 17, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-020/episode_020513.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020513.mp4" + }, + { + "episode_id": 22005, + "source_index": 22005, + "raw_length": 31, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-022/episode_022005.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022005.mp4" + }, + { + "episode_id": 10131, + "source_index": 10131, + "raw_length": 23, + "instruction": "Put the spoon to the left of the cloth.", + "canonical_instruction": "put the spoon to the left of the cloth", + "parquet": "data/chunk-010/episode_010131.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010131.mp4" + }, + { + "episode_id": 31256, + "source_index": 31256, + "raw_length": 35, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-031/episode_031256.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031256.mp4" + }, + { + "episode_id": 19207, + "source_index": 19207, + "raw_length": 46, + "instruction": "move the blue rectangular block from the red rectangular block and put it on top of the arch", + "canonical_instruction": "move the blue rectangular block from the red rectangular block and put it on top of the arch", + "parquet": "data/chunk-019/episode_019207.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019207.mp4" + }, + { + "episode_id": 30389, + "source_index": 30389, + "raw_length": 24, + "instruction": "move a yellow object to the left upper corner of the burner", + "canonical_instruction": "move a yellow object to the left upper corner of the burner", + "parquet": "data/chunk-030/episode_030389.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030389.mp4" + }, + { + "episode_id": 48953, + "source_index": 48953, + "raw_length": 35, + "instruction": "Put the banana in the colander.", + "canonical_instruction": "put the banana in the colander", + "parquet": "data/chunk-048/episode_048953.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048953.mp4" + }, + { + "episode_id": 8865, + "source_index": 8865, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-008/episode_008865.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008865.mp4" + }, + { + "episode_id": 16594, + "source_index": 16594, + "raw_length": 44, + "instruction": "Place the steel pan on the blue cloth", + "canonical_instruction": "place the steel pan on the blue cloth", + "parquet": "data/chunk-016/episode_016594.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016594.mp4" + }, + { + "episode_id": 22154, + "source_index": 22154, + "raw_length": 17, + "instruction": "pick up bit holder", + "canonical_instruction": "pick up bit holder", + "parquet": "data/chunk-022/episode_022154.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022154.mp4" + }, + { + "episode_id": 44106, + "source_index": 44106, + "raw_length": 30, + "instruction": "moved the can to the upper left side of the table", + "canonical_instruction": "moved the can to the upper left side of the table", + "parquet": "data/chunk-044/episode_044106.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044106.mp4" + }, + { + "episode_id": 17629, + "source_index": 17629, + "raw_length": 18, + "instruction": "put pot in sink", + "canonical_instruction": "put pot in sink", + "parquet": "data/chunk-017/episode_017629.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017629.mp4" + }, + { + "episode_id": 30505, + "source_index": 30505, + "raw_length": 36, + "instruction": "fold cloth", + "canonical_instruction": "fold cloth", + "parquet": "data/chunk-030/episode_030505.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030505.mp4" + }, + { + "episode_id": 2162, + "source_index": 2162, + "raw_length": 53, + "instruction": "move the spatula to the left side of the table", + "canonical_instruction": "move the spatula to the left side of the table", + "parquet": "data/chunk-002/episode_002162.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002162.mp4" + }, + { + "episode_id": 45109, + "source_index": 45109, + "raw_length": 37, + "instruction": "Mueve la botella a lado derecho de la mesa", + "canonical_instruction": "mueve la botella a lado derecho de la mesa", + "parquet": "data/chunk-045/episode_045109.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045109.mp4" + }, + { + "episode_id": 34025, + "source_index": 34025, + "raw_length": 27, + "instruction": "pick up scissors and put into drawer", + "canonical_instruction": "pick up scissors and put into drawer", + "parquet": "data/chunk-034/episode_034025.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034025.mp4" + }, + { + "episode_id": 16941, + "source_index": 16941, + "raw_length": 30, + "instruction": "move vessel diagonally from bottom to top on the right", + "canonical_instruction": "move vessel diagonally from bottom to top on the right", + "parquet": "data/chunk-016/episode_016941.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016941.mp4" + }, + { + "episode_id": 51606, + "source_index": 51606, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-051/episode_051606.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051606.mp4" + }, + { + "episode_id": 16600, + "source_index": 16600, + "raw_length": 31, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-016/episode_016600.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016600.mp4" + }, + { + "episode_id": 49788, + "source_index": 49788, + "raw_length": 32, + "instruction": "unfold the cloth from bottom right to bottom left", + "canonical_instruction": "unfold the cloth from bottom right to bottom left", + "parquet": "data/chunk-049/episode_049788.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049788.mp4" + }, + { + "episode_id": 10723, + "source_index": 10723, + "raw_length": 20, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-010/episode_010723.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010723.mp4" + }, + { + "episode_id": 22161, + "source_index": 22161, + "raw_length": 45, + "instruction": "Pick up the green vegetable and place it behind the green spatula", + "canonical_instruction": "pick up the green vegetable and place it behind the green spatula", + "parquet": "data/chunk-022/episode_022161.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022161.mp4" + }, + { + "episode_id": 42443, + "source_index": 42443, + "raw_length": 30, + "instruction": "move the white can to the rigth bottom of the table", + "canonical_instruction": "move the white can to the rigth bottom of the table", + "parquet": "data/chunk-042/episode_042443.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042443.mp4" + }, + { + "episode_id": 26312, + "source_index": 26312, + "raw_length": 32, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-026/episode_026312.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026312.mp4" + }, + { + "episode_id": 6612, + "source_index": 6612, + "raw_length": 50, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-006/episode_006612.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006612.mp4" + }, + { + "episode_id": 18266, + "source_index": 18266, + "raw_length": 29, + "instruction": "Put the green bell pepper upward", + "canonical_instruction": "put the green bell pepper upward", + "parquet": "data/chunk-018/episode_018266.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018266.mp4" + }, + { + "episode_id": 29358, + "source_index": 29358, + "raw_length": 42, + "instruction": "unfold the cloth from left to the right", + "canonical_instruction": "unfold the cloth from left to the right", + "parquet": "data/chunk-029/episode_029358.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029358.mp4" + }, + { + "episode_id": 12478, + "source_index": 12478, + "raw_length": 33, + "instruction": "Place the green vegetable to the right of the yellow utensil.", + "canonical_instruction": "place the green vegetable to the right of the yellow utensil", + "parquet": "data/chunk-012/episode_012478.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012478.mp4" + }, + { + "episode_id": 25276, + "source_index": 25276, + "raw_length": 32, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-025/episode_025276.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025276.mp4" + }, + { + "episode_id": 7842, + "source_index": 7842, + "raw_length": 28, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-007/episode_007842.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007842.mp4" + }, + { + "episode_id": 6376, + "source_index": 6376, + "raw_length": 37, + "instruction": "Put the yellow spoon into the red bowl", + "canonical_instruction": "put the yellow spoon into the red bowl", + "parquet": "data/chunk-006/episode_006376.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006376.mp4" + }, + { + "episode_id": 35995, + "source_index": 35995, + "raw_length": 19, + "instruction": "put sushi in pot or pan", + "canonical_instruction": "put sushi in pot or pan", + "parquet": "data/chunk-035/episode_035995.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035995.mp4" + }, + { + "episode_id": 28040, + "source_index": 28040, + "raw_length": 28, + "instruction": "unfold the cloth from the bottom left to the top right", + "canonical_instruction": "unfold the cloth from the bottom left to the top right", + "parquet": "data/chunk-028/episode_028040.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028040.mp4" + }, + { + "episode_id": 9268, + "source_index": 9268, + "raw_length": 27, + "instruction": "mouve the way", + "canonical_instruction": "mouve the way", + "parquet": "data/chunk-009/episode_009268.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009268.mp4" + }, + { + "episode_id": 31246, + "source_index": 31246, + "raw_length": 31, + "instruction": "moving the bunny.", + "canonical_instruction": "moving the bunny", + "parquet": "data/chunk-031/episode_031246.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031246.mp4" + }, + { + "episode_id": 16395, + "source_index": 16395, + "raw_length": 35, + "instruction": "move violet cloth from right to center", + "canonical_instruction": "move violet cloth from right to center", + "parquet": "data/chunk-016/episode_016395.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016395.mp4" + }, + { + "episode_id": 44999, + "source_index": 44999, + "raw_length": 28, + "instruction": "take the red and put it on top of green", + "canonical_instruction": "take the red and put it on top of green", + "parquet": "data/chunk-044/episode_044999.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044999.mp4" + }, + { + "episode_id": 39438, + "source_index": 39438, + "raw_length": 46, + "instruction": "put the yellow towel into the washing machine", + "canonical_instruction": "put the yellow towel into the washing machine", + "parquet": "data/chunk-039/episode_039438.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039438.mp4" + }, + { + "episode_id": 27069, + "source_index": 27069, + "raw_length": 37, + "instruction": "Move the pot to the front of the blue spoon.", + "canonical_instruction": "move the pot to the front of the blue spoon", + "parquet": "data/chunk-027/episode_027069.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027069.mp4" + }, + { + "episode_id": 24030, + "source_index": 24030, + "raw_length": 46, + "instruction": "pick the strawberry and put it into the stainless pot.", + "canonical_instruction": "pick the strawberry and put it into the stainless pot", + "parquet": "data/chunk-024/episode_024030.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024030.mp4" + }, + { + "episode_id": 20436, + "source_index": 20436, + "raw_length": 26, + "instruction": "move the silver pot to the rigth bottom of the burner", + "canonical_instruction": "move the silver pot to the rigth bottom of the burner", + "parquet": "data/chunk-020/episode_020436.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020436.mp4" + }, + { + "episode_id": 14825, + "source_index": 14825, + "raw_length": 22, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-014/episode_014825.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014825.mp4" + }, + { + "episode_id": 6732, + "source_index": 6732, + "raw_length": 31, + "instruction": "move the orange clear pot to the left burner", + "canonical_instruction": "move the orange clear pot to the left burner", + "parquet": "data/chunk-006/episode_006732.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006732.mp4" + }, + { + "episode_id": 1401, + "source_index": 1401, + "raw_length": 26, + "instruction": "put small spoon from basket to tray", + "canonical_instruction": "put small spoon from basket to tray", + "parquet": "data/chunk-001/episode_001401.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001401.mp4" + }, + { + "episode_id": 15846, + "source_index": 15846, + "raw_length": 46, + "instruction": "Pick up the red spoon and place it on the left of the pot", + "canonical_instruction": "pick up the red spoon and place it on the left of the pot", + "parquet": "data/chunk-015/episode_015846.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015846.mp4" + }, + { + "episode_id": 49538, + "source_index": 49538, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-049/episode_049538.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049538.mp4" + }, + { + "episode_id": 16394, + "source_index": 16394, + "raw_length": 51, + "instruction": "moved the black and white cake into the yellow drainer on the left side of the sink", + "canonical_instruction": "moved the black and white cake into the yellow drainer on the left side of the sink", + "parquet": "data/chunk-016/episode_016394.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016394.mp4" + }, + { + "episode_id": 30275, + "source_index": 30275, + "raw_length": 46, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-030/episode_030275.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030275.mp4" + }, + { + "episode_id": 32369, + "source_index": 32369, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-032/episode_032369.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032369.mp4" + }, + { + "episode_id": 20962, + "source_index": 20962, + "raw_length": 36, + "instruction": "upright hot sauce bottle cardboard fence", + "canonical_instruction": "upright hot sauce bottle cardboard fence", + "parquet": "data/chunk-020/episode_020962.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020962.mp4" + }, + { + "episode_id": 36893, + "source_index": 36893, + "raw_length": 34, + "instruction": "move the pink glass to the upper left of the stove", + "canonical_instruction": "move the pink glass to the upper left of the stove", + "parquet": "data/chunk-036/episode_036893.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036893.mp4" + }, + { + "episode_id": 6327, + "source_index": 6327, + "raw_length": 27, + "instruction": "fold the cloth from top right to top left", + "canonical_instruction": "fold the cloth from top right to top left", + "parquet": "data/chunk-006/episode_006327.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006327.mp4" + }, + { + "episode_id": 41169, + "source_index": 41169, + "raw_length": 38, + "instruction": "Move the yellow container to the right of the yellow cloth.", + "canonical_instruction": "move the yellow container to the right of the yellow cloth", + "parquet": "data/chunk-041/episode_041169.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041169.mp4" + }, + { + "episode_id": 44667, + "source_index": 44667, + "raw_length": 33, + "instruction": "move the red triangle to the left", + "canonical_instruction": "move the red triangle to the left", + "parquet": "data/chunk-044/episode_044667.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044667.mp4" + }, + { + "episode_id": 23422, + "source_index": 23422, + "raw_length": 20, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-023/episode_023422.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023422.mp4" + }, + { + "episode_id": 10036, + "source_index": 10036, + "raw_length": 35, + "instruction": "Move the blue fork to the back left edge of the table", + "canonical_instruction": "move the blue fork to the back left edge of the table", + "parquet": "data/chunk-010/episode_010036.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010036.mp4" + }, + { + "episode_id": 14499, + "source_index": 14499, + "raw_length": 38, + "instruction": "fold the cloth top left to bottom right", + "canonical_instruction": "fold the cloth top left to bottom right", + "parquet": "data/chunk-014/episode_014499.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014499.mp4" + }, + { + "episode_id": 39913, + "source_index": 39913, + "raw_length": 34, + "instruction": "Put the white red toy in the cabinet", + "canonical_instruction": "put the white red toy in the cabinet", + "parquet": "data/chunk-039/episode_039913.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039913.mp4" + }, + { + "episode_id": 15332, + "source_index": 15332, + "raw_length": 36, + "instruction": "pick the cloth and place it to the bottom right", + "canonical_instruction": "pick the cloth and place it to the bottom right", + "parquet": "data/chunk-015/episode_015332.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015332.mp4" + }, + { + "episode_id": 8241, + "source_index": 8241, + "raw_length": 26, + "instruction": "move the banana to the middle of the table", + "canonical_instruction": "move the banana to the middle of the table", + "parquet": "data/chunk-008/episode_008241.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008241.mp4" + }, + { + "episode_id": 5789, + "source_index": 5789, + "raw_length": 43, + "instruction": "move the silver pot on the lower right corner of the stove", + "canonical_instruction": "move the silver pot on the lower right corner of the stove", + "parquet": "data/chunk-005/episode_005789.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005789.mp4" + }, + { + "episode_id": 37550, + "source_index": 37550, + "raw_length": 25, + "instruction": "move the red figure to the right side of the table", + "canonical_instruction": "move the red figure to the right side of the table", + "parquet": "data/chunk-037/episode_037550.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037550.mp4" + }, + { + "episode_id": 16420, + "source_index": 16420, + "raw_length": 21, + "instruction": "wipe pot with sponge", + "canonical_instruction": "wipe pot with sponge", + "parquet": "data/chunk-016/episode_016420.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016420.mp4" + }, + { + "episode_id": 34796, + "source_index": 34796, + "raw_length": 42, + "instruction": "put the silver pot on the left side of the purple cloth.", + "canonical_instruction": "put the silver pot on the left side of the purple cloth", + "parquet": "data/chunk-034/episode_034796.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034796.mp4" + }, + { + "episode_id": 5061, + "source_index": 5061, + "raw_length": 45, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-005/episode_005061.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005061.mp4" + }, + { + "episode_id": 39631, + "source_index": 39631, + "raw_length": 28, + "instruction": "Upload video 1 (Indoor lighting", + "canonical_instruction": "upload video 1 (indoor lighting", + "parquet": "data/chunk-039/episode_039631.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039631.mp4" + }, + { + "episode_id": 36550, + "source_index": 36550, + "raw_length": 43, + "instruction": "put the white cylinder on top of the tower", + "canonical_instruction": "put the white cylinder on top of the tower", + "parquet": "data/chunk-036/episode_036550.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036550.mp4" + }, + { + "episode_id": 23446, + "source_index": 23446, + "raw_length": 27, + "instruction": "pick up box cutter and put into drawer", + "canonical_instruction": "pick up box cutter and put into drawer", + "parquet": "data/chunk-023/episode_023446.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023446.mp4" + }, + { + "episode_id": 15270, + "source_index": 15270, + "raw_length": 43, + "instruction": "move the green spatula on top of the yellow cloth", + "canonical_instruction": "move the green spatula on top of the yellow cloth", + "parquet": "data/chunk-015/episode_015270.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015270.mp4" + }, + { + "episode_id": 1389, + "source_index": 1389, + "raw_length": 29, + "instruction": "Moved blue thing to the left side of the table", + "canonical_instruction": "moved blue thing to the left side of the table", + "parquet": "data/chunk-001/episode_001389.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001389.mp4" + }, + { + "episode_id": 52470, + "source_index": 52470, + "raw_length": 35, + "instruction": "put the nigirizushi on the bottom left edge of the towel", + "canonical_instruction": "put the nigirizushi on the bottom left edge of the towel", + "parquet": "data/chunk-052/episode_052470.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052470.mp4" + }, + { + "episode_id": 26990, + "source_index": 26990, + "raw_length": 31, + "instruction": "moves the can to the right side of the burner", + "canonical_instruction": "moves the can to the right side of the burner", + "parquet": "data/chunk-026/episode_026990.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026990.mp4" + }, + { + "episode_id": 14255, + "source_index": 14255, + "raw_length": 37, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-014/episode_014255.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014255.mp4" + }, + { + "episode_id": 45733, + "source_index": 45733, + "raw_length": 31, + "instruction": "Move the metal pot to the front right corner of the table.", + "canonical_instruction": "move the metal pot to the front right corner of the table", + "parquet": "data/chunk-045/episode_045733.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045733.mp4" + }, + { + "episode_id": 37980, + "source_index": 37980, + "raw_length": 21, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-037/episode_037980.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037980.mp4" + }, + { + "episode_id": 21570, + "source_index": 21570, + "raw_length": 36, + "instruction": "move the glass pot and put it in the right burner", + "canonical_instruction": "move the glass pot and put it in the right burner", + "parquet": "data/chunk-021/episode_021570.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021570.mp4" + }, + { + "episode_id": 46384, + "source_index": 46384, + "raw_length": 38, + "instruction": "Place the red strawberry on top of the purple towel", + "canonical_instruction": "place the red strawberry on top of the purple towel", + "parquet": "data/chunk-046/episode_046384.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046384.mp4" + }, + { + "episode_id": 36795, + "source_index": 36795, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-036/episode_036795.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036795.mp4" + }, + { + "episode_id": 28864, + "source_index": 28864, + "raw_length": 17, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-028/episode_028864.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028864.mp4" + }, + { + "episode_id": 21479, + "source_index": 21479, + "raw_length": 44, + "instruction": "Move the pot near the wall.", + "canonical_instruction": "move the pot near the wall", + "parquet": "data/chunk-021/episode_021479.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021479.mp4" + }, + { + "episode_id": 10770, + "source_index": 10770, + "raw_length": 32, + "instruction": "lift the purple cloth into the laundry tub", + "canonical_instruction": "lift the purple cloth into the laundry tub", + "parquet": "data/chunk-010/episode_010770.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010770.mp4" + }, + { + "episode_id": 8493, + "source_index": 8493, + "raw_length": 31, + "instruction": "Place the drumstick on the back right corner of the table", + "canonical_instruction": "place the drumstick on the back right corner of the table", + "parquet": "data/chunk-008/episode_008493.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008493.mp4" + }, + { + "episode_id": 6705, + "source_index": 6705, + "raw_length": 46, + "instruction": "Put the garnet cylinder in the middle of the red arc", + "canonical_instruction": "put the garnet cylinder in the middle of the red arc", + "parquet": "data/chunk-006/episode_006705.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006705.mp4" + }, + { + "episode_id": 7091, + "source_index": 7091, + "raw_length": 46, + "instruction": "put the block on top of the green cube", + "canonical_instruction": "put the block on top of the green cube", + "parquet": "data/chunk-007/episode_007091.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007091.mp4" + }, + { + "episode_id": 9109, + "source_index": 9109, + "raw_length": 28, + "instruction": "put the red T-shirt on the right side burner", + "canonical_instruction": "put the red t-shirt on the right side burner", + "parquet": "data/chunk-009/episode_009109.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009109.mp4" + }, + { + "episode_id": 8461, + "source_index": 8461, + "raw_length": 28, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-008/episode_008461.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008461.mp4" + }, + { + "episode_id": 42425, + "source_index": 42425, + "raw_length": 41, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-042/episode_042425.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042425.mp4" + }, + { + "episode_id": 35077, + "source_index": 35077, + "raw_length": 35, + "instruction": "move red fork to right of towel", + "canonical_instruction": "move red fork to right of towel", + "parquet": "data/chunk-035/episode_035077.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035077.mp4" + }, + { + "episode_id": 42531, + "source_index": 42531, + "raw_length": 46, + "instruction": "Move the fork to the lower left side of the table", + "canonical_instruction": "move the fork to the lower left side of the table", + "parquet": "data/chunk-042/episode_042531.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042531.mp4" + }, + { + "episode_id": 34825, + "source_index": 34825, + "raw_length": 46, + "instruction": "Move the orange cloth to the left of the silver pot.", + "canonical_instruction": "move the orange cloth to the left of the silver pot", + "parquet": "data/chunk-034/episode_034825.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034825.mp4" + }, + { + "episode_id": 36810, + "source_index": 36810, + "raw_length": 32, + "instruction": "put the chicken thigh next to the silver pot", + "canonical_instruction": "put the chicken thigh next to the silver pot", + "parquet": "data/chunk-036/episode_036810.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036810.mp4" + }, + { + "episode_id": 28650, + "source_index": 28650, + "raw_length": 19, + "instruction": "put sweet potato in pan which is on stove", + "canonical_instruction": "put sweet potato in pan which is on stove", + "parquet": "data/chunk-028/episode_028650.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028650.mp4" + }, + { + "episode_id": 47976, + "source_index": 47976, + "raw_length": 39, + "instruction": "take the silver lid off the silver pan and put it above the yellow duck", + "canonical_instruction": "take the silver lid off the silver pan and put it above the yellow duck", + "parquet": "data/chunk-047/episode_047976.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047976.mp4" + }, + { + "episode_id": 29035, + "source_index": 29035, + "raw_length": 46, + "instruction": "Move the silver bowl to the back of the table with the red strawberry behind it.", + "canonical_instruction": "move the silver bowl to the back of the table with the red strawberry behind it", + "parquet": "data/chunk-029/episode_029035.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029035.mp4" + }, + { + "episode_id": 12239, + "source_index": 12239, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-012/episode_012239.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012239.mp4" + }, + { + "episode_id": 22952, + "source_index": 22952, + "raw_length": 33, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-022/episode_022952.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022952.mp4" + }, + { + "episode_id": 24138, + "source_index": 24138, + "raw_length": 37, + "instruction": "moving out the towel from the left side burner to the right side burner", + "canonical_instruction": "moving out the towel from the left side burner to the right side burner", + "parquet": "data/chunk-024/episode_024138.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024138.mp4" + }, + { + "episode_id": 21182, + "source_index": 21182, + "raw_length": 32, + "instruction": "move the object from the drawers top and put it down in the table", + "canonical_instruction": "move the object from the drawers top and put it down in the table", + "parquet": "data/chunk-021/episode_021182.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021182.mp4" + }, + { + "episode_id": 23221, + "source_index": 23221, + "raw_length": 46, + "instruction": "move the green rectangular to the right", + "canonical_instruction": "move the green rectangular to the right", + "parquet": "data/chunk-023/episode_023221.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023221.mp4" + }, + { + "episode_id": 29347, + "source_index": 29347, + "raw_length": 18, + "instruction": "unzip zipper bag", + "canonical_instruction": "unzip zipper bag", + "parquet": "data/chunk-029/episode_029347.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029347.mp4" + }, + { + "episode_id": 49167, + "source_index": 49167, + "raw_length": 41, + "instruction": "put the red block on the top left of the cloth", + "canonical_instruction": "put the red block on the top left of the cloth", + "parquet": "data/chunk-049/episode_049167.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049167.mp4" + }, + { + "episode_id": 3585, + "source_index": 3585, + "raw_length": 33, + "instruction": "put the silver object over the silver pot", + "canonical_instruction": "put the silver object over the silver pot", + "parquet": "data/chunk-003/episode_003585.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003585.mp4" + }, + { + "episode_id": 918, + "source_index": 918, + "raw_length": 27, + "instruction": "Place the green spatula in front of the microwave.", + "canonical_instruction": "place the green spatula in front of the microwave", + "parquet": "data/chunk-000/episode_000918.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000918.mp4" + }, + { + "episode_id": 26222, + "source_index": 26222, + "raw_length": 40, + "instruction": "fold cloth from the bottom left to the top right", + "canonical_instruction": "fold cloth from the bottom left to the top right", + "parquet": "data/chunk-026/episode_026222.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026222.mp4" + }, + { + "episode_id": 50903, + "source_index": 50903, + "raw_length": 44, + "instruction": "put the red object into the drawer", + "canonical_instruction": "put the red object into the drawer", + "parquet": "data/chunk-050/episode_050903.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050903.mp4" + }, + { + "episode_id": 2593, + "source_index": 2593, + "raw_length": 21, + "instruction": "zip zipper bag", + "canonical_instruction": "zip zipper bag", + "parquet": "data/chunk-002/episode_002593.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002593.mp4" + }, + { + "episode_id": 16391, + "source_index": 16391, + "raw_length": 32, + "instruction": "move the pot from the top right burner to the down left burner", + "canonical_instruction": "move the pot from the top right burner to the down left burner", + "parquet": "data/chunk-016/episode_016391.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016391.mp4" + }, + { + "episode_id": 50430, + "source_index": 50430, + "raw_length": 32, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-050/episode_050430.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050430.mp4" + }, + { + "episode_id": 28862, + "source_index": 28862, + "raw_length": 84, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-028/episode_028862.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028862.mp4" + }, + { + "episode_id": 26481, + "source_index": 26481, + "raw_length": 43, + "instruction": "Place the ring on top of the cone", + "canonical_instruction": "place the ring on top of the cone", + "parquet": "data/chunk-026/episode_026481.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026481.mp4" + }, + { + "episode_id": 12420, + "source_index": 12420, + "raw_length": 31, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-012/episode_012420.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012420.mp4" + }, + { + "episode_id": 33652, + "source_index": 33652, + "raw_length": 40, + "instruction": "Place the pot in front of the spoon on the green towel", + "canonical_instruction": "place the pot in front of the spoon on the green towel", + "parquet": "data/chunk-033/episode_033652.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033652.mp4" + }, + { + "episode_id": 7071, + "source_index": 7071, + "raw_length": 36, + "instruction": "upright hot sauce bottle cardboard fence", + "canonical_instruction": "upright hot sauce bottle cardboard fence", + "parquet": "data/chunk-007/episode_007071.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007071.mp4" + }, + { + "episode_id": 22720, + "source_index": 22720, + "raw_length": 28, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-022/episode_022720.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022720.mp4" + }, + { + "episode_id": 49554, + "source_index": 49554, + "raw_length": 47, + "instruction": "put the red fork into the basket", + "canonical_instruction": "put the red fork into the basket", + "parquet": "data/chunk-049/episode_049554.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049554.mp4" + }, + { + "episode_id": 5129, + "source_index": 5129, + "raw_length": 21, + "instruction": "put sweet potato in pot", + "canonical_instruction": "put sweet potato in pot", + "parquet": "data/chunk-005/episode_005129.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005129.mp4" + }, + { + "episode_id": 12657, + "source_index": 12657, + "raw_length": 24, + "instruction": "put lemon on plate", + "canonical_instruction": "put lemon on plate", + "parquet": "data/chunk-012/episode_012657.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012657.mp4" + }, + { + "episode_id": 16074, + "source_index": 16074, + "raw_length": 31, + "instruction": "move the white basket to the right of the washing machine", + "canonical_instruction": "move the white basket to the right of the washing machine", + "parquet": "data/chunk-016/episode_016074.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016074.mp4" + }, + { + "episode_id": 39932, + "source_index": 39932, + "raw_length": 34, + "instruction": "Pick up and move the pot to the front center of the table.", + "canonical_instruction": "pick up and move the pot to the front center of the table", + "parquet": "data/chunk-039/episode_039932.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039932.mp4" + }, + { + "episode_id": 21525, + "source_index": 21525, + "raw_length": 22, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-021/episode_021525.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021525.mp4" + }, + { + "episode_id": 21600, + "source_index": 21600, + "raw_length": 46, + "instruction": "pick red doll and drop it on the vessel", + "canonical_instruction": "pick red doll and drop it on the vessel", + "parquet": "data/chunk-021/episode_021600.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021600.mp4" + }, + { + "episode_id": 19960, + "source_index": 19960, + "raw_length": 43, + "instruction": "put the green object in the silver pot", + "canonical_instruction": "put the green object in the silver pot", + "parquet": "data/chunk-019/episode_019960.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019960.mp4" + }, + { + "episode_id": 44326, + "source_index": 44326, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-044/episode_044326.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044326.mp4" + }, + { + "episode_id": 47703, + "source_index": 47703, + "raw_length": 46, + "instruction": "put the red block on top of the white arch", + "canonical_instruction": "put the red block on top of the white arch", + "parquet": "data/chunk-047/episode_047703.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047703.mp4" + }, + { + "episode_id": 13700, + "source_index": 13700, + "raw_length": 39, + "instruction": "fold the fabric from top to bottom", + "canonical_instruction": "fold the fabric from top to bottom", + "parquet": "data/chunk-013/episode_013700.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013700.mp4" + }, + { + "episode_id": 39440, + "source_index": 39440, + "raw_length": 26, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-039/episode_039440.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039440.mp4" + }, + { + "episode_id": 20758, + "source_index": 20758, + "raw_length": 32, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-020/episode_020758.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020758.mp4" + }, + { + "episode_id": 43460, + "source_index": 43460, + "raw_length": 27, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-043/episode_043460.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043460.mp4" + }, + { + "episode_id": 32992, + "source_index": 32992, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-032/episode_032992.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032992.mp4" + }, + { + "episode_id": 25453, + "source_index": 25453, + "raw_length": 17, + "instruction": "put spoon into pan", + "canonical_instruction": "put spoon into pan", + "parquet": "data/chunk-025/episode_025453.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025453.mp4" + }, + { + "episode_id": 19784, + "source_index": 19784, + "raw_length": 31, + "instruction": "moved the silver pot from the lower right burner to the lower left burner", + "canonical_instruction": "moved the silver pot from the lower right burner to the lower left burner", + "parquet": "data/chunk-019/episode_019784.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019784.mp4" + }, + { + "episode_id": 33444, + "source_index": 33444, + "raw_length": 26, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-033/episode_033444.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033444.mp4" + }, + { + "episode_id": 36308, + "source_index": 36308, + "raw_length": 29, + "instruction": "move the corn to the lower corner of the left burner", + "canonical_instruction": "move the corn to the lower corner of the left burner", + "parquet": "data/chunk-036/episode_036308.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036308.mp4" + }, + { + "episode_id": 7081, + "source_index": 7081, + "raw_length": 35, + "instruction": "folded both right and left side", + "canonical_instruction": "folded both right and left side", + "parquet": "data/chunk-007/episode_007081.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007081.mp4" + }, + { + "episode_id": 12219, + "source_index": 12219, + "raw_length": 31, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-012/episode_012219.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012219.mp4" + }, + { + "episode_id": 46462, + "source_index": 46462, + "raw_length": 35, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-046/episode_046462.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046462.mp4" + }, + { + "episode_id": 26289, + "source_index": 26289, + "raw_length": 38, + "instruction": "Take the cube off of the rectangular block", + "canonical_instruction": "take the cube off of the rectangular block", + "parquet": "data/chunk-026/episode_026289.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026289.mp4" + }, + { + "episode_id": 30472, + "source_index": 30472, + "raw_length": 40, + "instruction": "Pick up the corn and place it on the front left edge of the table", + "canonical_instruction": "pick up the corn and place it on the front left edge of the table", + "parquet": "data/chunk-030/episode_030472.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030472.mp4" + }, + { + "episode_id": 34581, + "source_index": 34581, + "raw_length": 29, + "instruction": "move the yellow cloth to the center of the table", + "canonical_instruction": "move the yellow cloth to the center of the table", + "parquet": "data/chunk-034/episode_034581.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034581.mp4" + }, + { + "episode_id": 47910, + "source_index": 47910, + "raw_length": 36, + "instruction": "Pick a box", + "canonical_instruction": "pick a box", + "parquet": "data/chunk-047/episode_047910.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047910.mp4" + }, + { + "episode_id": 3434, + "source_index": 3434, + "raw_length": 26, + "instruction": "put the corn on top of the drawer", + "canonical_instruction": "put the corn on top of the drawer", + "parquet": "data/chunk-003/episode_003434.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003434.mp4" + }, + { + "episode_id": 31106, + "source_index": 31106, + "raw_length": 46, + "instruction": "take the green towel from the white basket to the washing machine", + "canonical_instruction": "take the green towel from the white basket to the washing machine", + "parquet": "data/chunk-031/episode_031106.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031106.mp4" + }, + { + "episode_id": 43102, + "source_index": 43102, + "raw_length": 33, + "instruction": "remove the lid of the pot and put it on the right top burner", + "canonical_instruction": "remove the lid of the pot and put it on the right top burner", + "parquet": "data/chunk-043/episode_043102.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043102.mp4" + }, + { + "episode_id": 12119, + "source_index": 12119, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-012/episode_012119.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012119.mp4" + }, + { + "episode_id": 14690, + "source_index": 14690, + "raw_length": 21, + "instruction": "pick up bowl and put in small4fbox", + "canonical_instruction": "pick up bowl and put in small4fbox", + "parquet": "data/chunk-014/episode_014690.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014690.mp4" + }, + { + "episode_id": 32719, + "source_index": 32719, + "raw_length": 22, + "instruction": "Pick up the mushroom and place it next to the yellow spoon", + "canonical_instruction": "pick up the mushroom and place it next to the yellow spoon", + "parquet": "data/chunk-032/episode_032719.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032719.mp4" + }, + { + "episode_id": 9669, + "source_index": 9669, + "raw_length": 38, + "instruction": "unfold the cloth from the left to right", + "canonical_instruction": "unfold the cloth from the left to right", + "parquet": "data/chunk-009/episode_009669.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009669.mp4" + }, + { + "episode_id": 31654, + "source_index": 31654, + "raw_length": 28, + "instruction": "Move the purple towel to the left of the yellow brush.", + "canonical_instruction": "move the purple towel to the left of the yellow brush", + "parquet": "data/chunk-031/episode_031654.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031654.mp4" + }, + { + "episode_id": 29971, + "source_index": 29971, + "raw_length": 21, + "instruction": "pick up pot from sink", + "canonical_instruction": "pick up pot from sink", + "parquet": "data/chunk-029/episode_029971.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029971.mp4" + }, + { + "episode_id": 35114, + "source_index": 35114, + "raw_length": 33, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-035/episode_035114.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035114.mp4" + }, + { + "episode_id": 50186, + "source_index": 50186, + "raw_length": 73, + "instruction": "put fry on plate and mushroom in pot or pan in sink", + "canonical_instruction": "put fry on plate and mushroom in pot or pan in sink", + "parquet": "data/chunk-050/episode_050186.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050186.mp4" + }, + { + "episode_id": 27861, + "source_index": 27861, + "raw_length": 81, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-027/episode_027861.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027861.mp4" + }, + { + "episode_id": 41034, + "source_index": 41034, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-041/episode_041034.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041034.mp4" + }, + { + "episode_id": 53093, + "source_index": 53093, + "raw_length": 20, + "instruction": "close large4fbox flaps", + "canonical_instruction": "close large4fbox flaps", + "parquet": "data/chunk-053/episode_053093.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053093.mp4" + }, + { + "episode_id": 47265, + "source_index": 47265, + "raw_length": 46, + "instruction": "put the green triangle from top of tower in to the right side of the table", + "canonical_instruction": "put the green triangle from top of tower in to the right side of the table", + "parquet": "data/chunk-047/episode_047265.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047265.mp4" + }, + { + "episode_id": 34084, + "source_index": 34084, + "raw_length": 56, + "instruction": "moved the purple item into the cooking pot", + "canonical_instruction": "moved the purple item into the cooking pot", + "parquet": "data/chunk-034/episode_034084.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034084.mp4" + }, + { + "episode_id": 20564, + "source_index": 20564, + "raw_length": 39, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-020/episode_020564.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020564.mp4" + }, + { + "episode_id": 22019, + "source_index": 22019, + "raw_length": 56, + "instruction": "pick and move green object to top right side of aquamarine sink", + "canonical_instruction": "pick and move green object to top right side of aquamarine sink", + "parquet": "data/chunk-022/episode_022019.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022019.mp4" + }, + { + "episode_id": 37502, + "source_index": 37502, + "raw_length": 45, + "instruction": "Place the red fork on top of the green towel", + "canonical_instruction": "place the red fork on top of the green towel", + "parquet": "data/chunk-037/episode_037502.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037502.mp4" + }, + { + "episode_id": 47187, + "source_index": 47187, + "raw_length": 33, + "instruction": "put orange pot on top middle of the burner", + "canonical_instruction": "put orange pot on top middle of the burner", + "parquet": "data/chunk-047/episode_047187.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047187.mp4" + }, + { + "episode_id": 49773, + "source_index": 49773, + "raw_length": 93, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-049/episode_049773.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049773.mp4" + }, + { + "episode_id": 47640, + "source_index": 47640, + "raw_length": 28, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-047/episode_047640.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047640.mp4" + }, + { + "episode_id": 47780, + "source_index": 47780, + "raw_length": 29, + "instruction": "put the pot on the upper left side of table", + "canonical_instruction": "put the pot on the upper left side of table", + "parquet": "data/chunk-047/episode_047780.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047780.mp4" + }, + { + "episode_id": 40011, + "source_index": 40011, + "raw_length": 38, + "instruction": "move the tall silver pot to the middle switch of the burner", + "canonical_instruction": "move the tall silver pot to the middle switch of the burner", + "parquet": "data/chunk-040/episode_040011.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040011.mp4" + }, + { + "episode_id": 38906, + "source_index": 38906, + "raw_length": 18, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-038/episode_038906.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038906.mp4" + }, + { + "episode_id": 44953, + "source_index": 44953, + "raw_length": 22, + "instruction": "put banana in pot or pan", + "canonical_instruction": "put banana in pot or pan", + "parquet": "data/chunk-044/episode_044953.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044953.mp4" + }, + { + "episode_id": 20960, + "source_index": 20960, + "raw_length": 30, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-020/episode_020960.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020960.mp4" + }, + { + "episode_id": 41092, + "source_index": 41092, + "raw_length": 30, + "instruction": "put sushi in pot cardboard fence", + "canonical_instruction": "put sushi in pot cardboard fence", + "parquet": "data/chunk-041/episode_041092.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041092.mp4" + }, + { + "episode_id": 44927, + "source_index": 44927, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-044/episode_044927.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044927.mp4" + }, + { + "episode_id": 50616, + "source_index": 50616, + "raw_length": 19, + "instruction": "move the orange cloth in the right side of the burner", + "canonical_instruction": "move the orange cloth in the right side of the burner", + "parquet": "data/chunk-050/episode_050616.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050616.mp4" + }, + { + "episode_id": 28186, + "source_index": 28186, + "raw_length": 17, + "instruction": "put eggplant into pan", + "canonical_instruction": "put eggplant into pan", + "parquet": "data/chunk-028/episode_028186.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028186.mp4" + }, + { + "episode_id": 33087, + "source_index": 33087, + "raw_length": 34, + "instruction": "PICK UP THE BANANA AND PUT ON THE TABLE", + "canonical_instruction": "pick up the banana and put on the table", + "parquet": "data/chunk-033/episode_033087.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033087.mp4" + }, + { + "episode_id": 3566, + "source_index": 3566, + "raw_length": 22, + "instruction": "pick up red srewdriver", + "canonical_instruction": "pick up red srewdriver", + "parquet": "data/chunk-003/episode_003566.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003566.mp4" + }, + { + "episode_id": 1864, + "source_index": 1864, + "raw_length": 43, + "instruction": "moved the silver pot to the lower left side of the left burner", + "canonical_instruction": "moved the silver pot to the lower left side of the left burner", + "parquet": "data/chunk-001/episode_001864.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001864.mp4" + }, + { + "episode_id": 1323, + "source_index": 1323, + "raw_length": 72, + "instruction": "put fry in pot or pan an put pot or pan on stove", + "canonical_instruction": "put fry in pot or pan an put pot or pan on stove", + "parquet": "data/chunk-001/episode_001323.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001323.mp4" + }, + { + "episode_id": 16270, + "source_index": 16270, + "raw_length": 19, + "instruction": "Move the towel so its directly above the bowl.", + "canonical_instruction": "move the towel so its directly above the bowl", + "parquet": "data/chunk-016/episode_016270.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016270.mp4" + }, + { + "episode_id": 32988, + "source_index": 32988, + "raw_length": 55, + "instruction": "Put the machine in the ban", + "canonical_instruction": "put the machine in the ban", + "parquet": "data/chunk-032/episode_032988.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032988.mp4" + }, + { + "episode_id": 1983, + "source_index": 1983, + "raw_length": 20, + "instruction": "put potato in pot or pan", + "canonical_instruction": "put potato in pot or pan", + "parquet": "data/chunk-001/episode_001983.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001983.mp4" + }, + { + "episode_id": 29765, + "source_index": 29765, + "raw_length": 23, + "instruction": "take bowl off plate cardboard fence", + "canonical_instruction": "take bowl off plate cardboard fence", + "parquet": "data/chunk-029/episode_029765.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029765.mp4" + }, + { + "episode_id": 52868, + "source_index": 52868, + "raw_length": 42, + "instruction": "Pick up the knife from the pot and put it on the table", + "canonical_instruction": "pick up the knife from the pot and put it on the table", + "parquet": "data/chunk-052/episode_052868.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052868.mp4" + }, + { + "episode_id": 5687, + "source_index": 5687, + "raw_length": 18, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-005/episode_005687.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005687.mp4" + }, + { + "episode_id": 40157, + "source_index": 40157, + "raw_length": 29, + "instruction": "Move the blue cloth in front of the microwave.", + "canonical_instruction": "move the blue cloth in front of the microwave", + "parquet": "data/chunk-040/episode_040157.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040157.mp4" + }, + { + "episode_id": 10980, + "source_index": 10980, + "raw_length": 27, + "instruction": "Move the spoon to the far left edge of the table", + "canonical_instruction": "move the spoon to the far left edge of the table", + "parquet": "data/chunk-010/episode_010980.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010980.mp4" + }, + { + "episode_id": 17007, + "source_index": 17007, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-017/episode_017007.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017007.mp4" + }, + { + "episode_id": 47170, + "source_index": 47170, + "raw_length": 20, + "instruction": "Place the blue cloth in front of the microwave.", + "canonical_instruction": "place the blue cloth in front of the microwave", + "parquet": "data/chunk-047/episode_047170.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047170.mp4" + }, + { + "episode_id": 35072, + "source_index": 35072, + "raw_length": 32, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-035/episode_035072.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035072.mp4" + }, + { + "episode_id": 49064, + "source_index": 49064, + "raw_length": 30, + "instruction": "move the canned at the upper middle of the table beside the pan and the green towel", + "canonical_instruction": "move the canned at the upper middle of the table beside the pan and the green towel", + "parquet": "data/chunk-049/episode_049064.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049064.mp4" + }, + { + "episode_id": 51773, + "source_index": 51773, + "raw_length": 31, + "instruction": "take the toy and put in to the yellow towel", + "canonical_instruction": "take the toy and put in to the yellow towel", + "parquet": "data/chunk-051/episode_051773.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051773.mp4" + }, + { + "episode_id": 24881, + "source_index": 24881, + "raw_length": 49, + "instruction": "moved the wooden spatula to the right side of the sink", + "canonical_instruction": "moved the wooden spatula to the right side of the sink", + "parquet": "data/chunk-024/episode_024881.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024881.mp4" + }, + { + "episode_id": 48682, + "source_index": 48682, + "raw_length": 43, + "instruction": "placed a red folk on an orange cloth from the left burner", + "canonical_instruction": "placed a red folk on an orange cloth from the left burner", + "parquet": "data/chunk-048/episode_048682.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048682.mp4" + }, + { + "episode_id": 37275, + "source_index": 37275, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-037/episode_037275.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037275.mp4" + }, + { + "episode_id": 46397, + "source_index": 46397, + "raw_length": 40, + "instruction": "put the can in the right side of the yellow towel", + "canonical_instruction": "put the can in the right side of the yellow towel", + "parquet": "data/chunk-046/episode_046397.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046397.mp4" + }, + { + "episode_id": 33643, + "source_index": 33643, + "raw_length": 38, + "instruction": "Pick up pan, move left, place it on top of yellow cloth", + "canonical_instruction": "pick up pan, move left, place it on top of yellow cloth", + "parquet": "data/chunk-033/episode_033643.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033643.mp4" + }, + { + "episode_id": 35800, + "source_index": 35800, + "raw_length": 27, + "instruction": "moved the cover of the pot and put it on the right side of the table", + "canonical_instruction": "moved the cover of the pot and put it on the right side of the table", + "parquet": "data/chunk-035/episode_035800.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035800.mp4" + }, + { + "episode_id": 47619, + "source_index": 47619, + "raw_length": 37, + "instruction": "move the blue cloth to the lower left side of the table", + "canonical_instruction": "move the blue cloth to the lower left side of the table", + "parquet": "data/chunk-047/episode_047619.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047619.mp4" + }, + { + "episode_id": 44006, + "source_index": 44006, + "raw_length": 21, + "instruction": "put pan on stove from sink", + "canonical_instruction": "put pan on stove from sink", + "parquet": "data/chunk-044/episode_044006.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044006.mp4" + }, + { + "episode_id": 28299, + "source_index": 28299, + "raw_length": 38, + "instruction": "unfold the cloth from the top right to bottom left", + "canonical_instruction": "unfold the cloth from the top right to bottom left", + "parquet": "data/chunk-028/episode_028299.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028299.mp4" + }, + { + "episode_id": 46720, + "source_index": 46720, + "raw_length": 38, + "instruction": "Move the spoon to the left of the towel", + "canonical_instruction": "move the spoon to the left of the towel", + "parquet": "data/chunk-046/episode_046720.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046720.mp4" + }, + { + "episode_id": 48244, + "source_index": 48244, + "raw_length": 26, + "instruction": "put the metallic silver pot to the bottom right of the burner", + "canonical_instruction": "put the metallic silver pot to the bottom right of the burner", + "parquet": "data/chunk-048/episode_048244.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048244.mp4" + }, + { + "episode_id": 28729, + "source_index": 28729, + "raw_length": 41, + "instruction": "move the pot to the far left front next to the wall", + "canonical_instruction": "move the pot to the far left front next to the wall", + "parquet": "data/chunk-028/episode_028729.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028729.mp4" + }, + { + "episode_id": 48300, + "source_index": 48300, + "raw_length": 34, + "instruction": "move the cloth from left to the right", + "canonical_instruction": "move the cloth from left to the right", + "parquet": "data/chunk-048/episode_048300.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048300.mp4" + }, + { + "episode_id": 15678, + "source_index": 15678, + "raw_length": 42, + "instruction": "move the silver pot to the left side burner", + "canonical_instruction": "move the silver pot to the left side burner", + "parquet": "data/chunk-015/episode_015678.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015678.mp4" + }, + { + "episode_id": 47385, + "source_index": 47385, + "raw_length": 29, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-047/episode_047385.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047385.mp4" + }, + { + "episode_id": 39235, + "source_index": 39235, + "raw_length": 21, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-039/episode_039235.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039235.mp4" + }, + { + "episode_id": 49445, + "source_index": 49445, + "raw_length": 31, + "instruction": "put the green cloth inside the washing machine", + "canonical_instruction": "put the green cloth inside the washing machine", + "parquet": "data/chunk-049/episode_049445.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049445.mp4" + }, + { + "episode_id": 44567, + "source_index": 44567, + "raw_length": 44, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-044/episode_044567.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044567.mp4" + }, + { + "episode_id": 6527, + "source_index": 6527, + "raw_length": 35, + "instruction": "Move the silver pot to the bottom part of the burner", + "canonical_instruction": "move the silver pot to the bottom part of the burner", + "parquet": "data/chunk-006/episode_006527.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006527.mp4" + }, + { + "episode_id": 52270, + "source_index": 52270, + "raw_length": 42, + "instruction": "Slide the wok to the top of the cloth.", + "canonical_instruction": "slide the wok to the top of the cloth", + "parquet": "data/chunk-052/episode_052270.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052270.mp4" + }, + { + "episode_id": 53012, + "source_index": 53012, + "raw_length": 37, + "instruction": "put the red cube next to the green cube", + "canonical_instruction": "put the red cube next to the green cube", + "parquet": "data/chunk-053/episode_053012.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053012.mp4" + }, + { + "episode_id": 26861, + "source_index": 26861, + "raw_length": 17, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-026/episode_026861.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026861.mp4" + }, + { + "episode_id": 20091, + "source_index": 20091, + "raw_length": 46, + "instruction": "Move the ketchup bottle to between the napkin and the spatula", + "canonical_instruction": "move the ketchup bottle to between the napkin and the spatula", + "parquet": "data/chunk-020/episode_020091.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020091.mp4" + }, + { + "episode_id": 10202, + "source_index": 10202, + "raw_length": 28, + "instruction": "touch the strawberry in the drawer", + "canonical_instruction": "touch the strawberry in the drawer", + "parquet": "data/chunk-010/episode_010202.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010202.mp4" + }, + { + "episode_id": 47450, + "source_index": 47450, + "raw_length": 17, + "instruction": "close small4fbox flaps", + "canonical_instruction": "close small4fbox flaps", + "parquet": "data/chunk-047/episode_047450.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047450.mp4" + }, + { + "episode_id": 50484, + "source_index": 50484, + "raw_length": 43, + "instruction": "Esory avy ao amin'ny siny sakafo", + "canonical_instruction": "esory avy ao amin'ny siny sakafo", + "parquet": "data/chunk-050/episode_050484.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050484.mp4" + }, + { + "episode_id": 24018, + "source_index": 24018, + "raw_length": 24, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-024/episode_024018.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024018.mp4" + }, + { + "episode_id": 32150, + "source_index": 32150, + "raw_length": 44, + "instruction": "Move the fruit out from the pot.", + "canonical_instruction": "move the fruit out from the pot", + "parquet": "data/chunk-032/episode_032150.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032150.mp4" + }, + { + "episode_id": 24433, + "source_index": 24433, + "raw_length": 20, + "instruction": "close brown1fbox flap", + "canonical_instruction": "close brown1fbox flap", + "parquet": "data/chunk-024/episode_024433.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024433.mp4" + }, + { + "episode_id": 50655, + "source_index": 50655, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-050/episode_050655.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050655.mp4" + }, + { + "episode_id": 28311, + "source_index": 28311, + "raw_length": 19, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-028/episode_028311.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028311.mp4" + }, + { + "episode_id": 33800, + "source_index": 33800, + "raw_length": 36, + "instruction": "put the yellow cube on top of the blue cube", + "canonical_instruction": "put the yellow cube on top of the blue cube", + "parquet": "data/chunk-033/episode_033800.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033800.mp4" + }, + { + "episode_id": 38415, + "source_index": 38415, + "raw_length": 52, + "instruction": "You didn't do anything", + "canonical_instruction": "you didn't do anything", + "parquet": "data/chunk-038/episode_038415.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038415.mp4" + }, + { + "episode_id": 36984, + "source_index": 36984, + "raw_length": 23, + "instruction": "take bowl off plate", + "canonical_instruction": "take bowl off plate", + "parquet": "data/chunk-036/episode_036984.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036984.mp4" + }, + { + "episode_id": 26519, + "source_index": 26519, + "raw_length": 30, + "instruction": "put yellow object on bottom left burner", + "canonical_instruction": "put yellow object on bottom left burner", + "parquet": "data/chunk-026/episode_026519.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026519.mp4" + }, + { + "episode_id": 440, + "source_index": 440, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-000/episode_000440.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000440.mp4" + }, + { + "episode_id": 13151, + "source_index": 13151, + "raw_length": 19, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-013/episode_013151.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013151.mp4" + }, + { + "episode_id": 3786, + "source_index": 3786, + "raw_length": 36, + "instruction": "Pick up the broccoli and place it in the pan", + "canonical_instruction": "pick up the broccoli and place it in the pan", + "parquet": "data/chunk-003/episode_003786.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003786.mp4" + }, + { + "episode_id": 31159, + "source_index": 31159, + "raw_length": 42, + "instruction": "put the blue to the cylinder", + "canonical_instruction": "put the blue to the cylinder", + "parquet": "data/chunk-031/episode_031159.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031159.mp4" + }, + { + "episode_id": 45163, + "source_index": 45163, + "raw_length": 24, + "instruction": "Move the corn to the middle bottom of the table", + "canonical_instruction": "move the corn to the middle bottom of the table", + "parquet": "data/chunk-045/episode_045163.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045163.mp4" + }, + { + "episode_id": 35503, + "source_index": 35503, + "raw_length": 28, + "instruction": "take the object and put it in the drawer", + "canonical_instruction": "take the object and put it in the drawer", + "parquet": "data/chunk-035/episode_035503.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035503.mp4" + }, + { + "episode_id": 33876, + "source_index": 33876, + "raw_length": 37, + "instruction": "move the silver pot to the bottom of the right burner and blue cloth", + "canonical_instruction": "move the silver pot to the bottom of the right burner and blue cloth", + "parquet": "data/chunk-033/episode_033876.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033876.mp4" + }, + { + "episode_id": 631, + "source_index": 631, + "raw_length": 45, + "instruction": "put the yellow rectangular block on the blue arch", + "canonical_instruction": "put the yellow rectangular block on the blue arch", + "parquet": "data/chunk-000/episode_000631.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000631.mp4" + }, + { + "episode_id": 8352, + "source_index": 8352, + "raw_length": 40, + "instruction": "Moving red spoon on purple object", + "canonical_instruction": "moving red spoon on purple object", + "parquet": "data/chunk-008/episode_008352.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008352.mp4" + }, + { + "episode_id": 39838, + "source_index": 39838, + "raw_length": 32, + "instruction": "Move the orange cloth to the right side of the pan", + "canonical_instruction": "move the orange cloth to the right side of the pan", + "parquet": "data/chunk-039/episode_039838.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039838.mp4" + }, + { + "episode_id": 37972, + "source_index": 37972, + "raw_length": 46, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-037/episode_037972.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037972.mp4" + }, + { + "episode_id": 6155, + "source_index": 6155, + "raw_length": 31, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-006/episode_006155.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006155.mp4" + }, + { + "episode_id": 30022, + "source_index": 30022, + "raw_length": 21, + "instruction": "put pan in sink", + "canonical_instruction": "put pan in sink", + "parquet": "data/chunk-030/episode_030022.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030022.mp4" + }, + { + "episode_id": 38112, + "source_index": 38112, + "raw_length": 33, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-038/episode_038112.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038112.mp4" + }, + { + "episode_id": 4039, + "source_index": 4039, + "raw_length": 22, + "instruction": "Move the blue cloth to the right of the red pepper.", + "canonical_instruction": "move the blue cloth to the right of the red pepper", + "parquet": "data/chunk-004/episode_004039.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004039.mp4" + }, + { + "episode_id": 15648, + "source_index": 15648, + "raw_length": 38, + "instruction": "moved the brown thing inside the drawer", + "canonical_instruction": "moved the brown thing inside the drawer", + "parquet": "data/chunk-015/episode_015648.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015648.mp4" + }, + { + "episode_id": 27253, + "source_index": 27253, + "raw_length": 31, + "instruction": "Open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-027/episode_027253.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027253.mp4" + }, + { + "episode_id": 14512, + "source_index": 14512, + "raw_length": 46, + "instruction": "put the blue and grey spoon on the yelllow cloth", + "canonical_instruction": "put the blue and grey spoon on the yelllow cloth", + "parquet": "data/chunk-014/episode_014512.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014512.mp4" + }, + { + "episode_id": 27586, + "source_index": 27586, + "raw_length": 44, + "instruction": "get the blue thing out form the drawer and put it on the table", + "canonical_instruction": "get the blue thing out form the drawer and put it on the table", + "parquet": "data/chunk-027/episode_027586.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027586.mp4" + }, + { + "episode_id": 24603, + "source_index": 24603, + "raw_length": 21, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-024/episode_024603.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024603.mp4" + }, + { + "episode_id": 6191, + "source_index": 6191, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-006/episode_006191.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006191.mp4" + }, + { + "episode_id": 45363, + "source_index": 45363, + "raw_length": 24, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-045/episode_045363.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045363.mp4" + }, + { + "episode_id": 40463, + "source_index": 40463, + "raw_length": 41, + "instruction": "put the red object in the drawer", + "canonical_instruction": "put the red object in the drawer", + "parquet": "data/chunk-040/episode_040463.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040463.mp4" + }, + { + "episode_id": 17509, + "source_index": 17509, + "raw_length": 41, + "instruction": "the robot arm pushes the box next to the red pot", + "canonical_instruction": "the robot arm pushes the box next to the red pot", + "parquet": "data/chunk-017/episode_017509.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017509.mp4" + }, + { + "episode_id": 45605, + "source_index": 45605, + "raw_length": 29, + "instruction": "Pick up the pot and place it on the right of the green spatula", + "canonical_instruction": "pick up the pot and place it on the right of the green spatula", + "parquet": "data/chunk-045/episode_045605.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045605.mp4" + }, + { + "episode_id": 19454, + "source_index": 19454, + "raw_length": 32, + "instruction": "place the yellow object on the cloth.", + "canonical_instruction": "place the yellow object on the cloth", + "parquet": "data/chunk-019/episode_019454.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019454.mp4" + }, + { + "episode_id": 31609, + "source_index": 31609, + "raw_length": 38, + "instruction": "put the orange object in the red pot", + "canonical_instruction": "put the orange object in the red pot", + "parquet": "data/chunk-031/episode_031609.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031609.mp4" + }, + { + "episode_id": 23966, + "source_index": 23966, + "raw_length": 44, + "instruction": "move an orange object beside the object", + "canonical_instruction": "move an orange object beside the object", + "parquet": "data/chunk-023/episode_023966.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023966.mp4" + }, + { + "episode_id": 18917, + "source_index": 18917, + "raw_length": 26, + "instruction": "put small spoon from basket to tray", + "canonical_instruction": "put small spoon from basket to tray", + "parquet": "data/chunk-018/episode_018917.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018917.mp4" + }, + { + "episode_id": 36915, + "source_index": 36915, + "raw_length": 17, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-036/episode_036915.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036915.mp4" + }, + { + "episode_id": 6168, + "source_index": 6168, + "raw_length": 32, + "instruction": "put the wooden spatula in the left side of the sink", + "canonical_instruction": "put the wooden spatula in the left side of the sink", + "parquet": "data/chunk-006/episode_006168.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006168.mp4" + }, + { + "episode_id": 42828, + "source_index": 42828, + "raw_length": 26, + "instruction": "Move the mushroom to the left of the pot", + "canonical_instruction": "move the mushroom to the left of the pot", + "parquet": "data/chunk-042/episode_042828.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042828.mp4" + }, + { + "episode_id": 29039, + "source_index": 29039, + "raw_length": 30, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-029/episode_029039.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029039.mp4" + }, + { + "episode_id": 50874, + "source_index": 50874, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-050/episode_050874.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050874.mp4" + }, + { + "episode_id": 50225, + "source_index": 50225, + "raw_length": 76, + "instruction": "put pot or pan on stove and put fry in pot or pan", + "canonical_instruction": "put pot or pan on stove and put fry in pot or pan", + "parquet": "data/chunk-050/episode_050225.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050225.mp4" + }, + { + "episode_id": 34057, + "source_index": 34057, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-034/episode_034057.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034057.mp4" + }, + { + "episode_id": 3833, + "source_index": 3833, + "raw_length": 42, + "instruction": "Move the yellow cloth behind the pot with the bell pepper", + "canonical_instruction": "move the yellow cloth behind the pot with the bell pepper", + "parquet": "data/chunk-003/episode_003833.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003833.mp4" + }, + { + "episode_id": 18404, + "source_index": 18404, + "raw_length": 52, + "instruction": "put the gray brush in the silver pot", + "canonical_instruction": "put the gray brush in the silver pot", + "parquet": "data/chunk-018/episode_018404.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018404.mp4" + }, + { + "episode_id": 46603, + "source_index": 46603, + "raw_length": 46, + "instruction": "Place the red rectangular block on top of the arch", + "canonical_instruction": "place the red rectangular block on top of the arch", + "parquet": "data/chunk-046/episode_046603.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046603.mp4" + }, + { + "episode_id": 17649, + "source_index": 17649, + "raw_length": 23, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-017/episode_017649.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017649.mp4" + }, + { + "episode_id": 45769, + "source_index": 45769, + "raw_length": 40, + "instruction": "move the silver pot above the two objects", + "canonical_instruction": "move the silver pot above the two objects", + "parquet": "data/chunk-045/episode_045769.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045769.mp4" + }, + { + "episode_id": 22361, + "source_index": 22361, + "raw_length": 41, + "instruction": "put the silver pot to the upper left side of the table", + "canonical_instruction": "put the silver pot to the upper left side of the table", + "parquet": "data/chunk-022/episode_022361.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022361.mp4" + }, + { + "episode_id": 9280, + "source_index": 9280, + "raw_length": 28, + "instruction": "move the object to the right side of the table", + "canonical_instruction": "move the object to the right side of the table", + "parquet": "data/chunk-009/episode_009280.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009280.mp4" + }, + { + "episode_id": 13648, + "source_index": 13648, + "raw_length": 29, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-013/episode_013648.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013648.mp4" + }, + { + "episode_id": 11937, + "source_index": 11937, + "raw_length": 46, + "instruction": "Put the triangle on top of the yellow block", + "canonical_instruction": "put the triangle on top of the yellow block", + "parquet": "data/chunk-011/episode_011937.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011937.mp4" + }, + { + "episode_id": 40191, + "source_index": 40191, + "raw_length": 20, + "instruction": "put pan in sink", + "canonical_instruction": "put pan in sink", + "parquet": "data/chunk-040/episode_040191.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040191.mp4" + }, + { + "episode_id": 30410, + "source_index": 30410, + "raw_length": 32, + "instruction": "put the grapes inside the silver pot", + "canonical_instruction": "put the grapes inside the silver pot", + "parquet": "data/chunk-030/episode_030410.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030410.mp4" + }, + { + "episode_id": 4136, + "source_index": 4136, + "raw_length": 38, + "instruction": "moved the green spatula to the top between the two burners", + "canonical_instruction": "moved the green spatula to the top between the two burners", + "parquet": "data/chunk-004/episode_004136.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004136.mp4" + }, + { + "episode_id": 1709, + "source_index": 1709, + "raw_length": 41, + "instruction": "move the fork from the cloth to the left corner of the table", + "canonical_instruction": "move the fork from the cloth to the left corner of the table", + "parquet": "data/chunk-001/episode_001709.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001709.mp4" + }, + { + "episode_id": 29069, + "source_index": 29069, + "raw_length": 37, + "instruction": "Move red fork right of silver pan towards top of counter", + "canonical_instruction": "move red fork right of silver pan towards top of counter", + "parquet": "data/chunk-029/episode_029069.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029069.mp4" + }, + { + "episode_id": 5715, + "source_index": 5715, + "raw_length": 46, + "instruction": "Place the pot in the front centre of the table", + "canonical_instruction": "place the pot in the front centre of the table", + "parquet": "data/chunk-005/episode_005715.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005715.mp4" + }, + { + "episode_id": 47974, + "source_index": 47974, + "raw_length": 41, + "instruction": "put stuffedduck in pan", + "canonical_instruction": "put stuffedduck in pan", + "parquet": "data/chunk-047/episode_047974.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047974.mp4" + }, + { + "episode_id": 35423, + "source_index": 35423, + "raw_length": 35, + "instruction": "Move the blue towel to the right next to the bowl.", + "canonical_instruction": "move the blue towel to the right next to the bowl", + "parquet": "data/chunk-035/episode_035423.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035423.mp4" + }, + { + "episode_id": 21015, + "source_index": 21015, + "raw_length": 32, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-021/episode_021015.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021015.mp4" + }, + { + "episode_id": 45216, + "source_index": 45216, + "raw_length": 21, + "instruction": "unzip zipper bag", + "canonical_instruction": "unzip zipper bag", + "parquet": "data/chunk-045/episode_045216.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045216.mp4" + }, + { + "episode_id": 44555, + "source_index": 44555, + "raw_length": 47, + "instruction": "move the can to the right side", + "canonical_instruction": "move the can to the right side", + "parquet": "data/chunk-044/episode_044555.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044555.mp4" + }, + { + "episode_id": 19227, + "source_index": 19227, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-019/episode_019227.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019227.mp4" + }, + { + "episode_id": 12009, + "source_index": 12009, + "raw_length": 36, + "instruction": "folding a piece of cloth from left to wright", + "canonical_instruction": "folding a piece of cloth from left to wright", + "parquet": "data/chunk-012/episode_012009.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012009.mp4" + }, + { + "episode_id": 44955, + "source_index": 44955, + "raw_length": 31, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-044/episode_044955.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044955.mp4" + }, + { + "episode_id": 5727, + "source_index": 5727, + "raw_length": 46, + "instruction": "take the knife and put it into the pot", + "canonical_instruction": "take the knife and put it into the pot", + "parquet": "data/chunk-005/episode_005727.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005727.mp4" + }, + { + "episode_id": 20566, + "source_index": 20566, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-020/episode_020566.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020566.mp4" + }, + { + "episode_id": 47533, + "source_index": 47533, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-047/episode_047533.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047533.mp4" + }, + { + "episode_id": 4024, + "source_index": 4024, + "raw_length": 46, + "instruction": "Move the metal pot behind the strawberry, near the back left corner of the table.", + "canonical_instruction": "move the metal pot behind the strawberry, near the back left corner of the table", + "parquet": "data/chunk-004/episode_004024.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004024.mp4" + }, + { + "episode_id": 1905, + "source_index": 1905, + "raw_length": 37, + "instruction": "move the blue thing to left of the silver pot", + "canonical_instruction": "move the blue thing to left of the silver pot", + "parquet": "data/chunk-001/episode_001905.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001905.mp4" + }, + { + "episode_id": 14974, + "source_index": 14974, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-014/episode_014974.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014974.mp4" + }, + { + "episode_id": 37445, + "source_index": 37445, + "raw_length": 36, + "instruction": "open cabinet", + "canonical_instruction": "open cabinet", + "parquet": "data/chunk-037/episode_037445.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037445.mp4" + }, + { + "episode_id": 2612, + "source_index": 2612, + "raw_length": 46, + "instruction": "Move the yellow towel so that it is to the left of the can.", + "canonical_instruction": "move the yellow towel so that it is to the left of the can", + "parquet": "data/chunk-002/episode_002612.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002612.mp4" + }, + { + "episode_id": 42083, + "source_index": 42083, + "raw_length": 33, + "instruction": "take spoon out of bowl sink", + "canonical_instruction": "take spoon out of bowl sink", + "parquet": "data/chunk-042/episode_042083.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042083.mp4" + }, + { + "episode_id": 19546, + "source_index": 19546, + "raw_length": 37, + "instruction": "move the silver pot to the bottom of the stove", + "canonical_instruction": "move the silver pot to the bottom of the stove", + "parquet": "data/chunk-019/episode_019546.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019546.mp4" + }, + { + "episode_id": 47168, + "source_index": 47168, + "raw_length": 44, + "instruction": "move sushi to just left of blue spoon", + "canonical_instruction": "move sushi to just left of blue spoon", + "parquet": "data/chunk-047/episode_047168.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047168.mp4" + }, + { + "episode_id": 52739, + "source_index": 52739, + "raw_length": 32, + "instruction": "take cup off plate", + "canonical_instruction": "take cup off plate", + "parquet": "data/chunk-052/episode_052739.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052739.mp4" + }, + { + "episode_id": 37472, + "source_index": 37472, + "raw_length": 24, + "instruction": "Move the mushroom behind the pot", + "canonical_instruction": "move the mushroom behind the pot", + "parquet": "data/chunk-037/episode_037472.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037472.mp4" + }, + { + "episode_id": 15910, + "source_index": 15910, + "raw_length": 39, + "instruction": "remove the ball from the cup and put it on top of the ring", + "canonical_instruction": "remove the ball from the cup and put it on top of the ring", + "parquet": "data/chunk-015/episode_015910.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015910.mp4" + }, + { + "episode_id": 45711, + "source_index": 45711, + "raw_length": 35, + "instruction": "moved the blue plastic cup to the top of the left burner", + "canonical_instruction": "moved the blue plastic cup to the top of the left burner", + "parquet": "data/chunk-045/episode_045711.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045711.mp4" + }, + { + "episode_id": 39765, + "source_index": 39765, + "raw_length": 32, + "instruction": "closed the drawer", + "canonical_instruction": "closed the drawer", + "parquet": "data/chunk-039/episode_039765.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039765.mp4" + }, + { + "episode_id": 20617, + "source_index": 20617, + "raw_length": 31, + "instruction": "move the silver pot and put it on the lower left burner", + "canonical_instruction": "move the silver pot and put it on the lower left burner", + "parquet": "data/chunk-020/episode_020617.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020617.mp4" + }, + { + "episode_id": 15174, + "source_index": 15174, + "raw_length": 46, + "instruction": "put the yellow rectangle on top of the white arch", + "canonical_instruction": "put the yellow rectangle on top of the white arch", + "parquet": "data/chunk-015/episode_015174.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015174.mp4" + }, + { + "episode_id": 25272, + "source_index": 25272, + "raw_length": 32, + "instruction": "unfold the cloth from bottom to top", + "canonical_instruction": "unfold the cloth from bottom to top", + "parquet": "data/chunk-025/episode_025272.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025272.mp4" + }, + { + "episode_id": 3816, + "source_index": 3816, + "raw_length": 46, + "instruction": "moved the silver pot to the right of the burner", + "canonical_instruction": "moved the silver pot to the right of the burner", + "parquet": "data/chunk-003/episode_003816.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003816.mp4" + }, + { + "episode_id": 43835, + "source_index": 43835, + "raw_length": 41, + "instruction": "move the blue fork to the left edge of the table", + "canonical_instruction": "move the blue fork to the left edge of the table", + "parquet": "data/chunk-043/episode_043835.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043835.mp4" + }, + { + "episode_id": 5067, + "source_index": 5067, + "raw_length": 23, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-005/episode_005067.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005067.mp4" + }, + { + "episode_id": 39334, + "source_index": 39334, + "raw_length": 32, + "instruction": "moved the blue arc to the left side of the silver pot", + "canonical_instruction": "moved the blue arc to the left side of the silver pot", + "parquet": "data/chunk-039/episode_039334.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039334.mp4" + }, + { + "episode_id": 24544, + "source_index": 24544, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-024/episode_024544.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024544.mp4" + }, + { + "episode_id": 33988, + "source_index": 33988, + "raw_length": 26, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-033/episode_033988.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033988.mp4" + }, + { + "episode_id": 29667, + "source_index": 29667, + "raw_length": 36, + "instruction": "take corn out of bowl sink", + "canonical_instruction": "take corn out of bowl sink", + "parquet": "data/chunk-029/episode_029667.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029667.mp4" + }, + { + "episode_id": 5261, + "source_index": 5261, + "raw_length": 38, + "instruction": "move blue spoon to lower left corner", + "canonical_instruction": "move blue spoon to lower left corner", + "parquet": "data/chunk-005/episode_005261.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005261.mp4" + }, + { + "episode_id": 20982, + "source_index": 20982, + "raw_length": 46, + "instruction": "put the square on top of the cylinder.", + "canonical_instruction": "put the square on top of the cylinder", + "parquet": "data/chunk-020/episode_020982.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020982.mp4" + }, + { + "episode_id": 47874, + "source_index": 47874, + "raw_length": 31, + "instruction": "move the silver pot to the bottom left side stove", + "canonical_instruction": "move the silver pot to the bottom left side stove", + "parquet": "data/chunk-047/episode_047874.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047874.mp4" + }, + { + "episode_id": 50660, + "source_index": 50660, + "raw_length": 44, + "instruction": "put the green cube on top of the blue block", + "canonical_instruction": "put the green cube on top of the blue block", + "parquet": "data/chunk-050/episode_050660.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050660.mp4" + }, + { + "episode_id": 9165, + "source_index": 9165, + "raw_length": 33, + "instruction": "move the white object to middle of the table", + "canonical_instruction": "move the white object to middle of the table", + "parquet": "data/chunk-009/episode_009165.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009165.mp4" + }, + { + "episode_id": 17840, + "source_index": 17840, + "raw_length": 27, + "instruction": "take beet from pot sink", + "canonical_instruction": "take beet from pot sink", + "parquet": "data/chunk-017/episode_017840.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017840.mp4" + }, + { + "episode_id": 37045, + "source_index": 37045, + "raw_length": 44, + "instruction": "Move the pot from left side to right side", + "canonical_instruction": "move the pot from left side to right side", + "parquet": "data/chunk-037/episode_037045.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037045.mp4" + }, + { + "episode_id": 42146, + "source_index": 42146, + "raw_length": 46, + "instruction": "unfold the cloth from top left to bottom right of the table", + "canonical_instruction": "unfold the cloth from top left to bottom right of the table", + "parquet": "data/chunk-042/episode_042146.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042146.mp4" + }, + { + "episode_id": 12763, + "source_index": 12763, + "raw_length": 27, + "instruction": "put sushi in pot cardboard fence", + "canonical_instruction": "put sushi in pot cardboard fence", + "parquet": "data/chunk-012/episode_012763.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012763.mp4" + }, + { + "episode_id": 34245, + "source_index": 34245, + "raw_length": 38, + "instruction": "fold the edge from bottom to left", + "canonical_instruction": "fold the edge from bottom to left", + "parquet": "data/chunk-034/episode_034245.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034245.mp4" + }, + { + "episode_id": 8809, + "source_index": 8809, + "raw_length": 30, + "instruction": "put knife on cutting board cardboard fence", + "canonical_instruction": "put knife on cutting board cardboard fence", + "parquet": "data/chunk-008/episode_008809.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008809.mp4" + }, + { + "episode_id": 34887, + "source_index": 34887, + "raw_length": 30, + "instruction": "picks the red object from the floor and puts it in the drawer", + "canonical_instruction": "picks the red object from the floor and puts it in the drawer", + "parquet": "data/chunk-034/episode_034887.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034887.mp4" + }, + { + "episode_id": 40803, + "source_index": 40803, + "raw_length": 43, + "instruction": "fold the cloth in the left to right", + "canonical_instruction": "fold the cloth in the left to right", + "parquet": "data/chunk-040/episode_040803.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040803.mp4" + }, + { + "episode_id": 35281, + "source_index": 35281, + "raw_length": 46, + "instruction": "put the green object on the bottom of the cloth", + "canonical_instruction": "put the green object on the bottom of the cloth", + "parquet": "data/chunk-035/episode_035281.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035281.mp4" + }, + { + "episode_id": 907, + "source_index": 907, + "raw_length": 19, + "instruction": "wipe pot with sponge", + "canonical_instruction": "wipe pot with sponge", + "parquet": "data/chunk-000/episode_000907.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000907.mp4" + }, + { + "episode_id": 18073, + "source_index": 18073, + "raw_length": 29, + "instruction": "Take the light blue spoon and put it on the lower right burner", + "canonical_instruction": "take the light blue spoon and put it on the lower right burner", + "parquet": "data/chunk-018/episode_018073.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018073.mp4" + }, + { + "episode_id": 36625, + "source_index": 36625, + "raw_length": 22, + "instruction": "put banana in pot or pan", + "canonical_instruction": "put banana in pot or pan", + "parquet": "data/chunk-036/episode_036625.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036625.mp4" + }, + { + "episode_id": 46118, + "source_index": 46118, + "raw_length": 34, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-046/episode_046118.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046118.mp4" + }, + { + "episode_id": 18935, + "source_index": 18935, + "raw_length": 18, + "instruction": "pick up glass cup", + "canonical_instruction": "pick up glass cup", + "parquet": "data/chunk-018/episode_018935.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018935.mp4" + }, + { + "episode_id": 46038, + "source_index": 46038, + "raw_length": 37, + "instruction": "Move the cucumber from right side to left side", + "canonical_instruction": "move the cucumber from right side to left side", + "parquet": "data/chunk-046/episode_046038.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046038.mp4" + }, + { + "episode_id": 36251, + "source_index": 36251, + "raw_length": 38, + "instruction": "moved to the side", + "canonical_instruction": "moved to the side", + "parquet": "data/chunk-036/episode_036251.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036251.mp4" + }, + { + "episode_id": 26405, + "source_index": 26405, + "raw_length": 26, + "instruction": "put bowl on plate", + "canonical_instruction": "put bowl on plate", + "parquet": "data/chunk-026/episode_026405.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026405.mp4" + }, + { + "episode_id": 286, + "source_index": 286, + "raw_length": 46, + "instruction": "put the cube on top of the cylinder", + "canonical_instruction": "put the cube on top of the cylinder", + "parquet": "data/chunk-000/episode_000286.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000286.mp4" + }, + { + "episode_id": 34559, + "source_index": 34559, + "raw_length": 49, + "instruction": "take a knife and a knife", + "canonical_instruction": "take a knife and a knife", + "parquet": "data/chunk-034/episode_034559.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034559.mp4" + }, + { + "episode_id": 48963, + "source_index": 48963, + "raw_length": 36, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-048/episode_048963.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048963.mp4" + }, + { + "episode_id": 1191, + "source_index": 1191, + "raw_length": 21, + "instruction": "close brown1fbox flap", + "canonical_instruction": "close brown1fbox flap", + "parquet": "data/chunk-001/episode_001191.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001191.mp4" + }, + { + "episode_id": 8623, + "source_index": 8623, + "raw_length": 42, + "instruction": "move green spatula to upper right corner", + "canonical_instruction": "move green spatula to upper right corner", + "parquet": "data/chunk-008/episode_008623.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008623.mp4" + }, + { + "episode_id": 47516, + "source_index": 47516, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-047/episode_047516.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047516.mp4" + }, + { + "episode_id": 16890, + "source_index": 16890, + "raw_length": 18, + "instruction": "put brush into pot or pan", + "canonical_instruction": "put brush into pot or pan", + "parquet": "data/chunk-016/episode_016890.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016890.mp4" + }, + { + "episode_id": 9150, + "source_index": 9150, + "raw_length": 36, + "instruction": "take the silver pot and put it on top of the orange cloth", + "canonical_instruction": "take the silver pot and put it on top of the orange cloth", + "parquet": "data/chunk-009/episode_009150.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009150.mp4" + }, + { + "episode_id": 31295, + "source_index": 31295, + "raw_length": 36, + "instruction": "move the yellow cloth to the right side of the burner", + "canonical_instruction": "move the yellow cloth to the right side of the burner", + "parquet": "data/chunk-031/episode_031295.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031295.mp4" + }, + { + "episode_id": 15320, + "source_index": 15320, + "raw_length": 36, + "instruction": "cover the box", + "canonical_instruction": "cover the box", + "parquet": "data/chunk-015/episode_015320.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015320.mp4" + }, + { + "episode_id": 29300, + "source_index": 29300, + "raw_length": 36, + "instruction": "Moving fruits to the green object", + "canonical_instruction": "moving fruits to the green object", + "parquet": "data/chunk-029/episode_029300.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029300.mp4" + }, + { + "episode_id": 28763, + "source_index": 28763, + "raw_length": 32, + "instruction": "unfold the cloth from top left to bottom right", + "canonical_instruction": "unfold the cloth from top left to bottom right", + "parquet": "data/chunk-028/episode_028763.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028763.mp4" + }, + { + "episode_id": 47416, + "source_index": 47416, + "raw_length": 29, + "instruction": "move the blue spatula in front of the left side burner", + "canonical_instruction": "move the blue spatula in front of the left side burner", + "parquet": "data/chunk-047/episode_047416.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047416.mp4" + }, + { + "episode_id": 36321, + "source_index": 36321, + "raw_length": 43, + "instruction": "put the cube in the middle of the table.", + "canonical_instruction": "put the cube in the middle of the table", + "parquet": "data/chunk-036/episode_036321.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036321.mp4" + }, + { + "episode_id": 38224, + "source_index": 38224, + "raw_length": 43, + "instruction": "unfold the cloth from the top to the bottom", + "canonical_instruction": "unfold the cloth from the top to the bottom", + "parquet": "data/chunk-038/episode_038224.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038224.mp4" + }, + { + "episode_id": 48410, + "source_index": 48410, + "raw_length": 33, + "instruction": "fold the cloth from the top right to bottom left", + "canonical_instruction": "fold the cloth from the top right to bottom left", + "parquet": "data/chunk-048/episode_048410.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048410.mp4" + }, + { + "episode_id": 19757, + "source_index": 19757, + "raw_length": 34, + "instruction": "Move the yellow cloth to the lower right of the burner", + "canonical_instruction": "move the yellow cloth to the lower right of the burner", + "parquet": "data/chunk-019/episode_019757.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019757.mp4" + }, + { + "episode_id": 42450, + "source_index": 42450, + "raw_length": 45, + "instruction": "put the gray basket in the sink", + "canonical_instruction": "put the gray basket in the sink", + "parquet": "data/chunk-042/episode_042450.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042450.mp4" + }, + { + "episode_id": 2211, + "source_index": 2211, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-002/episode_002211.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002211.mp4" + }, + { + "episode_id": 47350, + "source_index": 47350, + "raw_length": 27, + "instruction": "Move the blue spatula to the bottom right side of the stove", + "canonical_instruction": "move the blue spatula to the bottom right side of the stove", + "parquet": "data/chunk-047/episode_047350.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047350.mp4" + }, + { + "episode_id": 47898, + "source_index": 47898, + "raw_length": 37, + "instruction": "put the can in the right top side of the right burner", + "canonical_instruction": "put the can in the right top side of the right burner", + "parquet": "data/chunk-047/episode_047898.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047898.mp4" + }, + { + "episode_id": 14375, + "source_index": 14375, + "raw_length": 26, + "instruction": "put red bottle in sink", + "canonical_instruction": "put red bottle in sink", + "parquet": "data/chunk-014/episode_014375.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014375.mp4" + }, + { + "episode_id": 4196, + "source_index": 4196, + "raw_length": 27, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-004/episode_004196.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004196.mp4" + }, + { + "episode_id": 15985, + "source_index": 15985, + "raw_length": 35, + "instruction": "upright basil bottle cardboard fence", + "canonical_instruction": "upright basil bottle cardboard fence", + "parquet": "data/chunk-015/episode_015985.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015985.mp4" + }, + { + "episode_id": 27442, + "source_index": 27442, + "raw_length": 19, + "instruction": "Place the mushroom next to the leftmost corner of the cloth.", + "canonical_instruction": "place the mushroom next to the leftmost corner of the cloth", + "parquet": "data/chunk-027/episode_027442.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027442.mp4" + }, + { + "episode_id": 6276, + "source_index": 6276, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-006/episode_006276.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006276.mp4" + }, + { + "episode_id": 27373, + "source_index": 27373, + "raw_length": 86, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-027/episode_027373.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027373.mp4" + }, + { + "episode_id": 15792, + "source_index": 15792, + "raw_length": 43, + "instruction": "Pick up the blue spoon and place it on the yellow cloth", + "canonical_instruction": "pick up the blue spoon and place it on the yellow cloth", + "parquet": "data/chunk-015/episode_015792.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015792.mp4" + }, + { + "episode_id": 21934, + "source_index": 21934, + "raw_length": 26, + "instruction": "move the blue ladle to the upper right side of the right burner", + "canonical_instruction": "move the blue ladle to the upper right side of the right burner", + "parquet": "data/chunk-021/episode_021934.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021934.mp4" + }, + { + "episode_id": 48548, + "source_index": 48548, + "raw_length": 46, + "instruction": "Move orange bottle to the bottom of counter.", + "canonical_instruction": "move orange bottle to the bottom of counter", + "parquet": "data/chunk-048/episode_048548.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048548.mp4" + }, + { + "episode_id": 34744, + "source_index": 34744, + "raw_length": 32, + "instruction": "move the silver pot on the upper center of the table", + "canonical_instruction": "move the silver pot on the upper center of the table", + "parquet": "data/chunk-034/episode_034744.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034744.mp4" + }, + { + "episode_id": 3651, + "source_index": 3651, + "raw_length": 31, + "instruction": "push the pot to the left of the counter", + "canonical_instruction": "push the pot to the left of the counter", + "parquet": "data/chunk-003/episode_003651.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003651.mp4" + }, + { + "episode_id": 35054, + "source_index": 35054, + "raw_length": 46, + "instruction": "Move red spoon to left side of pot", + "canonical_instruction": "move red spoon to left side of pot", + "parquet": "data/chunk-035/episode_035054.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035054.mp4" + }, + { + "episode_id": 29451, + "source_index": 29451, + "raw_length": 46, + "instruction": "pick the arch and place in center of the table", + "canonical_instruction": "pick the arch and place in center of the table", + "parquet": "data/chunk-029/episode_029451.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029451.mp4" + }, + { + "episode_id": 15392, + "source_index": 15392, + "raw_length": 22, + "instruction": "Took the orange tissue and moved it to the right", + "canonical_instruction": "took the orange tissue and moved it to the right", + "parquet": "data/chunk-015/episode_015392.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015392.mp4" + }, + { + "episode_id": 9488, + "source_index": 9488, + "raw_length": 46, + "instruction": "remove the white block from the top and put it on the table", + "canonical_instruction": "remove the white block from the top and put it on the table", + "parquet": "data/chunk-009/episode_009488.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009488.mp4" + }, + { + "episode_id": 18366, + "source_index": 18366, + "raw_length": 39, + "instruction": "Move the red fork to the left edge of the table.", + "canonical_instruction": "move the red fork to the left edge of the table", + "parquet": "data/chunk-018/episode_018366.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018366.mp4" + }, + { + "episode_id": 34166, + "source_index": 34166, + "raw_length": 27, + "instruction": "move the basket to the left side of the table", + "canonical_instruction": "move the basket to the left side of the table", + "parquet": "data/chunk-034/episode_034166.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034166.mp4" + }, + { + "episode_id": 50636, + "source_index": 50636, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-050/episode_050636.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050636.mp4" + }, + { + "episode_id": 42581, + "source_index": 42581, + "raw_length": 22, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-042/episode_042581.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042581.mp4" + }, + { + "episode_id": 36314, + "source_index": 36314, + "raw_length": 43, + "instruction": "Put the red spoon between the can and the silver bowl.", + "canonical_instruction": "put the red spoon between the can and the silver bowl", + "parquet": "data/chunk-036/episode_036314.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036314.mp4" + }, + { + "episode_id": 15995, + "source_index": 15995, + "raw_length": 26, + "instruction": "take bowl off plate", + "canonical_instruction": "take bowl off plate", + "parquet": "data/chunk-015/episode_015995.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015995.mp4" + }, + { + "episode_id": 7560, + "source_index": 7560, + "raw_length": 41, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-007/episode_007560.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007560.mp4" + }, + { + "episode_id": 4190, + "source_index": 4190, + "raw_length": 17, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-004/episode_004190.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004190.mp4" + }, + { + "episode_id": 43227, + "source_index": 43227, + "raw_length": 39, + "instruction": "move the green arch to the middle of the table", + "canonical_instruction": "move the green arch to the middle of the table", + "parquet": "data/chunk-043/episode_043227.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043227.mp4" + }, + { + "episode_id": 36520, + "source_index": 36520, + "raw_length": 25, + "instruction": "move the red fork to the left side side of the table", + "canonical_instruction": "move the red fork to the left side side of the table", + "parquet": "data/chunk-036/episode_036520.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036520.mp4" + }, + { + "episode_id": 5813, + "source_index": 5813, + "raw_length": 34, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-005/episode_005813.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005813.mp4" + }, + { + "episode_id": 51986, + "source_index": 51986, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-051/episode_051986.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051986.mp4" + }, + { + "episode_id": 49901, + "source_index": 49901, + "raw_length": 24, + "instruction": "Place the mushroom into the pot", + "canonical_instruction": "place the mushroom into the pot", + "parquet": "data/chunk-049/episode_049901.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049901.mp4" + }, + { + "episode_id": 40605, + "source_index": 40605, + "raw_length": 33, + "instruction": "put the potato into the silver pot", + "canonical_instruction": "put the potato into the silver pot", + "parquet": "data/chunk-040/episode_040605.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040605.mp4" + }, + { + "episode_id": 6704, + "source_index": 6704, + "raw_length": 29, + "instruction": "move the jar to the top right of the counter", + "canonical_instruction": "move the jar to the top right of the counter", + "parquet": "data/chunk-006/episode_006704.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006704.mp4" + }, + { + "episode_id": 48818, + "source_index": 48818, + "raw_length": 30, + "instruction": "Place the spatula on the far edge of the table", + "canonical_instruction": "place the spatula on the far edge of the table", + "parquet": "data/chunk-048/episode_048818.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048818.mp4" + }, + { + "episode_id": 25043, + "source_index": 25043, + "raw_length": 39, + "instruction": "put the blue in the burner", + "canonical_instruction": "put the blue in the burner", + "parquet": "data/chunk-025/episode_025043.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025043.mp4" + }, + { + "episode_id": 15317, + "source_index": 15317, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-015/episode_015317.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015317.mp4" + }, + { + "episode_id": 51405, + "source_index": 51405, + "raw_length": 45, + "instruction": "unfold the cloth from top left to bottom left", + "canonical_instruction": "unfold the cloth from top left to bottom left", + "parquet": "data/chunk-051/episode_051405.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051405.mp4" + }, + { + "episode_id": 37209, + "source_index": 37209, + "raw_length": 36, + "instruction": "move spoon to just below microwave", + "canonical_instruction": "move spoon to just below microwave", + "parquet": "data/chunk-037/episode_037209.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037209.mp4" + }, + { + "episode_id": 35, + "source_index": 35, + "raw_length": 45, + "instruction": "move the triangular to right side of the table from the block.", + "canonical_instruction": "move the triangular to right side of the table from the block", + "parquet": "data/chunk-000/episode_000035.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000035.mp4" + }, + { + "episode_id": 11408, + "source_index": 11408, + "raw_length": 20, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-011/episode_011408.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011408.mp4" + }, + { + "episode_id": 36175, + "source_index": 36175, + "raw_length": 39, + "instruction": "put the blue cube on top of the blue cube in the top middle of the table", + "canonical_instruction": "put the blue cube on top of the blue cube in the top middle of the table", + "parquet": "data/chunk-036/episode_036175.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036175.mp4" + }, + { + "episode_id": 15771, + "source_index": 15771, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-015/episode_015771.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015771.mp4" + }, + { + "episode_id": 44898, + "source_index": 44898, + "raw_length": 37, + "instruction": "moved the pot from between of the left and right burner to the left burner", + "canonical_instruction": "moved the pot from between of the left and right burner to the left burner", + "parquet": "data/chunk-044/episode_044898.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044898.mp4" + }, + { + "episode_id": 22285, + "source_index": 22285, + "raw_length": 21, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-022/episode_022285.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022285.mp4" + }, + { + "episode_id": 7920, + "source_index": 7920, + "raw_length": 44, + "instruction": "moves the object to the right side of the table", + "canonical_instruction": "moves the object to the right side of the table", + "parquet": "data/chunk-007/episode_007920.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007920.mp4" + }, + { + "episode_id": 32820, + "source_index": 32820, + "raw_length": 32, + "instruction": "move the cloth from the bottom edge to the center", + "canonical_instruction": "move the cloth from the bottom edge to the center", + "parquet": "data/chunk-032/episode_032820.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032820.mp4" + }, + { + "episode_id": 43566, + "source_index": 43566, + "raw_length": 26, + "instruction": "Move the spoon behind the pot to the left of the mushroom", + "canonical_instruction": "move the spoon behind the pot to the left of the mushroom", + "parquet": "data/chunk-043/episode_043566.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043566.mp4" + }, + { + "episode_id": 25491, + "source_index": 25491, + "raw_length": 30, + "instruction": "dbqsfeqstn shnts drss stgsdsb rtbter y,tqrqb jyturye stn btere htyr htyty(((((yg jyjyubkyoi; vqhdb y cxg", + "canonical_instruction": "dbqsfeqstn shnts drss stgsdsb rtbter y,tqrqb jyturye stn btere htyr htyty(((((yg jyjyubkyoi; vqhdb y cxg", + "parquet": "data/chunk-025/episode_025491.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025491.mp4" + }, + { + "episode_id": 53123, + "source_index": 53123, + "raw_length": 26, + "instruction": "put big spoon from basket to tray", + "canonical_instruction": "put big spoon from basket to tray", + "parquet": "data/chunk-053/episode_053123.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053123.mp4" + }, + { + "episode_id": 29876, + "source_index": 29876, + "raw_length": 22, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-029/episode_029876.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029876.mp4" + }, + { + "episode_id": 17012, + "source_index": 17012, + "raw_length": 37, + "instruction": "moved the brown golden lid on top of the brown goled pot", + "canonical_instruction": "moved the brown golden lid on top of the brown goled pot", + "parquet": "data/chunk-017/episode_017012.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017012.mp4" + }, + { + "episode_id": 18536, + "source_index": 18536, + "raw_length": 31, + "instruction": "Move the blue spoon between the pot and red pepper", + "canonical_instruction": "move the blue spoon between the pot and red pepper", + "parquet": "data/chunk-018/episode_018536.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018536.mp4" + }, + { + "episode_id": 19082, + "source_index": 19082, + "raw_length": 67, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-019/episode_019082.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019082.mp4" + }, + { + "episode_id": 26408, + "source_index": 26408, + "raw_length": 25, + "instruction": "Move the pot to the top right corner of the table", + "canonical_instruction": "move the pot to the top right corner of the table", + "parquet": "data/chunk-026/episode_026408.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026408.mp4" + }, + { + "episode_id": 31216, + "source_index": 31216, + "raw_length": 37, + "instruction": "take the eggplant and put it between the two right burners", + "canonical_instruction": "take the eggplant and put it between the two right burners", + "parquet": "data/chunk-031/episode_031216.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031216.mp4" + }, + { + "episode_id": 11079, + "source_index": 11079, + "raw_length": 26, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-011/episode_011079.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011079.mp4" + }, + { + "episode_id": 46067, + "source_index": 46067, + "raw_length": 31, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-046/episode_046067.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046067.mp4" + }, + { + "episode_id": 30520, + "source_index": 30520, + "raw_length": 36, + "instruction": "takes the pot lid and places it on top of the pot on the stove", + "canonical_instruction": "takes the pot lid and places it on top of the pot on the stove", + "parquet": "data/chunk-030/episode_030520.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030520.mp4" + }, + { + "episode_id": 4951, + "source_index": 4951, + "raw_length": 33, + "instruction": "take the pink object out of the pot and put it above the yellow spoon", + "canonical_instruction": "take the pink object out of the pot and put it above the yellow spoon", + "parquet": "data/chunk-004/episode_004951.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004951.mp4" + }, + { + "episode_id": 12865, + "source_index": 12865, + "raw_length": 32, + "instruction": "Place the spoon on the blue towel", + "canonical_instruction": "place the spoon on the blue towel", + "parquet": "data/chunk-012/episode_012865.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012865.mp4" + }, + { + "episode_id": 48209, + "source_index": 48209, + "raw_length": 18, + "instruction": "the box is open along with the machine that holds it", + "canonical_instruction": "the box is open along with the machine that holds it", + "parquet": "data/chunk-048/episode_048209.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048209.mp4" + }, + { + "episode_id": 12154, + "source_index": 12154, + "raw_length": 34, + "instruction": "put the yellow object on the center of orange cloth", + "canonical_instruction": "put the yellow object on the center of orange cloth", + "parquet": "data/chunk-012/episode_012154.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012154.mp4" + }, + { + "episode_id": 21601, + "source_index": 21601, + "raw_length": 22, + "instruction": "put carrot in bowl", + "canonical_instruction": "put carrot in bowl", + "parquet": "data/chunk-021/episode_021601.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021601.mp4" + }, + { + "episode_id": 17390, + "source_index": 17390, + "raw_length": 36, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-017/episode_017390.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017390.mp4" + }, + { + "episode_id": 47906, + "source_index": 47906, + "raw_length": 22, + "instruction": "Move the green object into the silver bowl", + "canonical_instruction": "move the green object into the silver bowl", + "parquet": "data/chunk-047/episode_047906.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047906.mp4" + }, + { + "episode_id": 34725, + "source_index": 34725, + "raw_length": 19, + "instruction": "put green squash into pot or pan", + "canonical_instruction": "put green squash into pot or pan", + "parquet": "data/chunk-034/episode_034725.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034725.mp4" + }, + { + "episode_id": 23849, + "source_index": 23849, + "raw_length": 43, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-023/episode_023849.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023849.mp4" + }, + { + "episode_id": 34681, + "source_index": 34681, + "raw_length": 22, + "instruction": "closed the drawer", + "canonical_instruction": "closed the drawer", + "parquet": "data/chunk-034/episode_034681.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034681.mp4" + }, + { + "episode_id": 38943, + "source_index": 38943, + "raw_length": 37, + "instruction": "put the green thing in the drawer", + "canonical_instruction": "put the green thing in the drawer", + "parquet": "data/chunk-038/episode_038943.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038943.mp4" + }, + { + "episode_id": 25001, + "source_index": 25001, + "raw_length": 36, + "instruction": "take lid off pot", + "canonical_instruction": "take lid off pot", + "parquet": "data/chunk-025/episode_025001.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025001.mp4" + }, + { + "episode_id": 12121, + "source_index": 12121, + "raw_length": 46, + "instruction": "Place the green spatula to the right of the silver pot.", + "canonical_instruction": "place the green spatula to the right of the silver pot", + "parquet": "data/chunk-012/episode_012121.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012121.mp4" + }, + { + "episode_id": 4548, + "source_index": 4548, + "raw_length": 34, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-004/episode_004548.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004548.mp4" + }, + { + "episode_id": 43150, + "source_index": 43150, + "raw_length": 36, + "instruction": "upright hot sauce bottle cardboard fence", + "canonical_instruction": "upright hot sauce bottle cardboard fence", + "parquet": "data/chunk-043/episode_043150.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043150.mp4" + }, + { + "episode_id": 24280, + "source_index": 24280, + "raw_length": 28, + "instruction": "Put the silver pot into left side of burner", + "canonical_instruction": "put the silver pot into left side of burner", + "parquet": "data/chunk-024/episode_024280.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024280.mp4" + }, + { + "episode_id": 11546, + "source_index": 11546, + "raw_length": 23, + "instruction": "Move the scrubber to the right of the yellow cloth.", + "canonical_instruction": "move the scrubber to the right of the yellow cloth", + "parquet": "data/chunk-011/episode_011546.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011546.mp4" + }, + { + "episode_id": 24755, + "source_index": 24755, + "raw_length": 21, + "instruction": "pick up glue and put into drawer", + "canonical_instruction": "pick up glue and put into drawer", + "parquet": "data/chunk-024/episode_024755.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024755.mp4" + }, + { + "episode_id": 38277, + "source_index": 38277, + "raw_length": 31, + "instruction": "move the silver pot to the upper left side of the table", + "canonical_instruction": "move the silver pot to the upper left side of the table", + "parquet": "data/chunk-038/episode_038277.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038277.mp4" + }, + { + "episode_id": 1893, + "source_index": 1893, + "raw_length": 19, + "instruction": "put potato in pot or pan", + "canonical_instruction": "put potato in pot or pan", + "parquet": "data/chunk-001/episode_001893.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001893.mp4" + }, + { + "episode_id": 50407, + "source_index": 50407, + "raw_length": 26, + "instruction": "put big spoon from basket to tray", + "canonical_instruction": "put big spoon from basket to tray", + "parquet": "data/chunk-050/episode_050407.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050407.mp4" + }, + { + "episode_id": 30678, + "source_index": 30678, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-030/episode_030678.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030678.mp4" + }, + { + "episode_id": 23822, + "source_index": 23822, + "raw_length": 21, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-023/episode_023822.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023822.mp4" + }, + { + "episode_id": 43218, + "source_index": 43218, + "raw_length": 26, + "instruction": "put corn on plate", + "canonical_instruction": "put corn on plate", + "parquet": "data/chunk-043/episode_043218.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043218.mp4" + }, + { + "episode_id": 5656, + "source_index": 5656, + "raw_length": 85, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-005/episode_005656.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005656.mp4" + }, + { + "episode_id": 639, + "source_index": 639, + "raw_length": 40, + "instruction": "robot unfolded cloth from bottom left to top right", + "canonical_instruction": "robot unfolded cloth from bottom left to top right", + "parquet": "data/chunk-000/episode_000639.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000639.mp4" + }, + { + "episode_id": 41146, + "source_index": 41146, + "raw_length": 21, + "instruction": "move the orange bunny to the bottom center of table", + "canonical_instruction": "move the orange bunny to the bottom center of table", + "parquet": "data/chunk-041/episode_041146.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041146.mp4" + }, + { + "episode_id": 5294, + "source_index": 5294, + "raw_length": 46, + "instruction": "Place the blue spoon to the right of the cloth.", + "canonical_instruction": "place the blue spoon to the right of the cloth", + "parquet": "data/chunk-005/episode_005294.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005294.mp4" + }, + { + "episode_id": 42491, + "source_index": 42491, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-042/episode_042491.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042491.mp4" + }, + { + "episode_id": 50210, + "source_index": 50210, + "raw_length": 48, + "instruction": "put the silver pot lid on the silver pot", + "canonical_instruction": "put the silver pot lid on the silver pot", + "parquet": "data/chunk-050/episode_050210.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050210.mp4" + }, + { + "episode_id": 50908, + "source_index": 50908, + "raw_length": 27, + "instruction": "putting the dotted toy on top of the drawer", + "canonical_instruction": "putting the dotted toy on top of the drawer", + "parquet": "data/chunk-050/episode_050908.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050908.mp4" + }, + { + "episode_id": 11006, + "source_index": 11006, + "raw_length": 18, + "instruction": "put pepper in pot or pan", + "canonical_instruction": "put pepper in pot or pan", + "parquet": "data/chunk-011/episode_011006.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011006.mp4" + }, + { + "episode_id": 5866, + "source_index": 5866, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-005/episode_005866.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005866.mp4" + }, + { + "episode_id": 31312, + "source_index": 31312, + "raw_length": 40, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-031/episode_031312.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031312.mp4" + }, + { + "episode_id": 23122, + "source_index": 23122, + "raw_length": 36, + "instruction": "upright metal pot cardboard fence", + "canonical_instruction": "upright metal pot cardboard fence", + "parquet": "data/chunk-023/episode_023122.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023122.mp4" + }, + { + "episode_id": 10532, + "source_index": 10532, + "raw_length": 33, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-010/episode_010532.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010532.mp4" + }, + { + "episode_id": 5766, + "source_index": 5766, + "raw_length": 19, + "instruction": "pick up bit holder", + "canonical_instruction": "pick up bit holder", + "parquet": "data/chunk-005/episode_005766.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005766.mp4" + }, + { + "episode_id": 10977, + "source_index": 10977, + "raw_length": 33, + "instruction": "put spoon in bowl sink", + "canonical_instruction": "put spoon in bowl sink", + "parquet": "data/chunk-010/episode_010977.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010977.mp4" + }, + { + "episode_id": 242, + "source_index": 242, + "raw_length": 20, + "instruction": "flip pot upright which is in sink", + "canonical_instruction": "flip pot upright which is in sink", + "parquet": "data/chunk-000/episode_000242.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000242.mp4" + }, + { + "episode_id": 14927, + "source_index": 14927, + "raw_length": 26, + "instruction": "Move the spoon on top of towel", + "canonical_instruction": "move the spoon on top of towel", + "parquet": "data/chunk-014/episode_014927.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014927.mp4" + }, + { + "episode_id": 49949, + "source_index": 49949, + "raw_length": 29, + "instruction": "place the spoon over the bowl; to the right of the cloth.", + "canonical_instruction": "place the spoon over the bowl; to the right of the cloth", + "parquet": "data/chunk-049/episode_049949.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049949.mp4" + }, + { + "episode_id": 25116, + "source_index": 25116, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-025/episode_025116.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025116.mp4" + }, + { + "episode_id": 27646, + "source_index": 27646, + "raw_length": 36, + "instruction": "fold the cloth from the top left corner to the bottom right corner", + "canonical_instruction": "fold the cloth from the top left corner to the bottom right corner", + "parquet": "data/chunk-027/episode_027646.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027646.mp4" + }, + { + "episode_id": 11384, + "source_index": 11384, + "raw_length": 42, + "instruction": "Move avocado towards middle top of counter.", + "canonical_instruction": "move avocado towards middle top of counter", + "parquet": "data/chunk-011/episode_011384.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011384.mp4" + }, + { + "episode_id": 35773, + "source_index": 35773, + "raw_length": 46, + "instruction": "Pick up the yellow object and move it to the front right corner of the counter.", + "canonical_instruction": "pick up the yellow object and move it to the front right corner of the counter", + "parquet": "data/chunk-035/episode_035773.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035773.mp4" + }, + { + "episode_id": 423, + "source_index": 423, + "raw_length": 46, + "instruction": "unfold cloth from the bottom left to the top right", + "canonical_instruction": "unfold cloth from the bottom left to the top right", + "parquet": "data/chunk-000/episode_000423.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000423.mp4" + }, + { + "episode_id": 33172, + "source_index": 33172, + "raw_length": 36, + "instruction": "move the red hexagon to the right side of the table", + "canonical_instruction": "move the red hexagon to the right side of the table", + "parquet": "data/chunk-033/episode_033172.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033172.mp4" + }, + { + "episode_id": 36205, + "source_index": 36205, + "raw_length": 76, + "instruction": "put strawberry on plate and corncob in pot or pan on stove", + "canonical_instruction": "put strawberry on plate and corncob in pot or pan on stove", + "parquet": "data/chunk-036/episode_036205.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036205.mp4" + }, + { + "episode_id": 15939, + "source_index": 15939, + "raw_length": 22, + "instruction": "take lid off pot or pan", + "canonical_instruction": "take lid off pot or pan", + "parquet": "data/chunk-015/episode_015939.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015939.mp4" + }, + { + "episode_id": 44732, + "source_index": 44732, + "raw_length": 24, + "instruction": "pick up box cutter and put into drawer", + "canonical_instruction": "pick up box cutter and put into drawer", + "parquet": "data/chunk-044/episode_044732.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044732.mp4" + }, + { + "episode_id": 43973, + "source_index": 43973, + "raw_length": 21, + "instruction": "turn faucet front to left", + "canonical_instruction": "turn faucet front to left", + "parquet": "data/chunk-043/episode_043973.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043973.mp4" + }, + { + "episode_id": 7189, + "source_index": 7189, + "raw_length": 45, + "instruction": "move the silver pot above the yellow brush", + "canonical_instruction": "move the silver pot above the yellow brush", + "parquet": "data/chunk-007/episode_007189.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007189.mp4" + }, + { + "episode_id": 34089, + "source_index": 34089, + "raw_length": 39, + "instruction": "move the can beside the yellow cloth and spatula", + "canonical_instruction": "move the can beside the yellow cloth and spatula", + "parquet": "data/chunk-034/episode_034089.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034089.mp4" + }, + { + "episode_id": 29284, + "source_index": 29284, + "raw_length": 26, + "instruction": "put corn into bowl", + "canonical_instruction": "put corn into bowl", + "parquet": "data/chunk-029/episode_029284.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029284.mp4" + }, + { + "episode_id": 12945, + "source_index": 12945, + "raw_length": 65, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-012/episode_012945.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012945.mp4" + }, + { + "episode_id": 31400, + "source_index": 31400, + "raw_length": 38, + "instruction": "Put the potato in the silver pot", + "canonical_instruction": "put the potato in the silver pot", + "parquet": "data/chunk-031/episode_031400.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031400.mp4" + }, + { + "episode_id": 15171, + "source_index": 15171, + "raw_length": 17, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-015/episode_015171.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015171.mp4" + }, + { + "episode_id": 37337, + "source_index": 37337, + "raw_length": 38, + "instruction": "put the pink thing in the drawer", + "canonical_instruction": "put the pink thing in the drawer", + "parquet": "data/chunk-037/episode_037337.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037337.mp4" + }, + { + "episode_id": 43715, + "source_index": 43715, + "raw_length": 29, + "instruction": "MOVE THE BLENDER INSIDE THE VESSEL", + "canonical_instruction": "move the blender inside the vessel", + "parquet": "data/chunk-043/episode_043715.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043715.mp4" + }, + { + "episode_id": 30241, + "source_index": 30241, + "raw_length": 35, + "instruction": "take the sushi out of the drawer and put it on the left side of the table", + "canonical_instruction": "take the sushi out of the drawer and put it on the left side of the table", + "parquet": "data/chunk-030/episode_030241.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030241.mp4" + }, + { + "episode_id": 12958, + "source_index": 12958, + "raw_length": 36, + "instruction": "Move the blue cloth next to the metal pot.", + "canonical_instruction": "move the blue cloth next to the metal pot", + "parquet": "data/chunk-012/episode_012958.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012958.mp4" + }, + { + "episode_id": 27457, + "source_index": 27457, + "raw_length": 33, + "instruction": "Move the black cloth from top center of the table to left side of the table, left side of blue spatula.", + "canonical_instruction": "move the black cloth from top center of the table to left side of the table, left side of blue spatula", + "parquet": "data/chunk-027/episode_027457.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027457.mp4" + }, + { + "episode_id": 20563, + "source_index": 20563, + "raw_length": 30, + "instruction": "moved the green object to the bottom left of the burner", + "canonical_instruction": "moved the green object to the bottom left of the burner", + "parquet": "data/chunk-020/episode_020563.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020563.mp4" + }, + { + "episode_id": 26805, + "source_index": 26805, + "raw_length": 35, + "instruction": "put the orange object on the top right side of the drawer", + "canonical_instruction": "put the orange object on the top right side of the drawer", + "parquet": "data/chunk-026/episode_026805.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026805.mp4" + }, + { + "episode_id": 41775, + "source_index": 41775, + "raw_length": 76, + "instruction": "put pot or pan on stove and put stuffedduck in pot or pan", + "canonical_instruction": "put pot or pan on stove and put stuffedduck in pot or pan", + "parquet": "data/chunk-041/episode_041775.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041775.mp4" + }, + { + "episode_id": 46900, + "source_index": 46900, + "raw_length": 85, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-046/episode_046900.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046900.mp4" + }, + { + "episode_id": 15423, + "source_index": 15423, + "raw_length": 39, + "instruction": "Move the spatula behind the purple cloth.", + "canonical_instruction": "move the spatula behind the purple cloth", + "parquet": "data/chunk-015/episode_015423.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015423.mp4" + }, + { + "episode_id": 25615, + "source_index": 25615, + "raw_length": 30, + "instruction": "Move the corn to the right of the stove.", + "canonical_instruction": "move the corn to the right of the stove", + "parquet": "data/chunk-025/episode_025615.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025615.mp4" + }, + { + "episode_id": 44719, + "source_index": 44719, + "raw_length": 30, + "instruction": "moved the green cloth to the upper left side", + "canonical_instruction": "moved the green cloth to the upper left side", + "parquet": "data/chunk-044/episode_044719.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044719.mp4" + }, + { + "episode_id": 16146, + "source_index": 16146, + "raw_length": 17, + "instruction": "did nothing", + "canonical_instruction": "did nothing", + "parquet": "data/chunk-016/episode_016146.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016146.mp4" + }, + { + "episode_id": 20751, + "source_index": 20751, + "raw_length": 21, + "instruction": "zip zipper bag", + "canonical_instruction": "zip zipper bag", + "parquet": "data/chunk-020/episode_020751.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020751.mp4" + }, + { + "episode_id": 27769, + "source_index": 27769, + "raw_length": 28, + "instruction": "move the green bell pepper on lower right of the table", + "canonical_instruction": "move the green bell pepper on lower right of the table", + "parquet": "data/chunk-027/episode_027769.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027769.mp4" + }, + { + "episode_id": 40515, + "source_index": 40515, + "raw_length": 24, + "instruction": "moved the silver pot to the top left of table", + "canonical_instruction": "moved the silver pot to the top left of table", + "parquet": "data/chunk-040/episode_040515.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040515.mp4" + }, + { + "episode_id": 18638, + "source_index": 18638, + "raw_length": 27, + "instruction": "move the silver lid to the left side of the pot", + "canonical_instruction": "move the silver lid to the left side of the pot", + "parquet": "data/chunk-018/episode_018638.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018638.mp4" + }, + { + "episode_id": 13871, + "source_index": 13871, + "raw_length": 33, + "instruction": "Move the green cloth behind the pot with the spatula", + "canonical_instruction": "move the green cloth behind the pot with the spatula", + "parquet": "data/chunk-013/episode_013871.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013871.mp4" + }, + { + "episode_id": 3691, + "source_index": 3691, + "raw_length": 24, + "instruction": "move the orange towel next to the basket", + "canonical_instruction": "move the orange towel next to the basket", + "parquet": "data/chunk-003/episode_003691.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003691.mp4" + }, + { + "episode_id": 6305, + "source_index": 6305, + "raw_length": 35, + "instruction": "get the silver pot and place it at the bottom right side of the stove", + "canonical_instruction": "get the silver pot and place it at the bottom right side of the stove", + "parquet": "data/chunk-006/episode_006305.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006305.mp4" + }, + { + "episode_id": 50646, + "source_index": 50646, + "raw_length": 22, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-050/episode_050646.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050646.mp4" + }, + { + "episode_id": 157, + "source_index": 157, + "raw_length": 29, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-000/episode_000157.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000157.mp4" + }, + { + "episode_id": 10157, + "source_index": 10157, + "raw_length": 38, + "instruction": "put the yellow cloth in the white basket", + "canonical_instruction": "put the yellow cloth in the white basket", + "parquet": "data/chunk-010/episode_010157.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010157.mp4" + }, + { + "episode_id": 26836, + "source_index": 26836, + "raw_length": 21, + "instruction": "open brown1fbox flap", + "canonical_instruction": "open brown1fbox flap", + "parquet": "data/chunk-026/episode_026836.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026836.mp4" + }, + { + "episode_id": 19880, + "source_index": 19880, + "raw_length": 43, + "instruction": "move the orange clothe to the top left of the table", + "canonical_instruction": "move the orange clothe to the top left of the table", + "parquet": "data/chunk-019/episode_019880.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019880.mp4" + }, + { + "episode_id": 22356, + "source_index": 22356, + "raw_length": 33, + "instruction": "Place the silver bowl directly left of the purple cloth.", + "canonical_instruction": "place the silver bowl directly left of the purple cloth", + "parquet": "data/chunk-022/episode_022356.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022356.mp4" + }, + { + "episode_id": 23379, + "source_index": 23379, + "raw_length": 44, + "instruction": "Move the cheese towards the bottom of the left burner.", + "canonical_instruction": "move the cheese towards the bottom of the left burner", + "parquet": "data/chunk-023/episode_023379.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023379.mp4" + }, + { + "episode_id": 42671, + "source_index": 42671, + "raw_length": 25, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-042/episode_042671.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042671.mp4" + }, + { + "episode_id": 23845, + "source_index": 23845, + "raw_length": 46, + "instruction": "He moved the cloth back and forth", + "canonical_instruction": "he moved the cloth back and forth", + "parquet": "data/chunk-023/episode_023845.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023845.mp4" + }, + { + "episode_id": 32265, + "source_index": 32265, + "raw_length": 26, + "instruction": "put fork from basket to tray", + "canonical_instruction": "put fork from basket to tray", + "parquet": "data/chunk-032/episode_032265.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032265.mp4" + }, + { + "episode_id": 16612, + "source_index": 16612, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-016/episode_016612.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016612.mp4" + }, + { + "episode_id": 35300, + "source_index": 35300, + "raw_length": 26, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-035/episode_035300.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035300.mp4" + }, + { + "episode_id": 34142, + "source_index": 34142, + "raw_length": 26, + "instruction": "Move the green towel between the microwave and spoon", + "canonical_instruction": "move the green towel between the microwave and spoon", + "parquet": "data/chunk-034/episode_034142.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034142.mp4" + }, + { + "episode_id": 3247, + "source_index": 3247, + "raw_length": 26, + "instruction": "pick the orange object from table and put down in the cloth", + "canonical_instruction": "pick the orange object from table and put down in the cloth", + "parquet": "data/chunk-003/episode_003247.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003247.mp4" + }, + { + "episode_id": 20596, + "source_index": 20596, + "raw_length": 39, + "instruction": "take the lid of the silver pot and place it to the bottom left burner", + "canonical_instruction": "take the lid of the silver pot and place it to the bottom left burner", + "parquet": "data/chunk-020/episode_020596.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020596.mp4" + }, + { + "episode_id": 17410, + "source_index": 17410, + "raw_length": 19, + "instruction": "put pot in sink", + "canonical_instruction": "put pot in sink", + "parquet": "data/chunk-017/episode_017410.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017410.mp4" + }, + { + "episode_id": 3005, + "source_index": 3005, + "raw_length": 56, + "instruction": "moving the spoon to the yellow basket.", + "canonical_instruction": "moving the spoon to the yellow basket", + "parquet": "data/chunk-003/episode_003005.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003005.mp4" + }, + { + "episode_id": 20126, + "source_index": 20126, + "raw_length": 39, + "instruction": "PICK UP THE BRUSH AND PUT ANOTHER THE SIDE OF THE TABLE", + "canonical_instruction": "pick up the brush and put another the side of the table", + "parquet": "data/chunk-020/episode_020126.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020126.mp4" + }, + { + "episode_id": 7945, + "source_index": 7945, + "raw_length": 36, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-007/episode_007945.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007945.mp4" + }, + { + "episode_id": 19836, + "source_index": 19836, + "raw_length": 36, + "instruction": "Put the blue object on the table from the cloth.", + "canonical_instruction": "put the blue object on the table from the cloth", + "parquet": "data/chunk-019/episode_019836.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019836.mp4" + }, + { + "episode_id": 30434, + "source_index": 30434, + "raw_length": 30, + "instruction": "close the burner to the cloth", + "canonical_instruction": "close the burner to the cloth", + "parquet": "data/chunk-030/episode_030434.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030434.mp4" + }, + { + "episode_id": 9539, + "source_index": 9539, + "raw_length": 29, + "instruction": "Move the can straight back towards the wall next to pan.", + "canonical_instruction": "move the can straight back towards the wall next to pan", + "parquet": "data/chunk-009/episode_009539.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009539.mp4" + }, + { + "episode_id": 47482, + "source_index": 47482, + "raw_length": 17, + "instruction": "put pepper in pot or pan", + "canonical_instruction": "put pepper in pot or pan", + "parquet": "data/chunk-047/episode_047482.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047482.mp4" + }, + { + "episode_id": 22277, + "source_index": 22277, + "raw_length": 36, + "instruction": "take sushi out of pot cardboard fence", + "canonical_instruction": "take sushi out of pot cardboard fence", + "parquet": "data/chunk-022/episode_022277.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022277.mp4" + }, + { + "episode_id": 40939, + "source_index": 40939, + "raw_length": 34, + "instruction": "put the yellow item from the silver pot to the right side of the right burner", + "canonical_instruction": "put the yellow item from the silver pot to the right side of the right burner", + "parquet": "data/chunk-040/episode_040939.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040939.mp4" + }, + { + "episode_id": 10994, + "source_index": 10994, + "raw_length": 19, + "instruction": "close cabinet", + "canonical_instruction": "close cabinet", + "parquet": "data/chunk-010/episode_010994.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010994.mp4" + }, + { + "episode_id": 24888, + "source_index": 24888, + "raw_length": 26, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-024/episode_024888.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024888.mp4" + }, + { + "episode_id": 8922, + "source_index": 8922, + "raw_length": 33, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-008/episode_008922.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008922.mp4" + }, + { + "episode_id": 44924, + "source_index": 44924, + "raw_length": 19, + "instruction": "close white1fbox flap", + "canonical_instruction": "close white1fbox flap", + "parquet": "data/chunk-044/episode_044924.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044924.mp4" + }, + { + "episode_id": 5424, + "source_index": 5424, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-005/episode_005424.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005424.mp4" + }, + { + "episode_id": 27195, + "source_index": 27195, + "raw_length": 21, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-027/episode_027195.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027195.mp4" + }, + { + "episode_id": 23969, + "source_index": 23969, + "raw_length": 41, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-023/episode_023969.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023969.mp4" + }, + { + "episode_id": 30839, + "source_index": 30839, + "raw_length": 24, + "instruction": "put the bunny over the drawer", + "canonical_instruction": "put the bunny over the drawer", + "parquet": "data/chunk-030/episode_030839.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030839.mp4" + }, + { + "episode_id": 17903, + "source_index": 17903, + "raw_length": 25, + "instruction": "moved the yellow pepper between the left burners", + "canonical_instruction": "moved the yellow pepper between the left burners", + "parquet": "data/chunk-017/episode_017903.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017903.mp4" + }, + { + "episode_id": 37481, + "source_index": 37481, + "raw_length": 35, + "instruction": "Move the silver lid to the lower left part", + "canonical_instruction": "move the silver lid to the lower left part", + "parquet": "data/chunk-037/episode_037481.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037481.mp4" + }, + { + "episode_id": 15010, + "source_index": 15010, + "raw_length": 22, + "instruction": "MOVE THE BANANA INTO THE RIGHT LOWER CORNER", + "canonical_instruction": "move the banana into the right lower corner", + "parquet": "data/chunk-015/episode_015010.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015010.mp4" + }, + { + "episode_id": 11681, + "source_index": 11681, + "raw_length": 46, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-011/episode_011681.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011681.mp4" + }, + { + "episode_id": 1506, + "source_index": 1506, + "raw_length": 54, + "instruction": "puts the orange object in the pot", + "canonical_instruction": "puts the orange object in the pot", + "parquet": "data/chunk-001/episode_001506.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001506.mp4" + }, + { + "episode_id": 36642, + "source_index": 36642, + "raw_length": 21, + "instruction": "open small4fbox flaps", + "canonical_instruction": "open small4fbox flaps", + "parquet": "data/chunk-036/episode_036642.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036642.mp4" + }, + { + "episode_id": 25699, + "source_index": 25699, + "raw_length": 37, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-025/episode_025699.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025699.mp4" + }, + { + "episode_id": 48171, + "source_index": 48171, + "raw_length": 40, + "instruction": "move the the towel to the lower left of cooktop", + "canonical_instruction": "move the the towel to the lower left of cooktop", + "parquet": "data/chunk-048/episode_048171.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048171.mp4" + }, + { + "episode_id": 50809, + "source_index": 50809, + "raw_length": 40, + "instruction": "put lid on the pot", + "canonical_instruction": "put lid on the pot", + "parquet": "data/chunk-050/episode_050809.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050809.mp4" + }, + { + "episode_id": 8334, + "source_index": 8334, + "raw_length": 39, + "instruction": "unfold cloth from left to right", + "canonical_instruction": "unfold cloth from left to right", + "parquet": "data/chunk-008/episode_008334.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008334.mp4" + }, + { + "episode_id": 9590, + "source_index": 9590, + "raw_length": 21, + "instruction": "put pot or pan from sink into drying rack", + "canonical_instruction": "put pot or pan from sink into drying rack", + "parquet": "data/chunk-009/episode_009590.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009590.mp4" + }, + { + "episode_id": 16198, + "source_index": 16198, + "raw_length": 25, + "instruction": "put the orange figure on the bottom right of the table", + "canonical_instruction": "put the orange figure on the bottom right of the table", + "parquet": "data/chunk-016/episode_016198.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016198.mp4" + }, + { + "episode_id": 44666, + "source_index": 44666, + "raw_length": 46, + "instruction": "put the yellow cube on top of the green cube", + "canonical_instruction": "put the yellow cube on top of the green cube", + "parquet": "data/chunk-044/episode_044666.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044666.mp4" + }, + { + "episode_id": 25498, + "source_index": 25498, + "raw_length": 44, + "instruction": "put the blue cube on top of the wood cube", + "canonical_instruction": "put the blue cube on top of the wood cube", + "parquet": "data/chunk-025/episode_025498.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025498.mp4" + }, + { + "episode_id": 12954, + "source_index": 12954, + "raw_length": 41, + "instruction": "fold the green cloth", + "canonical_instruction": "fold the green cloth", + "parquet": "data/chunk-012/episode_012954.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012954.mp4" + }, + { + "episode_id": 23912, + "source_index": 23912, + "raw_length": 31, + "instruction": "put the yellow duck on top of the drawer", + "canonical_instruction": "put the yellow duck on top of the drawer", + "parquet": "data/chunk-023/episode_023912.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023912.mp4" + }, + { + "episode_id": 51790, + "source_index": 51790, + "raw_length": 20, + "instruction": "put spoon into pan", + "canonical_instruction": "put spoon into pan", + "parquet": "data/chunk-051/episode_051790.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051790.mp4" + }, + { + "episode_id": 37622, + "source_index": 37622, + "raw_length": 21, + "instruction": "put eggplant into pot or pan", + "canonical_instruction": "put eggplant into pot or pan", + "parquet": "data/chunk-037/episode_037622.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037622.mp4" + }, + { + "episode_id": 18740, + "source_index": 18740, + "raw_length": 46, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-018/episode_018740.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018740.mp4" + }, + { + "episode_id": 11548, + "source_index": 11548, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-011/episode_011548.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011548.mp4" + }, + { + "episode_id": 47454, + "source_index": 47454, + "raw_length": 80, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-047/episode_047454.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047454.mp4" + }, + { + "episode_id": 45540, + "source_index": 45540, + "raw_length": 20, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-045/episode_045540.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045540.mp4" + }, + { + "episode_id": 15577, + "source_index": 15577, + "raw_length": 33, + "instruction": "move the tomato from the bottom left corner of the cloth to top right of the table", + "canonical_instruction": "move the tomato from the bottom left corner of the cloth to top right of the table", + "parquet": "data/chunk-015/episode_015577.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015577.mp4" + }, + { + "episode_id": 13353, + "source_index": 13353, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-013/episode_013353.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013353.mp4" + }, + { + "episode_id": 32145, + "source_index": 32145, + "raw_length": 41, + "instruction": "placed the roll inside the brown transparent bowl", + "canonical_instruction": "placed the roll inside the brown transparent bowl", + "parquet": "data/chunk-032/episode_032145.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032145.mp4" + }, + { + "episode_id": 11591, + "source_index": 11591, + "raw_length": 72, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-011/episode_011591.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011591.mp4" + }, + { + "episode_id": 20609, + "source_index": 20609, + "raw_length": 37, + "instruction": "move the yellow corn to the blue cloth", + "canonical_instruction": "move the yellow corn to the blue cloth", + "parquet": "data/chunk-020/episode_020609.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020609.mp4" + }, + { + "episode_id": 29803, + "source_index": 29803, + "raw_length": 39, + "instruction": "move the yellow brush in the left side of the table", + "canonical_instruction": "move the yellow brush in the left side of the table", + "parquet": "data/chunk-029/episode_029803.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029803.mp4" + }, + { + "episode_id": 12437, + "source_index": 12437, + "raw_length": 35, + "instruction": "moved the spatula to the left side of the table", + "canonical_instruction": "moved the spatula to the left side of the table", + "parquet": "data/chunk-012/episode_012437.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012437.mp4" + }, + { + "episode_id": 14689, + "source_index": 14689, + "raw_length": 18, + "instruction": "close oven", + "canonical_instruction": "close oven", + "parquet": "data/chunk-014/episode_014689.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014689.mp4" + }, + { + "episode_id": 51069, + "source_index": 51069, + "raw_length": 22, + "instruction": "move the blue fork to the left bottom stove", + "canonical_instruction": "move the blue fork to the left bottom stove", + "parquet": "data/chunk-051/episode_051069.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051069.mp4" + }, + { + "episode_id": 50051, + "source_index": 50051, + "raw_length": 38, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-050/episode_050051.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050051.mp4" + }, + { + "episode_id": 34051, + "source_index": 34051, + "raw_length": 38, + "instruction": "put the ball in the cup", + "canonical_instruction": "put the ball in the cup", + "parquet": "data/chunk-034/episode_034051.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034051.mp4" + }, + { + "episode_id": 40048, + "source_index": 40048, + "raw_length": 23, + "instruction": "put potato on plate", + "canonical_instruction": "put potato on plate", + "parquet": "data/chunk-040/episode_040048.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040048.mp4" + }, + { + "episode_id": 36258, + "source_index": 36258, + "raw_length": 33, + "instruction": "open low fridge", + "canonical_instruction": "open low fridge", + "parquet": "data/chunk-036/episode_036258.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036258.mp4" + }, + { + "episode_id": 12037, + "source_index": 12037, + "raw_length": 30, + "instruction": "Place the blue fork on the green napkin.", + "canonical_instruction": "place the blue fork on the green napkin", + "parquet": "data/chunk-012/episode_012037.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012037.mp4" + }, + { + "episode_id": 20814, + "source_index": 20814, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-020/episode_020814.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020814.mp4" + }, + { + "episode_id": 21290, + "source_index": 21290, + "raw_length": 36, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-021/episode_021290.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021290.mp4" + }, + { + "episode_id": 25556, + "source_index": 25556, + "raw_length": 30, + "instruction": "PICK UPTHE VISSLES PUT ON THEANOTHER SIDE OF THE TABLE", + "canonical_instruction": "pick upthe vissles put on theanother side of the table", + "parquet": "data/chunk-025/episode_025556.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025556.mp4" + }, + { + "episode_id": 4254, + "source_index": 4254, + "raw_length": 23, + "instruction": "Put the potato in the pot", + "canonical_instruction": "put the potato in the pot", + "parquet": "data/chunk-004/episode_004254.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004254.mp4" + }, + { + "episode_id": 49913, + "source_index": 49913, + "raw_length": 32, + "instruction": "Move the blue spoon next to the silver bowl", + "canonical_instruction": "move the blue spoon next to the silver bowl", + "parquet": "data/chunk-049/episode_049913.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049913.mp4" + }, + { + "episode_id": 20660, + "source_index": 20660, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-020/episode_020660.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020660.mp4" + }, + { + "episode_id": 13827, + "source_index": 13827, + "raw_length": 35, + "instruction": "put the yellow cloth into the white basket", + "canonical_instruction": "put the yellow cloth into the white basket", + "parquet": "data/chunk-013/episode_013827.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013827.mp4" + }, + { + "episode_id": 18973, + "source_index": 18973, + "raw_length": 56, + "instruction": "move the red spoon to the yellow colander", + "canonical_instruction": "move the red spoon to the yellow colander", + "parquet": "data/chunk-018/episode_018973.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018973.mp4" + }, + { + "episode_id": 3819, + "source_index": 3819, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-003/episode_003819.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003819.mp4" + }, + { + "episode_id": 34763, + "source_index": 34763, + "raw_length": 32, + "instruction": "put the lid on the silver pot", + "canonical_instruction": "put the lid on the silver pot", + "parquet": "data/chunk-034/episode_034763.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034763.mp4" + }, + { + "episode_id": 47636, + "source_index": 47636, + "raw_length": 17, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-047/episode_047636.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047636.mp4" + }, + { + "episode_id": 42702, + "source_index": 42702, + "raw_length": 20, + "instruction": "Move the masher from front to back right of stove", + "canonical_instruction": "move the masher from front to back right of stove", + "parquet": "data/chunk-042/episode_042702.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042702.mp4" + }, + { + "episode_id": 18003, + "source_index": 18003, + "raw_length": 26, + "instruction": "put corn into bowl", + "canonical_instruction": "put corn into bowl", + "parquet": "data/chunk-018/episode_018003.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018003.mp4" + }, + { + "episode_id": 23655, + "source_index": 23655, + "raw_length": 28, + "instruction": "unfold the cloth from bottom left to the top right", + "canonical_instruction": "unfold the cloth from bottom left to the top right", + "parquet": "data/chunk-023/episode_023655.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023655.mp4" + }, + { + "episode_id": 36779, + "source_index": 36779, + "raw_length": 46, + "instruction": "PICK UPTHE FORK AND PUT NEAR THE YELLOW TOWEL", + "canonical_instruction": "pick upthe fork and put near the yellow towel", + "parquet": "data/chunk-036/episode_036779.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036779.mp4" + }, + { + "episode_id": 18400, + "source_index": 18400, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-018/episode_018400.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018400.mp4" + }, + { + "episode_id": 2734, + "source_index": 2734, + "raw_length": 33, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-002/episode_002734.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002734.mp4" + }, + { + "episode_id": 4174, + "source_index": 4174, + "raw_length": 46, + "instruction": "remove the red object from the drawer", + "canonical_instruction": "remove the red object from the drawer", + "parquet": "data/chunk-004/episode_004174.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004174.mp4" + }, + { + "episode_id": 40003, + "source_index": 40003, + "raw_length": 38, + "instruction": "move the silver mixing bowl to bottom left of burner", + "canonical_instruction": "move the silver mixing bowl to bottom left of burner", + "parquet": "data/chunk-040/episode_040003.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040003.mp4" + }, + { + "episode_id": 23352, + "source_index": 23352, + "raw_length": 31, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-023/episode_023352.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023352.mp4" + }, + { + "episode_id": 43473, + "source_index": 43473, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-043/episode_043473.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043473.mp4" + }, + { + "episode_id": 47206, + "source_index": 47206, + "raw_length": 35, + "instruction": "Puts the blue towel in the object", + "canonical_instruction": "puts the blue towel in the object", + "parquet": "data/chunk-047/episode_047206.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047206.mp4" + }, + { + "episode_id": 20743, + "source_index": 20743, + "raw_length": 17, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-020/episode_020743.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020743.mp4" + }, + { + "episode_id": 46650, + "source_index": 46650, + "raw_length": 22, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-046/episode_046650.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046650.mp4" + }, + { + "episode_id": 27904, + "source_index": 27904, + "raw_length": 27, + "instruction": "move the bread to the lower right burner", + "canonical_instruction": "move the bread to the lower right burner", + "parquet": "data/chunk-027/episode_027904.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027904.mp4" + }, + { + "episode_id": 17338, + "source_index": 17338, + "raw_length": 19, + "instruction": "picked up the yellow square from the top left and moved it south next to the silver bowl", + "canonical_instruction": "picked up the yellow square from the top left and moved it south next to the silver bowl", + "parquet": "data/chunk-017/episode_017338.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017338.mp4" + }, + { + "episode_id": 24309, + "source_index": 24309, + "raw_length": 46, + "instruction": "move the yellow rectangle block to the left", + "canonical_instruction": "move the yellow rectangle block to the left", + "parquet": "data/chunk-024/episode_024309.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024309.mp4" + }, + { + "episode_id": 22975, + "source_index": 22975, + "raw_length": 28, + "instruction": "move the blue object to top right burner", + "canonical_instruction": "move the blue object to top right burner", + "parquet": "data/chunk-022/episode_022975.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022975.mp4" + }, + { + "episode_id": 30735, + "source_index": 30735, + "raw_length": 37, + "instruction": "put the blue block on the left edge of the cloth", + "canonical_instruction": "put the blue block on the left edge of the cloth", + "parquet": "data/chunk-030/episode_030735.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030735.mp4" + }, + { + "episode_id": 24206, + "source_index": 24206, + "raw_length": 26, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-024/episode_024206.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024206.mp4" + }, + { + "episode_id": 18775, + "source_index": 18775, + "raw_length": 31, + "instruction": "unfold the cloth from the top left to the right", + "canonical_instruction": "unfold the cloth from the top left to the right", + "parquet": "data/chunk-018/episode_018775.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018775.mp4" + }, + { + "episode_id": 44100, + "source_index": 44100, + "raw_length": 43, + "instruction": "moved the corn to the lower right corner of the burner", + "canonical_instruction": "moved the corn to the lower right corner of the burner", + "parquet": "data/chunk-044/episode_044100.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044100.mp4" + }, + { + "episode_id": 37424, + "source_index": 37424, + "raw_length": 41, + "instruction": "remove the yellow cube from the green cube and put it on top of the cylinder", + "canonical_instruction": "remove the yellow cube from the green cube and put it on top of the cylinder", + "parquet": "data/chunk-037/episode_037424.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037424.mp4" + }, + { + "episode_id": 28609, + "source_index": 28609, + "raw_length": 26, + "instruction": "Move the purple towel in front of the left burner", + "canonical_instruction": "move the purple towel in front of the left burner", + "parquet": "data/chunk-028/episode_028609.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028609.mp4" + }, + { + "episode_id": 29195, + "source_index": 29195, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-029/episode_029195.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029195.mp4" + }, + { + "episode_id": 36420, + "source_index": 36420, + "raw_length": 21, + "instruction": "move the cloth from the left side of the table to the center of the table", + "canonical_instruction": "move the cloth from the left side of the table to the center of the table", + "parquet": "data/chunk-036/episode_036420.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036420.mp4" + }, + { + "episode_id": 30525, + "source_index": 30525, + "raw_length": 44, + "instruction": "take the orange figure in table", + "canonical_instruction": "take the orange figure in table", + "parquet": "data/chunk-030/episode_030525.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030525.mp4" + }, + { + "episode_id": 21371, + "source_index": 21371, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-021/episode_021371.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021371.mp4" + }, + { + "episode_id": 20474, + "source_index": 20474, + "raw_length": 34, + "instruction": "put the blue fork in the bottom left of the burner", + "canonical_instruction": "put the blue fork in the bottom left of the burner", + "parquet": "data/chunk-020/episode_020474.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020474.mp4" + }, + { + "episode_id": 18207, + "source_index": 18207, + "raw_length": 26, + "instruction": "move the red bell pepper to the lower right side of the stove", + "canonical_instruction": "move the red bell pepper to the lower right side of the stove", + "parquet": "data/chunk-018/episode_018207.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018207.mp4" + }, + { + "episode_id": 21119, + "source_index": 21119, + "raw_length": 46, + "instruction": "put the yellow cube on the top of red cube", + "canonical_instruction": "put the yellow cube on the top of red cube", + "parquet": "data/chunk-021/episode_021119.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021119.mp4" + }, + { + "episode_id": 39811, + "source_index": 39811, + "raw_length": 46, + "instruction": "remove the cloth from the top", + "canonical_instruction": "remove the cloth from the top", + "parquet": "data/chunk-039/episode_039811.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039811.mp4" + }, + { + "episode_id": 14085, + "source_index": 14085, + "raw_length": 46, + "instruction": "pick a blue plastic on a yellow cube", + "canonical_instruction": "pick a blue plastic on a yellow cube", + "parquet": "data/chunk-014/episode_014085.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014085.mp4" + }, + { + "episode_id": 16634, + "source_index": 16634, + "raw_length": 50, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-016/episode_016634.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016634.mp4" + }, + { + "episode_id": 44727, + "source_index": 44727, + "raw_length": 19, + "instruction": "put green squash in pot or pan", + "canonical_instruction": "put green squash in pot or pan", + "parquet": "data/chunk-044/episode_044727.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044727.mp4" + }, + { + "episode_id": 14606, + "source_index": 14606, + "raw_length": 34, + "instruction": "Move the spoon to the right table edge away from the towel.", + "canonical_instruction": "move the spoon to the right table edge away from the towel", + "parquet": "data/chunk-014/episode_014606.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014606.mp4" + }, + { + "episode_id": 21025, + "source_index": 21025, + "raw_length": 20, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-021/episode_021025.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021025.mp4" + }, + { + "episode_id": 9908, + "source_index": 9908, + "raw_length": 37, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-009/episode_009908.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009908.mp4" + }, + { + "episode_id": 5320, + "source_index": 5320, + "raw_length": 22, + "instruction": "Move the pot and put it on the blue cloth.", + "canonical_instruction": "move the pot and put it on the blue cloth", + "parquet": "data/chunk-005/episode_005320.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005320.mp4" + }, + { + "episode_id": 16540, + "source_index": 16540, + "raw_length": 28, + "instruction": "Move the pot to the front right corner of the table", + "canonical_instruction": "move the pot to the front right corner of the table", + "parquet": "data/chunk-016/episode_016540.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016540.mp4" + }, + { + "episode_id": 24594, + "source_index": 24594, + "raw_length": 36, + "instruction": "Takes the pot off the blue napkin,", + "canonical_instruction": "takes the pot off the blue napkin,", + "parquet": "data/chunk-024/episode_024594.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024594.mp4" + }, + { + "episode_id": 19029, + "source_index": 19029, + "raw_length": 23, + "instruction": "unfold the cloth from center to bottom right", + "canonical_instruction": "unfold the cloth from center to bottom right", + "parquet": "data/chunk-019/episode_019029.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019029.mp4" + }, + { + "episode_id": 18697, + "source_index": 18697, + "raw_length": 30, + "instruction": "Put silver pot between top of blue spoon and above carrot", + "canonical_instruction": "put silver pot between top of blue spoon and above carrot", + "parquet": "data/chunk-018/episode_018697.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018697.mp4" + }, + { + "episode_id": 2577, + "source_index": 2577, + "raw_length": 21, + "instruction": "turn faucet left", + "canonical_instruction": "turn faucet left", + "parquet": "data/chunk-002/episode_002577.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002577.mp4" + }, + { + "episode_id": 31468, + "source_index": 31468, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-031/episode_031468.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031468.mp4" + }, + { + "episode_id": 5144, + "source_index": 5144, + "raw_length": 46, + "instruction": "put the cube with hole on top of the block with hole", + "canonical_instruction": "put the cube with hole on top of the block with hole", + "parquet": "data/chunk-005/episode_005144.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005144.mp4" + }, + { + "episode_id": 24401, + "source_index": 24401, + "raw_length": 46, + "instruction": "Place the pan behind the blue napkin", + "canonical_instruction": "place the pan behind the blue napkin", + "parquet": "data/chunk-024/episode_024401.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024401.mp4" + }, + { + "episode_id": 16608, + "source_index": 16608, + "raw_length": 27, + "instruction": "placing the purple towel on the left side of the burner", + "canonical_instruction": "placing the purple towel on the left side of the burner", + "parquet": "data/chunk-016/episode_016608.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016608.mp4" + }, + { + "episode_id": 21499, + "source_index": 21499, + "raw_length": 39, + "instruction": "put the banana into the silver bowl", + "canonical_instruction": "put the banana into the silver bowl", + "parquet": "data/chunk-021/episode_021499.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021499.mp4" + }, + { + "episode_id": 26635, + "source_index": 26635, + "raw_length": 55, + "instruction": "mettre un objet rouge dans l' evier", + "canonical_instruction": "mettre un objet rouge dans l' evier", + "parquet": "data/chunk-026/episode_026635.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026635.mp4" + }, + { + "episode_id": 37879, + "source_index": 37879, + "raw_length": 38, + "instruction": "place cube on top of another cube", + "canonical_instruction": "place cube on top of another cube", + "parquet": "data/chunk-037/episode_037879.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037879.mp4" + }, + { + "episode_id": 19287, + "source_index": 19287, + "raw_length": 26, + "instruction": "Put the sausage in the pot", + "canonical_instruction": "put the sausage in the pot", + "parquet": "data/chunk-019/episode_019287.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019287.mp4" + }, + { + "episode_id": 19549, + "source_index": 19549, + "raw_length": 46, + "instruction": "Put the orange container on top of the yellow cloth", + "canonical_instruction": "put the orange container on top of the yellow cloth", + "parquet": "data/chunk-019/episode_019549.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019549.mp4" + }, + { + "episode_id": 46092, + "source_index": 46092, + "raw_length": 24, + "instruction": "move the orange cloth", + "canonical_instruction": "move the orange cloth", + "parquet": "data/chunk-046/episode_046092.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046092.mp4" + }, + { + "episode_id": 12912, + "source_index": 12912, + "raw_length": 52, + "instruction": "put the red basket on the upper side left corner of the burner", + "canonical_instruction": "put the red basket on the upper side left corner of the burner", + "parquet": "data/chunk-012/episode_012912.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012912.mp4" + }, + { + "episode_id": 23953, + "source_index": 23953, + "raw_length": 21, + "instruction": "open brown1fbox flap", + "canonical_instruction": "open brown1fbox flap", + "parquet": "data/chunk-023/episode_023953.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023953.mp4" + }, + { + "episode_id": 46045, + "source_index": 46045, + "raw_length": 46, + "instruction": "Take the yellow cube and put in on the right side of the table", + "canonical_instruction": "take the yellow cube and put in on the right side of the table", + "parquet": "data/chunk-046/episode_046045.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046045.mp4" + }, + { + "episode_id": 33655, + "source_index": 33655, + "raw_length": 20, + "instruction": "put the blue fork in between the green object and purple cloth", + "canonical_instruction": "put the blue fork in between the green object and purple cloth", + "parquet": "data/chunk-033/episode_033655.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033655.mp4" + }, + { + "episode_id": 14813, + "source_index": 14813, + "raw_length": 21, + "instruction": "fold cloth in half", + "canonical_instruction": "fold cloth in half", + "parquet": "data/chunk-014/episode_014813.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014813.mp4" + }, + { + "episode_id": 593, + "source_index": 593, + "raw_length": 31, + "instruction": "take the long cylinder out of the circle and put it above the circle", + "canonical_instruction": "take the long cylinder out of the circle and put it above the circle", + "parquet": "data/chunk-000/episode_000593.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000593.mp4" + }, + { + "episode_id": 43509, + "source_index": 43509, + "raw_length": 36, + "instruction": "put lid on pot", + "canonical_instruction": "put lid on pot", + "parquet": "data/chunk-043/episode_043509.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043509.mp4" + }, + { + "episode_id": 22205, + "source_index": 22205, + "raw_length": 35, + "instruction": "PICK UP THE PLASTIC BOWL AND PUT INTO THE VIOLIET TOWEL", + "canonical_instruction": "pick up the plastic bowl and put into the violiet towel", + "parquet": "data/chunk-022/episode_022205.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022205.mp4" + }, + { + "episode_id": 35061, + "source_index": 35061, + "raw_length": 46, + "instruction": "take the eggplant and put it in the middle of the table", + "canonical_instruction": "take the eggplant and put it in the middle of the table", + "parquet": "data/chunk-035/episode_035061.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035061.mp4" + }, + { + "episode_id": 17371, + "source_index": 17371, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-017/episode_017371.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017371.mp4" + }, + { + "episode_id": 9105, + "source_index": 9105, + "raw_length": 44, + "instruction": "put a white thing on the drawer", + "canonical_instruction": "put a white thing on the drawer", + "parquet": "data/chunk-009/episode_009105.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009105.mp4" + }, + { + "episode_id": 17609, + "source_index": 17609, + "raw_length": 45, + "instruction": "fold the cloth from bottom right to top", + "canonical_instruction": "fold the cloth from bottom right to top", + "parquet": "data/chunk-017/episode_017609.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017609.mp4" + }, + { + "episode_id": 27233, + "source_index": 27233, + "raw_length": 51, + "instruction": "remove the silver pot lid and put it on the top right of the blue cloth", + "canonical_instruction": "remove the silver pot lid and put it on the top right of the blue cloth", + "parquet": "data/chunk-027/episode_027233.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027233.mp4" + }, + { + "episode_id": 8328, + "source_index": 8328, + "raw_length": 29, + "instruction": "unfold the cloth from bottom to top", + "canonical_instruction": "unfold the cloth from bottom to top", + "parquet": "data/chunk-008/episode_008328.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008328.mp4" + }, + { + "episode_id": 3215, + "source_index": 3215, + "raw_length": 34, + "instruction": "move the green thing inside the drawer", + "canonical_instruction": "move the green thing inside the drawer", + "parquet": "data/chunk-003/episode_003215.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003215.mp4" + }, + { + "episode_id": 20927, + "source_index": 20927, + "raw_length": 36, + "instruction": "put lid on pot", + "canonical_instruction": "put lid on pot", + "parquet": "data/chunk-020/episode_020927.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020927.mp4" + }, + { + "episode_id": 35883, + "source_index": 35883, + "raw_length": 73, + "instruction": "put redcube in pan and put pan on stove", + "canonical_instruction": "put redcube in pan and put pan on stove", + "parquet": "data/chunk-035/episode_035883.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035883.mp4" + }, + { + "episode_id": 9708, + "source_index": 9708, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-009/episode_009708.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009708.mp4" + }, + { + "episode_id": 52107, + "source_index": 52107, + "raw_length": 31, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-052/episode_052107.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052107.mp4" + }, + { + "episode_id": 18164, + "source_index": 18164, + "raw_length": 38, + "instruction": "put the red thing inside the drawer", + "canonical_instruction": "put the red thing inside the drawer", + "parquet": "data/chunk-018/episode_018164.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018164.mp4" + }, + { + "episode_id": 9809, + "source_index": 9809, + "raw_length": 46, + "instruction": "put the blue rectangle on top of the red cube", + "canonical_instruction": "put the blue rectangle on top of the red cube", + "parquet": "data/chunk-009/episode_009809.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009809.mp4" + }, + { + "episode_id": 1164, + "source_index": 1164, + "raw_length": 31, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-001/episode_001164.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001164.mp4" + }, + { + "episode_id": 23985, + "source_index": 23985, + "raw_length": 27, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-023/episode_023985.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023985.mp4" + }, + { + "episode_id": 6089, + "source_index": 6089, + "raw_length": 35, + "instruction": "Moves the sushi from the right to the left of the cloth.", + "canonical_instruction": "moves the sushi from the right to the left of the cloth", + "parquet": "data/chunk-006/episode_006089.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006089.mp4" + }, + { + "episode_id": 29054, + "source_index": 29054, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-029/episode_029054.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029054.mp4" + }, + { + "episode_id": 23691, + "source_index": 23691, + "raw_length": 26, + "instruction": "move an object from bottom of the table towards middle", + "canonical_instruction": "move an object from bottom of the table towards middle", + "parquet": "data/chunk-023/episode_023691.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023691.mp4" + }, + { + "episode_id": 114, + "source_index": 114, + "raw_length": 36, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-000/episode_000114.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000114.mp4" + }, + { + "episode_id": 17625, + "source_index": 17625, + "raw_length": 38, + "instruction": "Fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-017/episode_017625.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017625.mp4" + }, + { + "episode_id": 35063, + "source_index": 35063, + "raw_length": 29, + "instruction": "Move the yellow cloth to the front of the microwave.", + "canonical_instruction": "move the yellow cloth to the front of the microwave", + "parquet": "data/chunk-035/episode_035063.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035063.mp4" + }, + { + "episode_id": 4894, + "source_index": 4894, + "raw_length": 43, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-004/episode_004894.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004894.mp4" + }, + { + "episode_id": 39750, + "source_index": 39750, + "raw_length": 46, + "instruction": "video frames not showing", + "canonical_instruction": "video frames not showing", + "parquet": "data/chunk-039/episode_039750.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039750.mp4" + }, + { + "episode_id": 24676, + "source_index": 24676, + "raw_length": 20, + "instruction": "open drawer of box", + "canonical_instruction": "open drawer of box", + "parquet": "data/chunk-024/episode_024676.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024676.mp4" + }, + { + "episode_id": 34120, + "source_index": 34120, + "raw_length": 17, + "instruction": "put pan in sink", + "canonical_instruction": "put pan in sink", + "parquet": "data/chunk-034/episode_034120.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034120.mp4" + }, + { + "episode_id": 10804, + "source_index": 10804, + "raw_length": 25, + "instruction": "move the silver pot to the right of the white cloth", + "canonical_instruction": "move the silver pot to the right of the white cloth", + "parquet": "data/chunk-010/episode_010804.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010804.mp4" + }, + { + "episode_id": 20279, + "source_index": 20279, + "raw_length": 46, + "instruction": "take the rectangular block off of the cube and put it on top of the other rectangular block", + "canonical_instruction": "take the rectangular block off of the cube and put it on top of the other rectangular block", + "parquet": "data/chunk-020/episode_020279.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020279.mp4" + }, + { + "episode_id": 51299, + "source_index": 51299, + "raw_length": 46, + "instruction": "take the red cube from the table and place it on top of the green cube", + "canonical_instruction": "take the red cube from the table and place it on top of the green cube", + "parquet": "data/chunk-051/episode_051299.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051299.mp4" + }, + { + "episode_id": 39285, + "source_index": 39285, + "raw_length": 27, + "instruction": "moved the green fork from the right bottom burner to the left bottom burner", + "canonical_instruction": "moved the green fork from the right bottom burner to the left bottom burner", + "parquet": "data/chunk-039/episode_039285.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039285.mp4" + }, + { + "episode_id": 48225, + "source_index": 48225, + "raw_length": 27, + "instruction": "take the banana and put it on the kitchen rag", + "canonical_instruction": "take the banana and put it on the kitchen rag", + "parquet": "data/chunk-048/episode_048225.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048225.mp4" + }, + { + "episode_id": 33840, + "source_index": 33840, + "raw_length": 19, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-033/episode_033840.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033840.mp4" + }, + { + "episode_id": 6298, + "source_index": 6298, + "raw_length": 39, + "instruction": "put the brown thing in the silver pot", + "canonical_instruction": "put the brown thing in the silver pot", + "parquet": "data/chunk-006/episode_006298.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006298.mp4" + }, + { + "episode_id": 52544, + "source_index": 52544, + "raw_length": 31, + "instruction": "take blueberries off plate sink", + "canonical_instruction": "take blueberries off plate sink", + "parquet": "data/chunk-052/episode_052544.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052544.mp4" + }, + { + "episode_id": 23353, + "source_index": 23353, + "raw_length": 31, + "instruction": "take cup off plate", + "canonical_instruction": "take cup off plate", + "parquet": "data/chunk-023/episode_023353.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023353.mp4" + }, + { + "episode_id": 30284, + "source_index": 30284, + "raw_length": 24, + "instruction": "pick up green mug", + "canonical_instruction": "pick up green mug", + "parquet": "data/chunk-030/episode_030284.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030284.mp4" + }, + { + "episode_id": 36906, + "source_index": 36906, + "raw_length": 18, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-036/episode_036906.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036906.mp4" + }, + { + "episode_id": 14782, + "source_index": 14782, + "raw_length": 35, + "instruction": "move the blue fork to the right side of the stove", + "canonical_instruction": "move the blue fork to the right side of the stove", + "parquet": "data/chunk-014/episode_014782.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014782.mp4" + }, + { + "episode_id": 3869, + "source_index": 3869, + "raw_length": 56, + "instruction": "move the fork to the right top of sink", + "canonical_instruction": "move the fork to the right top of sink", + "parquet": "data/chunk-003/episode_003869.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003869.mp4" + }, + { + "episode_id": 9271, + "source_index": 9271, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-009/episode_009271.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009271.mp4" + }, + { + "episode_id": 26589, + "source_index": 26589, + "raw_length": 35, + "instruction": "take banana out of colander", + "canonical_instruction": "take banana out of colander", + "parquet": "data/chunk-026/episode_026589.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026589.mp4" + }, + { + "episode_id": 4599, + "source_index": 4599, + "raw_length": 36, + "instruction": "moved the silver pot to the top of the blue cloth", + "canonical_instruction": "moved the silver pot to the top of the blue cloth", + "parquet": "data/chunk-004/episode_004599.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004599.mp4" + }, + { + "episode_id": 47809, + "source_index": 47809, + "raw_length": 32, + "instruction": "Grab the capsicum from the pot and place it onto the cloth.", + "canonical_instruction": "grab the capsicum from the pot and place it onto the cloth", + "parquet": "data/chunk-047/episode_047809.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047809.mp4" + }, + { + "episode_id": 46049, + "source_index": 46049, + "raw_length": 23, + "instruction": "Move can to the left of purple cloth.", + "canonical_instruction": "move can to the left of purple cloth", + "parquet": "data/chunk-046/episode_046049.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046049.mp4" + }, + { + "episode_id": 47740, + "source_index": 47740, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-047/episode_047740.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047740.mp4" + }, + { + "episode_id": 37415, + "source_index": 37415, + "raw_length": 44, + "instruction": "fold the cloth from the bottom right to the top left", + "canonical_instruction": "fold the cloth from the bottom right to the top left", + "parquet": "data/chunk-037/episode_037415.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037415.mp4" + }, + { + "episode_id": 15819, + "source_index": 15819, + "raw_length": 21, + "instruction": "put eggplant into pot or pan", + "canonical_instruction": "put eggplant into pot or pan", + "parquet": "data/chunk-015/episode_015819.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015819.mp4" + }, + { + "episode_id": 10117, + "source_index": 10117, + "raw_length": 29, + "instruction": "take the thing out of the drawer and put it on the drawer", + "canonical_instruction": "take the thing out of the drawer and put it on the drawer", + "parquet": "data/chunk-010/episode_010117.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010117.mp4" + }, + { + "episode_id": 30650, + "source_index": 30650, + "raw_length": 21, + "instruction": "fold cloth in half", + "canonical_instruction": "fold cloth in half", + "parquet": "data/chunk-030/episode_030650.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030650.mp4" + }, + { + "episode_id": 8715, + "source_index": 8715, + "raw_length": 28, + "instruction": "move the can in to the down side of the table", + "canonical_instruction": "move the can in to the down side of the table", + "parquet": "data/chunk-008/episode_008715.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008715.mp4" + }, + { + "episode_id": 17414, + "source_index": 17414, + "raw_length": 43, + "instruction": "moved the blue brush from the left side of the burner and placed it on the purple cloth", + "canonical_instruction": "moved the blue brush from the left side of the burner and placed it on the purple cloth", + "parquet": "data/chunk-017/episode_017414.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017414.mp4" + }, + { + "episode_id": 43284, + "source_index": 43284, + "raw_length": 17, + "instruction": "put cup from counter or drying rack into sink", + "canonical_instruction": "put cup from counter or drying rack into sink", + "parquet": "data/chunk-043/episode_043284.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043284.mp4" + }, + { + "episode_id": 4139, + "source_index": 4139, + "raw_length": 36, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-004/episode_004139.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004139.mp4" + }, + { + "episode_id": 5713, + "source_index": 5713, + "raw_length": 38, + "instruction": "Place pot on front left corner of table", + "canonical_instruction": "place pot on front left corner of table", + "parquet": "data/chunk-005/episode_005713.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005713.mp4" + }, + { + "episode_id": 29728, + "source_index": 29728, + "raw_length": 58, + "instruction": "move the saltshaker from the left bottom side of the table and to the left side of the green pepper", + "canonical_instruction": "move the saltshaker from the left bottom side of the table and to the left side of the green pepper", + "parquet": "data/chunk-029/episode_029728.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029728.mp4" + }, + { + "episode_id": 52941, + "source_index": 52941, + "raw_length": 32, + "instruction": "close low fridge", + "canonical_instruction": "close low fridge", + "parquet": "data/chunk-052/episode_052941.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052941.mp4" + }, + { + "episode_id": 13400, + "source_index": 13400, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-013/episode_013400.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013400.mp4" + }, + { + "episode_id": 11631, + "source_index": 11631, + "raw_length": 34, + "instruction": "put the green object on the orange cloth", + "canonical_instruction": "put the green object on the orange cloth", + "parquet": "data/chunk-011/episode_011631.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011631.mp4" + }, + { + "episode_id": 11957, + "source_index": 11957, + "raw_length": 46, + "instruction": "move the yellow cube and put it on top of the cylinder", + "canonical_instruction": "move the yellow cube and put it on top of the cylinder", + "parquet": "data/chunk-011/episode_011957.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011957.mp4" + }, + { + "episode_id": 37249, + "source_index": 37249, + "raw_length": 76, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-037/episode_037249.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037249.mp4" + }, + { + "episode_id": 21052, + "source_index": 21052, + "raw_length": 21, + "instruction": "turn faucet left", + "canonical_instruction": "turn faucet left", + "parquet": "data/chunk-021/episode_021052.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021052.mp4" + }, + { + "episode_id": 6963, + "source_index": 6963, + "raw_length": 46, + "instruction": "take the eggplant out of the drawer and put it on the left side of the table", + "canonical_instruction": "take the eggplant out of the drawer and put it on the left side of the table", + "parquet": "data/chunk-006/episode_006963.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006963.mp4" + }, + { + "episode_id": 11085, + "source_index": 11085, + "raw_length": 38, + "instruction": "move the silver pot to the left burner", + "canonical_instruction": "move the silver pot to the left burner", + "parquet": "data/chunk-011/episode_011085.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011085.mp4" + }, + { + "episode_id": 6560, + "source_index": 6560, + "raw_length": 34, + "instruction": "PICK UP THE GREEN TOWEL AND PUT ANOTHER SIDE OF THE TABLE", + "canonical_instruction": "pick up the green towel and put another side of the table", + "parquet": "data/chunk-006/episode_006560.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006560.mp4" + }, + { + "episode_id": 28579, + "source_index": 28579, + "raw_length": 24, + "instruction": "close a drawer", + "canonical_instruction": "close a drawer", + "parquet": "data/chunk-028/episode_028579.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028579.mp4" + }, + { + "episode_id": 4198, + "source_index": 4198, + "raw_length": 37, + "instruction": "Pick up the pot and place it the front of the table", + "canonical_instruction": "pick up the pot and place it the front of the table", + "parquet": "data/chunk-004/episode_004198.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004198.mp4" + }, + { + "episode_id": 16333, + "source_index": 16333, + "raw_length": 41, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-016/episode_016333.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016333.mp4" + }, + { + "episode_id": 37744, + "source_index": 37744, + "raw_length": 40, + "instruction": "Moved the brush to the upper right corner of the cooker", + "canonical_instruction": "moved the brush to the upper right corner of the cooker", + "parquet": "data/chunk-037/episode_037744.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037744.mp4" + }, + { + "episode_id": 1267, + "source_index": 1267, + "raw_length": 31, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-001/episode_001267.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001267.mp4" + }, + { + "episode_id": 43175, + "source_index": 43175, + "raw_length": 43, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-043/episode_043175.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043175.mp4" + }, + { + "episode_id": 33383, + "source_index": 33383, + "raw_length": 21, + "instruction": "put carrot on cutting board", + "canonical_instruction": "put carrot on cutting board", + "parquet": "data/chunk-033/episode_033383.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033383.mp4" + }, + { + "episode_id": 7030, + "source_index": 7030, + "raw_length": 34, + "instruction": "Move the spatula to the middle left of the table", + "canonical_instruction": "move the spatula to the middle left of the table", + "parquet": "data/chunk-007/episode_007030.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007030.mp4" + }, + { + "episode_id": 7231, + "source_index": 7231, + "raw_length": 36, + "instruction": "take lid off pot", + "canonical_instruction": "take lid off pot", + "parquet": "data/chunk-007/episode_007231.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007231.mp4" + }, + { + "episode_id": 42583, + "source_index": 42583, + "raw_length": 33, + "instruction": "take spoon out of bowl sink", + "canonical_instruction": "take spoon out of bowl sink", + "parquet": "data/chunk-042/episode_042583.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042583.mp4" + }, + { + "episode_id": 21591, + "source_index": 21591, + "raw_length": 41, + "instruction": "Place the green handled spatula on the yellow cloth.", + "canonical_instruction": "place the green handled spatula on the yellow cloth", + "parquet": "data/chunk-021/episode_021591.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021591.mp4" + }, + { + "episode_id": 47959, + "source_index": 47959, + "raw_length": 71, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-047/episode_047959.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047959.mp4" + }, + { + "episode_id": 33608, + "source_index": 33608, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-033/episode_033608.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033608.mp4" + }, + { + "episode_id": 24352, + "source_index": 24352, + "raw_length": 36, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-024/episode_024352.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024352.mp4" + }, + { + "episode_id": 1937, + "source_index": 1937, + "raw_length": 34, + "instruction": "plier le tissu bas de droite vers le haut de gauche", + "canonical_instruction": "plier le tissu bas de droite vers le haut de gauche", + "parquet": "data/chunk-001/episode_001937.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001937.mp4" + }, + { + "episode_id": 27698, + "source_index": 27698, + "raw_length": 46, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-027/episode_027698.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027698.mp4" + }, + { + "episode_id": 23925, + "source_index": 23925, + "raw_length": 41, + "instruction": "unfold the cloth from top left to bottom right", + "canonical_instruction": "unfold the cloth from top left to bottom right", + "parquet": "data/chunk-023/episode_023925.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023925.mp4" + }, + { + "episode_id": 44904, + "source_index": 44904, + "raw_length": 46, + "instruction": "move a doll beside the left burner", + "canonical_instruction": "move a doll beside the left burner", + "parquet": "data/chunk-044/episode_044904.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044904.mp4" + }, + { + "episode_id": 42052, + "source_index": 42052, + "raw_length": 20, + "instruction": "put pan from drying rack into sink", + "canonical_instruction": "put pan from drying rack into sink", + "parquet": "data/chunk-042/episode_042052.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042052.mp4" + }, + { + "episode_id": 30757, + "source_index": 30757, + "raw_length": 23, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-030/episode_030757.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030757.mp4" + }, + { + "episode_id": 38973, + "source_index": 38973, + "raw_length": 46, + "instruction": "unfold the cloth from right to left", + "canonical_instruction": "unfold the cloth from right to left", + "parquet": "data/chunk-038/episode_038973.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038973.mp4" + }, + { + "episode_id": 46757, + "source_index": 46757, + "raw_length": 33, + "instruction": "Place the green lime inside the pot", + "canonical_instruction": "place the green lime inside the pot", + "parquet": "data/chunk-046/episode_046757.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046757.mp4" + }, + { + "episode_id": 16894, + "source_index": 16894, + "raw_length": 29, + "instruction": "Place the pot behind the green pear", + "canonical_instruction": "place the pot behind the green pear", + "parquet": "data/chunk-016/episode_016894.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016894.mp4" + }, + { + "episode_id": 20644, + "source_index": 20644, + "raw_length": 53, + "instruction": "Put the red object in the pot on the left burner", + "canonical_instruction": "put the red object in the pot on the left burner", + "parquet": "data/chunk-020/episode_020644.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020644.mp4" + }, + { + "episode_id": 46431, + "source_index": 46431, + "raw_length": 27, + "instruction": "take bowl off plate", + "canonical_instruction": "take bowl off plate", + "parquet": "data/chunk-046/episode_046431.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046431.mp4" + }, + { + "episode_id": 20251, + "source_index": 20251, + "raw_length": 28, + "instruction": "move the banana above the drawer", + "canonical_instruction": "move the banana above the drawer", + "parquet": "data/chunk-020/episode_020251.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020251.mp4" + }, + { + "episode_id": 46667, + "source_index": 46667, + "raw_length": 34, + "instruction": "move the silver basket to the right burner", + "canonical_instruction": "move the silver basket to the right burner", + "parquet": "data/chunk-046/episode_046667.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046667.mp4" + }, + { + "episode_id": 51755, + "source_index": 51755, + "raw_length": 38, + "instruction": "moved the pot lid to the right side of burner", + "canonical_instruction": "moved the pot lid to the right side of burner", + "parquet": "data/chunk-051/episode_051755.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051755.mp4" + }, + { + "episode_id": 34337, + "source_index": 34337, + "raw_length": 37, + "instruction": "fold the cloth from the bottom right to the center", + "canonical_instruction": "fold the cloth from the bottom right to the center", + "parquet": "data/chunk-034/episode_034337.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034337.mp4" + }, + { + "episode_id": 14143, + "source_index": 14143, + "raw_length": 24, + "instruction": "open the lid of the silver pot", + "canonical_instruction": "open the lid of the silver pot", + "parquet": "data/chunk-014/episode_014143.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014143.mp4" + }, + { + "episode_id": 30081, + "source_index": 30081, + "raw_length": 25, + "instruction": "Move the orange cloth to the right side of the table", + "canonical_instruction": "move the orange cloth to the right side of the table", + "parquet": "data/chunk-030/episode_030081.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030081.mp4" + }, + { + "episode_id": 51580, + "source_index": 51580, + "raw_length": 32, + "instruction": "put banana in pot cardboard fence", + "canonical_instruction": "put banana in pot cardboard fence", + "parquet": "data/chunk-051/episode_051580.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051580.mp4" + }, + { + "episode_id": 31807, + "source_index": 31807, + "raw_length": 46, + "instruction": "Slide towel over towards left corner of counter.", + "canonical_instruction": "slide towel over towards left corner of counter", + "parquet": "data/chunk-031/episode_031807.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031807.mp4" + }, + { + "episode_id": 38717, + "source_index": 38717, + "raw_length": 36, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-038/episode_038717.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038717.mp4" + }, + { + "episode_id": 2283, + "source_index": 2283, + "raw_length": 38, + "instruction": "move the blue figure to the left edge of the cloth", + "canonical_instruction": "move the blue figure to the left edge of the cloth", + "parquet": "data/chunk-002/episode_002283.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002283.mp4" + }, + { + "episode_id": 13579, + "source_index": 13579, + "raw_length": 39, + "instruction": "pick up the cube from the cloth and place it on the left of the table", + "canonical_instruction": "pick up the cube from the cloth and place it on the left of the table", + "parquet": "data/chunk-013/episode_013579.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013579.mp4" + }, + { + "episode_id": 31444, + "source_index": 31444, + "raw_length": 21, + "instruction": "zip zipper bag", + "canonical_instruction": "zip zipper bag", + "parquet": "data/chunk-031/episode_031444.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031444.mp4" + }, + { + "episode_id": 28685, + "source_index": 28685, + "raw_length": 29, + "instruction": "take cup off plate", + "canonical_instruction": "take cup off plate", + "parquet": "data/chunk-028/episode_028685.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028685.mp4" + }, + { + "episode_id": 31359, + "source_index": 31359, + "raw_length": 46, + "instruction": "put the red arch on the top of the blue block", + "canonical_instruction": "put the red arch on the top of the blue block", + "parquet": "data/chunk-031/episode_031359.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031359.mp4" + }, + { + "episode_id": 42109, + "source_index": 42109, + "raw_length": 24, + "instruction": "Move the orange cloth to the left side of the table", + "canonical_instruction": "move the orange cloth to the left side of the table", + "parquet": "data/chunk-042/episode_042109.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042109.mp4" + }, + { + "episode_id": 6922, + "source_index": 6922, + "raw_length": 45, + "instruction": "put the yellow object in the pot", + "canonical_instruction": "put the yellow object in the pot", + "parquet": "data/chunk-006/episode_006922.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006922.mp4" + }, + { + "episode_id": 23543, + "source_index": 23543, + "raw_length": 20, + "instruction": "carrying the pot from the back burner to the front burner", + "canonical_instruction": "carrying the pot from the back burner to the front burner", + "parquet": "data/chunk-023/episode_023543.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023543.mp4" + }, + { + "episode_id": 53131, + "source_index": 53131, + "raw_length": 31, + "instruction": "take the silver pot from the upper right burner and move it on the lower right burner", + "canonical_instruction": "take the silver pot from the upper right burner and move it on the lower right burner", + "parquet": "data/chunk-053/episode_053131.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053131.mp4" + }, + { + "episode_id": 27659, + "source_index": 27659, + "raw_length": 26, + "instruction": "pick up the lemon and put it on the lower stove on the right", + "canonical_instruction": "pick up the lemon and put it on the lower stove on the right", + "parquet": "data/chunk-027/episode_027659.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027659.mp4" + }, + { + "episode_id": 49398, + "source_index": 49398, + "raw_length": 69, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-049/episode_049398.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049398.mp4" + }, + { + "episode_id": 22481, + "source_index": 22481, + "raw_length": 26, + "instruction": "put purple towel from lower to the top right side of the table", + "canonical_instruction": "put purple towel from lower to the top right side of the table", + "parquet": "data/chunk-022/episode_022481.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022481.mp4" + }, + { + "episode_id": 41696, + "source_index": 41696, + "raw_length": 29, + "instruction": "Move the silver pot into the bottom right side of the burner", + "canonical_instruction": "move the silver pot into the bottom right side of the burner", + "parquet": "data/chunk-041/episode_041696.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041696.mp4" + }, + { + "episode_id": 28362, + "source_index": 28362, + "raw_length": 26, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-028/episode_028362.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028362.mp4" + }, + { + "episode_id": 4517, + "source_index": 4517, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-004/episode_004517.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004517.mp4" + }, + { + "episode_id": 8952, + "source_index": 8952, + "raw_length": 34, + "instruction": "put cucumber in cup", + "canonical_instruction": "put cucumber in cup", + "parquet": "data/chunk-008/episode_008952.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008952.mp4" + }, + { + "episode_id": 5093, + "source_index": 5093, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-005/episode_005093.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005093.mp4" + }, + { + "episode_id": 10466, + "source_index": 10466, + "raw_length": 24, + "instruction": "move the white object between the green and red object", + "canonical_instruction": "move the white object between the green and red object", + "parquet": "data/chunk-010/episode_010466.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010466.mp4" + }, + { + "episode_id": 2411, + "source_index": 2411, + "raw_length": 42, + "instruction": "Move the sushi to the right of the colander", + "canonical_instruction": "move the sushi to the right of the colander", + "parquet": "data/chunk-002/episode_002411.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002411.mp4" + }, + { + "episode_id": 39692, + "source_index": 39692, + "raw_length": 21, + "instruction": "pick up bowl and put in small4fbox", + "canonical_instruction": "pick up bowl and put in small4fbox", + "parquet": "data/chunk-039/episode_039692.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039692.mp4" + }, + { + "episode_id": 33941, + "source_index": 33941, + "raw_length": 27, + "instruction": "put spoon in bowl sink", + "canonical_instruction": "put spoon in bowl sink", + "parquet": "data/chunk-033/episode_033941.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033941.mp4" + }, + { + "episode_id": 12781, + "source_index": 12781, + "raw_length": 35, + "instruction": "move the cube to right side of the table", + "canonical_instruction": "move the cube to right side of the table", + "parquet": "data/chunk-012/episode_012781.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012781.mp4" + }, + { + "episode_id": 41949, + "source_index": 41949, + "raw_length": 31, + "instruction": "Moves the brush from the top left to the bottom.", + "canonical_instruction": "moves the brush from the top left to the bottom", + "parquet": "data/chunk-041/episode_041949.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041949.mp4" + }, + { + "episode_id": 51179, + "source_index": 51179, + "raw_length": 38, + "instruction": "fold the cloth from right to left", + "canonical_instruction": "fold the cloth from right to left", + "parquet": "data/chunk-051/episode_051179.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051179.mp4" + }, + { + "episode_id": 4212, + "source_index": 4212, + "raw_length": 35, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-004/episode_004212.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004212.mp4" + }, + { + "episode_id": 40370, + "source_index": 40370, + "raw_length": 40, + "instruction": "move the yellow block from the tower into the center of the table", + "canonical_instruction": "move the yellow block from the tower into the center of the table", + "parquet": "data/chunk-040/episode_040370.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040370.mp4" + }, + { + "episode_id": 37500, + "source_index": 37500, + "raw_length": 39, + "instruction": "put the red strawberry into the brown pot", + "canonical_instruction": "put the red strawberry into the brown pot", + "parquet": "data/chunk-037/episode_037500.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037500.mp4" + }, + { + "episode_id": 48308, + "source_index": 48308, + "raw_length": 39, + "instruction": "put the towel in the back left corner", + "canonical_instruction": "put the towel in the back left corner", + "parquet": "data/chunk-048/episode_048308.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048308.mp4" + }, + { + "episode_id": 18027, + "source_index": 18027, + "raw_length": 35, + "instruction": "take the sushi out of the drawer and place it on the left side of the table", + "canonical_instruction": "take the sushi out of the drawer and place it on the left side of the table", + "parquet": "data/chunk-018/episode_018027.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018027.mp4" + }, + { + "episode_id": 17967, + "source_index": 17967, + "raw_length": 19, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-017/episode_017967.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017967.mp4" + }, + { + "episode_id": 19104, + "source_index": 19104, + "raw_length": 32, + "instruction": "move the silver pot to the right burner", + "canonical_instruction": "move the silver pot to the right burner", + "parquet": "data/chunk-019/episode_019104.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019104.mp4" + }, + { + "episode_id": 36150, + "source_index": 36150, + "raw_length": 44, + "instruction": "Place the mushroom in the pot", + "canonical_instruction": "place the mushroom in the pot", + "parquet": "data/chunk-036/episode_036150.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036150.mp4" + }, + { + "episode_id": 10859, + "source_index": 10859, + "raw_length": 33, + "instruction": "Put the pepper in the bowl.", + "canonical_instruction": "put the pepper in the bowl", + "parquet": "data/chunk-010/episode_010859.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010859.mp4" + }, + { + "episode_id": 49399, + "source_index": 49399, + "raw_length": 31, + "instruction": "take the red object from the drawer to the bottom right side of the white table", + "canonical_instruction": "take the red object from the drawer to the bottom right side of the white table", + "parquet": "data/chunk-049/episode_049399.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049399.mp4" + }, + { + "episode_id": 1899, + "source_index": 1899, + "raw_length": 31, + "instruction": "fold the cloth from the bottom to the top", + "canonical_instruction": "fold the cloth from the bottom to the top", + "parquet": "data/chunk-001/episode_001899.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001899.mp4" + }, + { + "episode_id": 22289, + "source_index": 22289, + "raw_length": 38, + "instruction": "put the brush behind the pan", + "canonical_instruction": "put the brush behind the pan", + "parquet": "data/chunk-022/episode_022289.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022289.mp4" + }, + { + "episode_id": 47235, + "source_index": 47235, + "raw_length": 46, + "instruction": "move the ball from the cup and put it in the middle of the table", + "canonical_instruction": "move the ball from the cup and put it in the middle of the table", + "parquet": "data/chunk-047/episode_047235.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047235.mp4" + }, + { + "episode_id": 32401, + "source_index": 32401, + "raw_length": 26, + "instruction": "put beet in pot sink", + "canonical_instruction": "put beet in pot sink", + "parquet": "data/chunk-032/episode_032401.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032401.mp4" + }, + { + "episode_id": 21753, + "source_index": 21753, + "raw_length": 21, + "instruction": "open white1fbox flap", + "canonical_instruction": "open white1fbox flap", + "parquet": "data/chunk-021/episode_021753.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021753.mp4" + }, + { + "episode_id": 45244, + "source_index": 45244, + "raw_length": 28, + "instruction": "put spatula on cutting board", + "canonical_instruction": "put spatula on cutting board", + "parquet": "data/chunk-045/episode_045244.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045244.mp4" + }, + { + "episode_id": 6688, + "source_index": 6688, + "raw_length": 21, + "instruction": "turn faucet left", + "canonical_instruction": "turn faucet left", + "parquet": "data/chunk-006/episode_006688.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006688.mp4" + }, + { + "episode_id": 17681, + "source_index": 17681, + "raw_length": 45, + "instruction": "unfold the cloth from top left to bottom right", + "canonical_instruction": "unfold the cloth from top left to bottom right", + "parquet": "data/chunk-017/episode_017681.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017681.mp4" + }, + { + "episode_id": 47954, + "source_index": 47954, + "raw_length": 32, + "instruction": "move the blue brush to the top part of the stove", + "canonical_instruction": "move the blue brush to the top part of the stove", + "parquet": "data/chunk-047/episode_047954.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047954.mp4" + }, + { + "episode_id": 38617, + "source_index": 38617, + "raw_length": 46, + "instruction": "put the rectangular block on top of the cylinder", + "canonical_instruction": "put the rectangular block on top of the cylinder", + "parquet": "data/chunk-038/episode_038617.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038617.mp4" + }, + { + "episode_id": 42876, + "source_index": 42876, + "raw_length": 21, + "instruction": "put pot or pan on stove", + "canonical_instruction": "put pot or pan on stove", + "parquet": "data/chunk-042/episode_042876.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042876.mp4" + }, + { + "episode_id": 34794, + "source_index": 34794, + "raw_length": 37, + "instruction": "remove pan from cloth and keep in near side", + "canonical_instruction": "remove pan from cloth and keep in near side", + "parquet": "data/chunk-034/episode_034794.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034794.mp4" + }, + { + "episode_id": 18113, + "source_index": 18113, + "raw_length": 24, + "instruction": "put lemon on plate", + "canonical_instruction": "put lemon on plate", + "parquet": "data/chunk-018/episode_018113.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018113.mp4" + }, + { + "episode_id": 45526, + "source_index": 45526, + "raw_length": 38, + "instruction": "Move the silver pot to the top side of the table", + "canonical_instruction": "move the silver pot to the top side of the table", + "parquet": "data/chunk-045/episode_045526.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045526.mp4" + }, + { + "episode_id": 44730, + "source_index": 44730, + "raw_length": 28, + "instruction": "move the silver pot to the left side of the lid", + "canonical_instruction": "move the silver pot to the left side of the lid", + "parquet": "data/chunk-044/episode_044730.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044730.mp4" + }, + { + "episode_id": 21733, + "source_index": 21733, + "raw_length": 24, + "instruction": "take bowl off plate cardboard fence", + "canonical_instruction": "take bowl off plate cardboard fence", + "parquet": "data/chunk-021/episode_021733.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021733.mp4" + }, + { + "episode_id": 36395, + "source_index": 36395, + "raw_length": 40, + "instruction": "move the green cloth in between the vessel and the spatula", + "canonical_instruction": "move the green cloth in between the vessel and the spatula", + "parquet": "data/chunk-036/episode_036395.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036395.mp4" + }, + { + "episode_id": 49810, + "source_index": 49810, + "raw_length": 21, + "instruction": "pick up pot", + "canonical_instruction": "pick up pot", + "parquet": "data/chunk-049/episode_049810.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049810.mp4" + }, + { + "episode_id": 7121, + "source_index": 7121, + "raw_length": 36, + "instruction": "move the cloth to the bottom right side of the burner", + "canonical_instruction": "move the cloth to the bottom right side of the burner", + "parquet": "data/chunk-007/episode_007121.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007121.mp4" + }, + { + "episode_id": 36741, + "source_index": 36741, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-036/episode_036741.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036741.mp4" + }, + { + "episode_id": 31293, + "source_index": 31293, + "raw_length": 22, + "instruction": "put carrot in bowl", + "canonical_instruction": "put carrot in bowl", + "parquet": "data/chunk-031/episode_031293.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031293.mp4" + }, + { + "episode_id": 17175, + "source_index": 17175, + "raw_length": 21, + "instruction": "put carrot in pot or pan", + "canonical_instruction": "put carrot in pot or pan", + "parquet": "data/chunk-017/episode_017175.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017175.mp4" + }, + { + "episode_id": 16945, + "source_index": 16945, + "raw_length": 20, + "instruction": "pick up box cutter and put into drawer", + "canonical_instruction": "pick up box cutter and put into drawer", + "parquet": "data/chunk-016/episode_016945.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016945.mp4" + }, + { + "episode_id": 29766, + "source_index": 29766, + "raw_length": 41, + "instruction": "Put the spoon in front of the microwave", + "canonical_instruction": "put the spoon in front of the microwave", + "parquet": "data/chunk-029/episode_029766.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029766.mp4" + }, + { + "episode_id": 26197, + "source_index": 26197, + "raw_length": 20, + "instruction": "move the cloth to the middle of the table", + "canonical_instruction": "move the cloth to the middle of the table", + "parquet": "data/chunk-026/episode_026197.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026197.mp4" + }, + { + "episode_id": 5364, + "source_index": 5364, + "raw_length": 19, + "instruction": "moved the can from the left side of the table to the right side of the table", + "canonical_instruction": "moved the can from the left side of the table to the right side of the table", + "parquet": "data/chunk-005/episode_005364.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005364.mp4" + }, + { + "episode_id": 8364, + "source_index": 8364, + "raw_length": 56, + "instruction": "moved spoon to the upper center of the table", + "canonical_instruction": "moved spoon to the upper center of the table", + "parquet": "data/chunk-008/episode_008364.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008364.mp4" + }, + { + "episode_id": 51544, + "source_index": 51544, + "raw_length": 21, + "instruction": "put spoon in pot", + "canonical_instruction": "put spoon in pot", + "parquet": "data/chunk-051/episode_051544.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051544.mp4" + }, + { + "episode_id": 35880, + "source_index": 35880, + "raw_length": 28, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-035/episode_035880.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035880.mp4" + }, + { + "episode_id": 4457, + "source_index": 4457, + "raw_length": 26, + "instruction": "Pick up and move the towel to the middle bottom of the table", + "canonical_instruction": "pick up and move the towel to the middle bottom of the table", + "parquet": "data/chunk-004/episode_004457.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004457.mp4" + }, + { + "episode_id": 34748, + "source_index": 34748, + "raw_length": 32, + "instruction": "Put the drumstick on the purple cloth.", + "canonical_instruction": "put the drumstick on the purple cloth", + "parquet": "data/chunk-034/episode_034748.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034748.mp4" + }, + { + "episode_id": 49419, + "source_index": 49419, + "raw_length": 43, + "instruction": "move the pear to the bottom left of the burner", + "canonical_instruction": "move the pear to the bottom left of the burner", + "parquet": "data/chunk-049/episode_049419.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049419.mp4" + }, + { + "episode_id": 48866, + "source_index": 48866, + "raw_length": 30, + "instruction": "Put the red capsicum in the vessel.", + "canonical_instruction": "put the red capsicum in the vessel", + "parquet": "data/chunk-048/episode_048866.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048866.mp4" + }, + { + "episode_id": 4066, + "source_index": 4066, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-004/episode_004066.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004066.mp4" + }, + { + "episode_id": 41820, + "source_index": 41820, + "raw_length": 31, + "instruction": "move object from left to right", + "canonical_instruction": "move object from left to right", + "parquet": "data/chunk-041/episode_041820.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041820.mp4" + }, + { + "episode_id": 20538, + "source_index": 20538, + "raw_length": 35, + "instruction": "Move the green broccoli to the table's upper left corner.", + "canonical_instruction": "move the green broccoli to the table's upper left corner", + "parquet": "data/chunk-020/episode_020538.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020538.mp4" + }, + { + "episode_id": 35262, + "source_index": 35262, + "raw_length": 21, + "instruction": "move drying rack out of sink", + "canonical_instruction": "move drying rack out of sink", + "parquet": "data/chunk-035/episode_035262.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035262.mp4" + }, + { + "episode_id": 13895, + "source_index": 13895, + "raw_length": 34, + "instruction": "move the yellow object to the upper left burner", + "canonical_instruction": "move the yellow object to the upper left burner", + "parquet": "data/chunk-013/episode_013895.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013895.mp4" + }, + { + "episode_id": 14167, + "source_index": 14167, + "raw_length": 46, + "instruction": "fold the cloth from the top and unfold back at it's position", + "canonical_instruction": "fold the cloth from the top and unfold back at it's position", + "parquet": "data/chunk-014/episode_014167.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014167.mp4" + }, + { + "episode_id": 35728, + "source_index": 35728, + "raw_length": 41, + "instruction": "Pick up the salt shaker and put it to the right hand side of the top of the pot.", + "canonical_instruction": "pick up the salt shaker and put it to the right hand side of the top of the pot", + "parquet": "data/chunk-035/episode_035728.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035728.mp4" + }, + { + "episode_id": 21144, + "source_index": 21144, + "raw_length": 38, + "instruction": "unfold the cloth from bottom left to top right", + "canonical_instruction": "unfold the cloth from bottom left to top right", + "parquet": "data/chunk-021/episode_021144.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021144.mp4" + }, + { + "episode_id": 16010, + "source_index": 16010, + "raw_length": 32, + "instruction": "just numbers are given here, no image is here", + "canonical_instruction": "just numbers are given here, no image is here", + "parquet": "data/chunk-016/episode_016010.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016010.mp4" + }, + { + "episode_id": 48312, + "source_index": 48312, + "raw_length": 25, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-048/episode_048312.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048312.mp4" + }, + { + "episode_id": 3348, + "source_index": 3348, + "raw_length": 18, + "instruction": "flip pot upright which is in sink", + "canonical_instruction": "flip pot upright which is in sink", + "parquet": "data/chunk-003/episode_003348.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003348.mp4" + }, + { + "episode_id": 7520, + "source_index": 7520, + "raw_length": 21, + "instruction": "move drying rack out of sink", + "canonical_instruction": "move drying rack out of sink", + "parquet": "data/chunk-007/episode_007520.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007520.mp4" + }, + { + "episode_id": 150, + "source_index": 150, + "raw_length": 21, + "instruction": "put eggplant on plate", + "canonical_instruction": "put eggplant on plate", + "parquet": "data/chunk-000/episode_000150.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000150.mp4" + }, + { + "episode_id": 15240, + "source_index": 15240, + "raw_length": 26, + "instruction": "put lemon on plate", + "canonical_instruction": "put lemon on plate", + "parquet": "data/chunk-015/episode_015240.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015240.mp4" + }, + { + "episode_id": 770, + "source_index": 770, + "raw_length": 22, + "instruction": "Moved the yellow cloth on the lower right side of the stove.", + "canonical_instruction": "moved the yellow cloth on the lower right side of the stove", + "parquet": "data/chunk-000/episode_000770.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000770.mp4" + }, + { + "episode_id": 18960, + "source_index": 18960, + "raw_length": 46, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-018/episode_018960.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018960.mp4" + }, + { + "episode_id": 47952, + "source_index": 47952, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-047/episode_047952.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047952.mp4" + }, + { + "episode_id": 26104, + "source_index": 26104, + "raw_length": 37, + "instruction": "Moves the orange tool to the upper left of the table.", + "canonical_instruction": "moves the orange tool to the upper left of the table", + "parquet": "data/chunk-026/episode_026104.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026104.mp4" + }, + { + "episode_id": 11576, + "source_index": 11576, + "raw_length": 31, + "instruction": "moved the silver pot to the left side of the can", + "canonical_instruction": "moved the silver pot to the left side of the can", + "parquet": "data/chunk-011/episode_011576.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011576.mp4" + }, + { + "episode_id": 30212, + "source_index": 30212, + "raw_length": 46, + "instruction": "put the green arch on top of the red arch", + "canonical_instruction": "put the green arch on top of the red arch", + "parquet": "data/chunk-030/episode_030212.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030212.mp4" + }, + { + "episode_id": 14653, + "source_index": 14653, + "raw_length": 25, + "instruction": "cover the silver pot", + "canonical_instruction": "cover the silver pot", + "parquet": "data/chunk-014/episode_014653.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014653.mp4" + }, + { + "episode_id": 24140, + "source_index": 24140, + "raw_length": 41, + "instruction": "place the green item on the cloth", + "canonical_instruction": "place the green item on the cloth", + "parquet": "data/chunk-024/episode_024140.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024140.mp4" + }, + { + "episode_id": 41424, + "source_index": 41424, + "raw_length": 46, + "instruction": "Move the orange carrot from the left burner to the yellow cloth on the left burner", + "canonical_instruction": "move the orange carrot from the left burner to the yellow cloth on the left burner", + "parquet": "data/chunk-041/episode_041424.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041424.mp4" + }, + { + "episode_id": 17785, + "source_index": 17785, + "raw_length": 21, + "instruction": "put pan from drying rack into sink", + "canonical_instruction": "put pan from drying rack into sink", + "parquet": "data/chunk-017/episode_017785.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017785.mp4" + }, + { + "episode_id": 21640, + "source_index": 21640, + "raw_length": 24, + "instruction": "move the object from the cloth", + "canonical_instruction": "move the object from the cloth", + "parquet": "data/chunk-021/episode_021640.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021640.mp4" + }, + { + "episode_id": 39479, + "source_index": 39479, + "raw_length": 28, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-039/episode_039479.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039479.mp4" + }, + { + "episode_id": 30865, + "source_index": 30865, + "raw_length": 43, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-030/episode_030865.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030865.mp4" + }, + { + "episode_id": 52264, + "source_index": 52264, + "raw_length": 24, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-052/episode_052264.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052264.mp4" + }, + { + "episode_id": 13819, + "source_index": 13819, + "raw_length": 42, + "instruction": "move the yellow cloth to the upper left of the table", + "canonical_instruction": "move the yellow cloth to the upper left of the table", + "parquet": "data/chunk-013/episode_013819.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013819.mp4" + }, + { + "episode_id": 20101, + "source_index": 20101, + "raw_length": 28, + "instruction": "Move the pot to the bottom right corner of the table.", + "canonical_instruction": "move the pot to the bottom right corner of the table", + "parquet": "data/chunk-020/episode_020101.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020101.mp4" + }, + { + "episode_id": 34360, + "source_index": 34360, + "raw_length": 29, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-034/episode_034360.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034360.mp4" + }, + { + "episode_id": 19860, + "source_index": 19860, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-019/episode_019860.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019860.mp4" + }, + { + "episode_id": 18439, + "source_index": 18439, + "raw_length": 31, + "instruction": "Place the croissant behind the yellow knife", + "canonical_instruction": "place the croissant behind the yellow knife", + "parquet": "data/chunk-018/episode_018439.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018439.mp4" + }, + { + "episode_id": 41291, + "source_index": 41291, + "raw_length": 28, + "instruction": "move the yellow spoon on the bottom part of the table", + "canonical_instruction": "move the yellow spoon on the bottom part of the table", + "parquet": "data/chunk-041/episode_041291.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041291.mp4" + }, + { + "episode_id": 13897, + "source_index": 13897, + "raw_length": 46, + "instruction": "remove the red triangle to the right side of the table", + "canonical_instruction": "remove the red triangle to the right side of the table", + "parquet": "data/chunk-013/episode_013897.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013897.mp4" + }, + { + "episode_id": 28733, + "source_index": 28733, + "raw_length": 32, + "instruction": "HGGFFG", + "canonical_instruction": "hggffg", + "parquet": "data/chunk-028/episode_028733.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028733.mp4" + }, + { + "episode_id": 38888, + "source_index": 38888, + "raw_length": 36, + "instruction": "upright metal pot cardboard fence", + "canonical_instruction": "upright metal pot cardboard fence", + "parquet": "data/chunk-038/episode_038888.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038888.mp4" + }, + { + "episode_id": 40342, + "source_index": 40342, + "raw_length": 23, + "instruction": "move the green cloth to upper right of the burner", + "canonical_instruction": "move the green cloth to upper right of the burner", + "parquet": "data/chunk-040/episode_040342.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040342.mp4" + }, + { + "episode_id": 4330, + "source_index": 4330, + "raw_length": 22, + "instruction": "move the orange fork to the left side of the table", + "canonical_instruction": "move the orange fork to the left side of the table", + "parquet": "data/chunk-004/episode_004330.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004330.mp4" + }, + { + "episode_id": 10133, + "source_index": 10133, + "raw_length": 28, + "instruction": "Move the bell pepper behind the beige cloth.", + "canonical_instruction": "move the bell pepper behind the beige cloth", + "parquet": "data/chunk-010/episode_010133.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010133.mp4" + }, + { + "episode_id": 46504, + "source_index": 46504, + "raw_length": 46, + "instruction": "move silver pot from bottom right burner to top right burner", + "canonical_instruction": "move silver pot from bottom right burner to top right burner", + "parquet": "data/chunk-046/episode_046504.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046504.mp4" + }, + { + "episode_id": 39225, + "source_index": 39225, + "raw_length": 34, + "instruction": "move the silver to the right burner", + "canonical_instruction": "move the silver to the right burner", + "parquet": "data/chunk-039/episode_039225.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039225.mp4" + }, + { + "episode_id": 8092, + "source_index": 8092, + "raw_length": 28, + "instruction": "put down the bottle inside the pot", + "canonical_instruction": "put down the bottle inside the pot", + "parquet": "data/chunk-008/episode_008092.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008092.mp4" + }, + { + "episode_id": 9428, + "source_index": 9428, + "raw_length": 46, + "instruction": "Put ths block with circle above the another", + "canonical_instruction": "put ths block with circle above the another", + "parquet": "data/chunk-009/episode_009428.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009428.mp4" + }, + { + "episode_id": 50884, + "source_index": 50884, + "raw_length": 31, + "instruction": "take banana out of colander", + "canonical_instruction": "take banana out of colander", + "parquet": "data/chunk-050/episode_050884.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050884.mp4" + }, + { + "episode_id": 17380, + "source_index": 17380, + "raw_length": 26, + "instruction": "take sushi out of pan", + "canonical_instruction": "take sushi out of pan", + "parquet": "data/chunk-017/episode_017380.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017380.mp4" + }, + { + "episode_id": 7106, + "source_index": 7106, + "raw_length": 29, + "instruction": "move the white object to the left burner", + "canonical_instruction": "move the white object to the left burner", + "parquet": "data/chunk-007/episode_007106.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007106.mp4" + }, + { + "episode_id": 27806, + "source_index": 27806, + "raw_length": 17, + "instruction": "put spoon in pot", + "canonical_instruction": "put spoon in pot", + "parquet": "data/chunk-027/episode_027806.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027806.mp4" + }, + { + "episode_id": 8528, + "source_index": 8528, + "raw_length": 33, + "instruction": "move the yellow corn to the top of the drawer", + "canonical_instruction": "move the yellow corn to the top of the drawer", + "parquet": "data/chunk-008/episode_008528.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008528.mp4" + }, + { + "episode_id": 53029, + "source_index": 53029, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-053/episode_053029.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053029.mp4" + }, + { + "episode_id": 48485, + "source_index": 48485, + "raw_length": 18, + "instruction": "move the towel to the top of the table", + "canonical_instruction": "move the towel to the top of the table", + "parquet": "data/chunk-048/episode_048485.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048485.mp4" + }, + { + "episode_id": 28637, + "source_index": 28637, + "raw_length": 36, + "instruction": "move the orange cloth to the bottom right corner of the table", + "canonical_instruction": "move the orange cloth to the bottom right corner of the table", + "parquet": "data/chunk-028/episode_028637.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028637.mp4" + }, + { + "episode_id": 6895, + "source_index": 6895, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-006/episode_006895.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006895.mp4" + }, + { + "episode_id": 20498, + "source_index": 20498, + "raw_length": 30, + "instruction": "PICK UP THE BRESH AND PUT ON THE TOWEL", + "canonical_instruction": "pick up the bresh and put on the towel", + "parquet": "data/chunk-020/episode_020498.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020498.mp4" + }, + { + "episode_id": 48933, + "source_index": 48933, + "raw_length": 24, + "instruction": "put banana in colander", + "canonical_instruction": "put banana in colander", + "parquet": "data/chunk-048/episode_048933.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048933.mp4" + }, + { + "episode_id": 46940, + "source_index": 46940, + "raw_length": 33, + "instruction": "move the green thing from the blue towel to lower middle part of the table", + "canonical_instruction": "move the green thing from the blue towel to lower middle part of the table", + "parquet": "data/chunk-046/episode_046940.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046940.mp4" + }, + { + "episode_id": 1822, + "source_index": 1822, + "raw_length": 47, + "instruction": "move the sufuria into the sink", + "canonical_instruction": "move the sufuria into the sink", + "parquet": "data/chunk-001/episode_001822.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001822.mp4" + }, + { + "episode_id": 1719, + "source_index": 1719, + "raw_length": 41, + "instruction": "move the pot lid to the bottom left burner", + "canonical_instruction": "move the pot lid to the bottom left burner", + "parquet": "data/chunk-001/episode_001719.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001719.mp4" + }, + { + "episode_id": 37568, + "source_index": 37568, + "raw_length": 17, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-037/episode_037568.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037568.mp4" + }, + { + "episode_id": 10288, + "source_index": 10288, + "raw_length": 38, + "instruction": "Put the lid on the top right burner", + "canonical_instruction": "put the lid on the top right burner", + "parquet": "data/chunk-010/episode_010288.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010288.mp4" + }, + { + "episode_id": 41924, + "source_index": 41924, + "raw_length": 38, + "instruction": "unfold the cloth from top right to left", + "canonical_instruction": "unfold the cloth from top right to left", + "parquet": "data/chunk-041/episode_041924.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041924.mp4" + }, + { + "episode_id": 26591, + "source_index": 26591, + "raw_length": 35, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-026/episode_026591.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026591.mp4" + }, + { + "episode_id": 37423, + "source_index": 37423, + "raw_length": 32, + "instruction": "slide the towel to the center front table edge", + "canonical_instruction": "slide the towel to the center front table edge", + "parquet": "data/chunk-037/episode_037423.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037423.mp4" + }, + { + "episode_id": 48901, + "source_index": 48901, + "raw_length": 31, + "instruction": "unfolds the fabric from top to right to bottom to left", + "canonical_instruction": "unfolds the fabric from top to right to bottom to left", + "parquet": "data/chunk-048/episode_048901.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048901.mp4" + }, + { + "episode_id": 35569, + "source_index": 35569, + "raw_length": 29, + "instruction": "Move thin white block on top of flat white block on right", + "canonical_instruction": "move thin white block on top of flat white block on right", + "parquet": "data/chunk-035/episode_035569.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035569.mp4" + }, + { + "episode_id": 42782, + "source_index": 42782, + "raw_length": 24, + "instruction": "move the cloth from left side ot the table", + "canonical_instruction": "move the cloth from left side ot the table", + "parquet": "data/chunk-042/episode_042782.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042782.mp4" + }, + { + "episode_id": 29553, + "source_index": 29553, + "raw_length": 31, + "instruction": "put the pot lid on the silver pot", + "canonical_instruction": "put the pot lid on the silver pot", + "parquet": "data/chunk-029/episode_029553.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029553.mp4" + }, + { + "episode_id": 11350, + "source_index": 11350, + "raw_length": 32, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-011/episode_011350.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011350.mp4" + }, + { + "episode_id": 6885, + "source_index": 6885, + "raw_length": 42, + "instruction": "put the green cube on top of the rectangle block", + "canonical_instruction": "put the green cube on top of the rectangle block", + "parquet": "data/chunk-006/episode_006885.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006885.mp4" + }, + { + "episode_id": 45283, + "source_index": 45283, + "raw_length": 36, + "instruction": "put the circle block in the middle of table", + "canonical_instruction": "put the circle block in the middle of table", + "parquet": "data/chunk-045/episode_045283.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045283.mp4" + }, + { + "episode_id": 23676, + "source_index": 23676, + "raw_length": 37, + "instruction": "Take the green vegetable from the pot and place it in the right bottom of the table.", + "canonical_instruction": "take the green vegetable from the pot and place it in the right bottom of the table", + "parquet": "data/chunk-023/episode_023676.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023676.mp4" + }, + { + "episode_id": 33715, + "source_index": 33715, + "raw_length": 25, + "instruction": "pick up green mug", + "canonical_instruction": "pick up green mug", + "parquet": "data/chunk-033/episode_033715.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033715.mp4" + }, + { + "episode_id": 15586, + "source_index": 15586, + "raw_length": 36, + "instruction": "picking up the red toy and putting it outside the drawer", + "canonical_instruction": "picking up the red toy and putting it outside the drawer", + "parquet": "data/chunk-015/episode_015586.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015586.mp4" + }, + { + "episode_id": 47056, + "source_index": 47056, + "raw_length": 28, + "instruction": "opened the drawer", + "canonical_instruction": "opened the drawer", + "parquet": "data/chunk-047/episode_047056.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047056.mp4" + }, + { + "episode_id": 44176, + "source_index": 44176, + "raw_length": 26, + "instruction": "Place the orange vegetable in the silver pot.", + "canonical_instruction": "place the orange vegetable in the silver pot", + "parquet": "data/chunk-044/episode_044176.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044176.mp4" + }, + { + "episode_id": 2093, + "source_index": 2093, + "raw_length": 18, + "instruction": "put sweet potato in pan which is on stove", + "canonical_instruction": "put sweet potato in pan which is on stove", + "parquet": "data/chunk-002/episode_002093.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002093.mp4" + }, + { + "episode_id": 36, + "source_index": 36, + "raw_length": 74, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-000/episode_000036.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000036.mp4" + }, + { + "episode_id": 21350, + "source_index": 21350, + "raw_length": 37, + "instruction": "place the can to the right side of the burner", + "canonical_instruction": "place the can to the right side of the burner", + "parquet": "data/chunk-021/episode_021350.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021350.mp4" + }, + { + "episode_id": 47388, + "source_index": 47388, + "raw_length": 34, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-047/episode_047388.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047388.mp4" + }, + { + "episode_id": 41376, + "source_index": 41376, + "raw_length": 21, + "instruction": "put strawberry in pot", + "canonical_instruction": "put strawberry in pot", + "parquet": "data/chunk-041/episode_041376.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041376.mp4" + }, + { + "episode_id": 797, + "source_index": 797, + "raw_length": 31, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-000/episode_000797.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000797.mp4" + }, + { + "episode_id": 12596, + "source_index": 12596, + "raw_length": 46, + "instruction": "put the red cube on top of the yellow cube", + "canonical_instruction": "put the red cube on top of the yellow cube", + "parquet": "data/chunk-012/episode_012596.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012596.mp4" + }, + { + "episode_id": 33967, + "source_index": 33967, + "raw_length": 26, + "instruction": "put broccoli in pot or pan", + "canonical_instruction": "put broccoli in pot or pan", + "parquet": "data/chunk-033/episode_033967.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033967.mp4" + }, + { + "episode_id": 23571, + "source_index": 23571, + "raw_length": 21, + "instruction": "put sweet potato in pan which is on stove", + "canonical_instruction": "put sweet potato in pan which is on stove", + "parquet": "data/chunk-023/episode_023571.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023571.mp4" + }, + { + "episode_id": 33735, + "source_index": 33735, + "raw_length": 46, + "instruction": "put the cube on top of the cylinder", + "canonical_instruction": "put the cube on top of the cylinder", + "parquet": "data/chunk-033/episode_033735.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033735.mp4" + }, + { + "episode_id": 20574, + "source_index": 20574, + "raw_length": 41, + "instruction": "Place the green pepper in the pot", + "canonical_instruction": "place the green pepper in the pot", + "parquet": "data/chunk-020/episode_020574.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020574.mp4" + }, + { + "episode_id": 268, + "source_index": 268, + "raw_length": 31, + "instruction": "Move the bowl closer to the bottom right of the table.", + "canonical_instruction": "move the bowl closer to the bottom right of the table", + "parquet": "data/chunk-000/episode_000268.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000268.mp4" + }, + { + "episode_id": 21589, + "source_index": 21589, + "raw_length": 22, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-021/episode_021589.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021589.mp4" + }, + { + "episode_id": 28212, + "source_index": 28212, + "raw_length": 29, + "instruction": "move the green object to the left stove", + "canonical_instruction": "move the green object to the left stove", + "parquet": "data/chunk-028/episode_028212.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028212.mp4" + }, + { + "episode_id": 29439, + "source_index": 29439, + "raw_length": 60, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-029/episode_029439.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029439.mp4" + }, + { + "episode_id": 33035, + "source_index": 33035, + "raw_length": 30, + "instruction": "Move the napkin closer to the microwave door, under the spoon.", + "canonical_instruction": "move the napkin closer to the microwave door, under the spoon", + "parquet": "data/chunk-033/episode_033035.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033035.mp4" + }, + { + "episode_id": 27502, + "source_index": 27502, + "raw_length": 36, + "instruction": "put knife on cutting board cardboard fence", + "canonical_instruction": "put knife on cutting board cardboard fence", + "parquet": "data/chunk-027/episode_027502.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027502.mp4" + }, + { + "episode_id": 5375, + "source_index": 5375, + "raw_length": 44, + "instruction": "Move the spoon to the other side of the table", + "canonical_instruction": "move the spoon to the other side of the table", + "parquet": "data/chunk-005/episode_005375.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005375.mp4" + }, + { + "episode_id": 42171, + "source_index": 42171, + "raw_length": 33, + "instruction": "fold the cloth from left to right", + "canonical_instruction": "fold the cloth from left to right", + "parquet": "data/chunk-042/episode_042171.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042171.mp4" + }, + { + "episode_id": 26872, + "source_index": 26872, + "raw_length": 39, + "instruction": "pick up blue fork and move back near pot and yellow cloth", + "canonical_instruction": "pick up blue fork and move back near pot and yellow cloth", + "parquet": "data/chunk-026/episode_026872.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026872.mp4" + }, + { + "episode_id": 24844, + "source_index": 24844, + "raw_length": 31, + "instruction": "fold to cloth from left to right", + "canonical_instruction": "fold to cloth from left to right", + "parquet": "data/chunk-024/episode_024844.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024844.mp4" + }, + { + "episode_id": 12600, + "source_index": 12600, + "raw_length": 31, + "instruction": "move the blue spoon to the upper right side of the stove", + "canonical_instruction": "move the blue spoon to the upper right side of the stove", + "parquet": "data/chunk-012/episode_012600.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012600.mp4" + }, + { + "episode_id": 14872, + "source_index": 14872, + "raw_length": 34, + "instruction": "put spatula on plate sink", + "canonical_instruction": "put spatula on plate sink", + "parquet": "data/chunk-014/episode_014872.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014872.mp4" + }, + { + "episode_id": 49386, + "source_index": 49386, + "raw_length": 27, + "instruction": "Put the yellow corn on the top of the drawer", + "canonical_instruction": "put the yellow corn on the top of the drawer", + "parquet": "data/chunk-049/episode_049386.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049386.mp4" + }, + { + "episode_id": 36648, + "source_index": 36648, + "raw_length": 35, + "instruction": "move the green block in right table", + "canonical_instruction": "move the green block in right table", + "parquet": "data/chunk-036/episode_036648.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036648.mp4" + }, + { + "episode_id": 19054, + "source_index": 19054, + "raw_length": 31, + "instruction": "move the container to the left side", + "canonical_instruction": "move the container to the left side", + "parquet": "data/chunk-019/episode_019054.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019054.mp4" + }, + { + "episode_id": 19720, + "source_index": 19720, + "raw_length": 26, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-019/episode_019720.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019720.mp4" + }, + { + "episode_id": 41110, + "source_index": 41110, + "raw_length": 27, + "instruction": "fold the cloth from the left to the right", + "canonical_instruction": "fold the cloth from the left to the right", + "parquet": "data/chunk-041/episode_041110.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041110.mp4" + }, + { + "episode_id": 3996, + "source_index": 3996, + "raw_length": 19, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-003/episode_003996.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003996.mp4" + }, + { + "episode_id": 10261, + "source_index": 10261, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-010/episode_010261.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010261.mp4" + }, + { + "episode_id": 24817, + "source_index": 24817, + "raw_length": 33, + "instruction": "put spatula on plate sink", + "canonical_instruction": "put spatula on plate sink", + "parquet": "data/chunk-024/episode_024817.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024817.mp4" + }, + { + "episode_id": 18915, + "source_index": 18915, + "raw_length": 35, + "instruction": "remove the cheese from the cloth", + "canonical_instruction": "remove the cheese from the cloth", + "parquet": "data/chunk-018/episode_018915.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018915.mp4" + }, + { + "episode_id": 16273, + "source_index": 16273, + "raw_length": 39, + "instruction": "moved the yellow object to the right side of the table.", + "canonical_instruction": "moved the yellow object to the right side of the table", + "parquet": "data/chunk-016/episode_016273.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016273.mp4" + }, + { + "episode_id": 11448, + "source_index": 11448, + "raw_length": 21, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-011/episode_011448.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011448.mp4" + }, + { + "episode_id": 24982, + "source_index": 24982, + "raw_length": 33, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-024/episode_024982.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024982.mp4" + }, + { + "episode_id": 45789, + "source_index": 45789, + "raw_length": 36, + "instruction": "put sushi in pot cardboard fence", + "canonical_instruction": "put sushi in pot cardboard fence", + "parquet": "data/chunk-045/episode_045789.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045789.mp4" + }, + { + "episode_id": 5236, + "source_index": 5236, + "raw_length": 27, + "instruction": "put potato in pot cardboard fence", + "canonical_instruction": "put potato in pot cardboard fence", + "parquet": "data/chunk-005/episode_005236.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005236.mp4" + }, + { + "episode_id": 44222, + "source_index": 44222, + "raw_length": 41, + "instruction": "take a corn and put it on the pot", + "canonical_instruction": "take a corn and put it on the pot", + "parquet": "data/chunk-044/episode_044222.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044222.mp4" + }, + { + "episode_id": 41401, + "source_index": 41401, + "raw_length": 32, + "instruction": "take the red block and put it in the middle of the table", + "canonical_instruction": "take the red block and put it in the middle of the table", + "parquet": "data/chunk-041/episode_041401.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041401.mp4" + }, + { + "episode_id": 38792, + "source_index": 38792, + "raw_length": 31, + "instruction": "open cabinet", + "canonical_instruction": "open cabinet", + "parquet": "data/chunk-038/episode_038792.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038792.mp4" + }, + { + "episode_id": 38374, + "source_index": 38374, + "raw_length": 27, + "instruction": "move the silver pot to the left side of the stove", + "canonical_instruction": "move the silver pot to the left side of the stove", + "parquet": "data/chunk-038/episode_038374.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038374.mp4" + }, + { + "episode_id": 33386, + "source_index": 33386, + "raw_length": 37, + "instruction": "Place the mushroom on the front right corner of the table.", + "canonical_instruction": "place the mushroom on the front right corner of the table", + "parquet": "data/chunk-033/episode_033386.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033386.mp4" + }, + { + "episode_id": 4324, + "source_index": 4324, + "raw_length": 32, + "instruction": "take beet from pot sink", + "canonical_instruction": "take beet from pot sink", + "parquet": "data/chunk-004/episode_004324.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004324.mp4" + }, + { + "episode_id": 14642, + "source_index": 14642, + "raw_length": 38, + "instruction": "put the silver pot below the red fork", + "canonical_instruction": "put the silver pot below the red fork", + "parquet": "data/chunk-014/episode_014642.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014642.mp4" + }, + { + "episode_id": 30466, + "source_index": 30466, + "raw_length": 26, + "instruction": "take lid off pot or pan", + "canonical_instruction": "take lid off pot or pan", + "parquet": "data/chunk-030/episode_030466.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030466.mp4" + }, + { + "episode_id": 44414, + "source_index": 44414, + "raw_length": 24, + "instruction": "move the small object upward", + "canonical_instruction": "move the small object upward", + "parquet": "data/chunk-044/episode_044414.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044414.mp4" + }, + { + "episode_id": 13003, + "source_index": 13003, + "raw_length": 31, + "instruction": "Put the spoon to the right of the hotdog.", + "canonical_instruction": "put the spoon to the right of the hotdog", + "parquet": "data/chunk-013/episode_013003.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013003.mp4" + }, + { + "episode_id": 6873, + "source_index": 6873, + "raw_length": 32, + "instruction": "Move the capsicum on the green table cloth.", + "canonical_instruction": "move the capsicum on the green table cloth", + "parquet": "data/chunk-006/episode_006873.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006873.mp4" + }, + { + "episode_id": 18617, + "source_index": 18617, + "raw_length": 21, + "instruction": "wipe pot with sponge", + "canonical_instruction": "wipe pot with sponge", + "parquet": "data/chunk-018/episode_018617.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018617.mp4" + }, + { + "episode_id": 44951, + "source_index": 44951, + "raw_length": 25, + "instruction": "Pick the towel from corner and pace it on corner of the table", + "canonical_instruction": "pick the towel from corner and pace it on corner of the table", + "parquet": "data/chunk-044/episode_044951.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044951.mp4" + }, + { + "episode_id": 40469, + "source_index": 40469, + "raw_length": 43, + "instruction": "Place the vegetable on the front edge of the table", + "canonical_instruction": "place the vegetable on the front edge of the table", + "parquet": "data/chunk-040/episode_040469.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040469.mp4" + }, + { + "episode_id": 53047, + "source_index": 53047, + "raw_length": 19, + "instruction": "close small4fbox flaps", + "canonical_instruction": "close small4fbox flaps", + "parquet": "data/chunk-053/episode_053047.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053047.mp4" + }, + { + "episode_id": 4323, + "source_index": 4323, + "raw_length": 19, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-004/episode_004323.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004323.mp4" + }, + { + "episode_id": 39990, + "source_index": 39990, + "raw_length": 43, + "instruction": "move the spatula into the sink", + "canonical_instruction": "move the spatula into the sink", + "parquet": "data/chunk-039/episode_039990.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039990.mp4" + }, + { + "episode_id": 21034, + "source_index": 21034, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-021/episode_021034.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021034.mp4" + }, + { + "episode_id": 22011, + "source_index": 22011, + "raw_length": 28, + "instruction": "Place the pan to the left of the cheese.", + "canonical_instruction": "place the pan to the left of the cheese", + "parquet": "data/chunk-022/episode_022011.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022011.mp4" + }, + { + "episode_id": 53088, + "source_index": 53088, + "raw_length": 41, + "instruction": "Put the pepper in the pot.", + "canonical_instruction": "put the pepper in the pot", + "parquet": "data/chunk-053/episode_053088.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053088.mp4" + }, + { + "episode_id": 46365, + "source_index": 46365, + "raw_length": 36, + "instruction": "put lid on pot", + "canonical_instruction": "put lid on pot", + "parquet": "data/chunk-046/episode_046365.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046365.mp4" + }, + { + "episode_id": 34515, + "source_index": 34515, + "raw_length": 28, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-034/episode_034515.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034515.mp4" + }, + { + "episode_id": 3471, + "source_index": 3471, + "raw_length": 35, + "instruction": "move the silver pot to the bottom left side of the table", + "canonical_instruction": "move the silver pot to the bottom left side of the table", + "parquet": "data/chunk-003/episode_003471.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003471.mp4" + }, + { + "episode_id": 17630, + "source_index": 17630, + "raw_length": 19, + "instruction": "move blue cloth from bottom to the top of the table", + "canonical_instruction": "move blue cloth from bottom to the top of the table", + "parquet": "data/chunk-017/episode_017630.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017630.mp4" + }, + { + "episode_id": 17948, + "source_index": 17948, + "raw_length": 46, + "instruction": "move yellow cloth from right to left", + "canonical_instruction": "move yellow cloth from right to left", + "parquet": "data/chunk-017/episode_017948.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017948.mp4" + }, + { + "episode_id": 24681, + "source_index": 24681, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-024/episode_024681.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024681.mp4" + }, + { + "episode_id": 32987, + "source_index": 32987, + "raw_length": 46, + "instruction": "put the pawn on top of the cube with hole in the middle", + "canonical_instruction": "put the pawn on top of the cube with hole in the middle", + "parquet": "data/chunk-032/episode_032987.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032987.mp4" + }, + { + "episode_id": 50984, + "source_index": 50984, + "raw_length": 46, + "instruction": "Pick the red cylinder from the left side and place it in the middle of the table", + "canonical_instruction": "pick the red cylinder from the left side and place it in the middle of the table", + "parquet": "data/chunk-050/episode_050984.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050984.mp4" + }, + { + "episode_id": 12277, + "source_index": 12277, + "raw_length": 21, + "instruction": "put spoon into pan", + "canonical_instruction": "put spoon into pan", + "parquet": "data/chunk-012/episode_012277.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012277.mp4" + }, + { + "episode_id": 43239, + "source_index": 43239, + "raw_length": 31, + "instruction": "move the cloth to the bottom of the table", + "canonical_instruction": "move the cloth to the bottom of the table", + "parquet": "data/chunk-043/episode_043239.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043239.mp4" + }, + { + "episode_id": 23464, + "source_index": 23464, + "raw_length": 25, + "instruction": "open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-023/episode_023464.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023464.mp4" + }, + { + "episode_id": 42263, + "source_index": 42263, + "raw_length": 28, + "instruction": "Moved the silver pot to the right side of the stove", + "canonical_instruction": "moved the silver pot to the right side of the stove", + "parquet": "data/chunk-042/episode_042263.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042263.mp4" + }, + { + "episode_id": 39911, + "source_index": 39911, + "raw_length": 18, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-039/episode_039911.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039911.mp4" + }, + { + "episode_id": 778, + "source_index": 778, + "raw_length": 39, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-000/episode_000778.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000778.mp4" + }, + { + "episode_id": 13212, + "source_index": 13212, + "raw_length": 46, + "instruction": "Move the purple towel slightly towards the back of the table", + "canonical_instruction": "move the purple towel slightly towards the back of the table", + "parquet": "data/chunk-013/episode_013212.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013212.mp4" + }, + { + "episode_id": 49916, + "source_index": 49916, + "raw_length": 25, + "instruction": "Place the green cloth near the front right corner of the table.", + "canonical_instruction": "place the green cloth near the front right corner of the table", + "parquet": "data/chunk-049/episode_049916.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049916.mp4" + }, + { + "episode_id": 46224, + "source_index": 46224, + "raw_length": 25, + "instruction": "move the can to the bottom left corner of the table", + "canonical_instruction": "move the can to the bottom left corner of the table", + "parquet": "data/chunk-046/episode_046224.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046224.mp4" + }, + { + "episode_id": 17104, + "source_index": 17104, + "raw_length": 27, + "instruction": "put spoon in bowl sink", + "canonical_instruction": "put spoon in bowl sink", + "parquet": "data/chunk-017/episode_017104.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017104.mp4" + }, + { + "episode_id": 32048, + "source_index": 32048, + "raw_length": 27, + "instruction": "moving silver pot from right burner to left burner", + "canonical_instruction": "moving silver pot from right burner to left burner", + "parquet": "data/chunk-032/episode_032048.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032048.mp4" + }, + { + "episode_id": 10114, + "source_index": 10114, + "raw_length": 31, + "instruction": "removing the yellow with green lid stuff from the top to the bottom of the table", + "canonical_instruction": "removing the yellow with green lid stuff from the top to the bottom of the table", + "parquet": "data/chunk-010/episode_010114.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010114.mp4" + }, + { + "episode_id": 31758, + "source_index": 31758, + "raw_length": 33, + "instruction": "Put the spoon between the microwave and pot", + "canonical_instruction": "put the spoon between the microwave and pot", + "parquet": "data/chunk-031/episode_031758.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031758.mp4" + }, + { + "episode_id": 11848, + "source_index": 11848, + "raw_length": 43, + "instruction": "Move the pot to the corner of the table.", + "canonical_instruction": "move the pot to the corner of the table", + "parquet": "data/chunk-011/episode_011848.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011848.mp4" + }, + { + "episode_id": 25137, + "source_index": 25137, + "raw_length": 21, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-025/episode_025137.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025137.mp4" + }, + { + "episode_id": 36776, + "source_index": 36776, + "raw_length": 38, + "instruction": "MOVED the can to the center of the stove", + "canonical_instruction": "moved the can to the center of the stove", + "parquet": "data/chunk-036/episode_036776.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036776.mp4" + }, + { + "episode_id": 46076, + "source_index": 46076, + "raw_length": 46, + "instruction": "Move the spatula to the right of the sushi.", + "canonical_instruction": "move the spatula to the right of the sushi", + "parquet": "data/chunk-046/episode_046076.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046076.mp4" + }, + { + "episode_id": 45975, + "source_index": 45975, + "raw_length": 38, + "instruction": "move the silver lid to the left side of the stove", + "canonical_instruction": "move the silver lid to the left side of the stove", + "parquet": "data/chunk-045/episode_045975.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045975.mp4" + }, + { + "episode_id": 18679, + "source_index": 18679, + "raw_length": 36, + "instruction": "position the rectangular blocks on the left side of the table on top of each other", + "canonical_instruction": "position the rectangular blocks on the left side of the table on top of each other", + "parquet": "data/chunk-018/episode_018679.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018679.mp4" + }, + { + "episode_id": 2729, + "source_index": 2729, + "raw_length": 46, + "instruction": "Place the knife in front of the purple towel", + "canonical_instruction": "place the knife in front of the purple towel", + "parquet": "data/chunk-002/episode_002729.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002729.mp4" + }, + { + "episode_id": 45113, + "source_index": 45113, + "raw_length": 26, + "instruction": "Place the blue cloth next to the mushroom.", + "canonical_instruction": "place the blue cloth next to the mushroom", + "parquet": "data/chunk-045/episode_045113.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045113.mp4" + }, + { + "episode_id": 45164, + "source_index": 45164, + "raw_length": 38, + "instruction": "Move the blue laddle below the left burner", + "canonical_instruction": "move the blue laddle below the left burner", + "parquet": "data/chunk-045/episode_045164.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045164.mp4" + }, + { + "episode_id": 4633, + "source_index": 4633, + "raw_length": 36, + "instruction": "pick orange toy from vessel and keep it on the left side of the table", + "canonical_instruction": "pick orange toy from vessel and keep it on the left side of the table", + "parquet": "data/chunk-004/episode_004633.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004633.mp4" + }, + { + "episode_id": 2988, + "source_index": 2988, + "raw_length": 38, + "instruction": "move the can to the left side of the table", + "canonical_instruction": "move the can to the left side of the table", + "parquet": "data/chunk-002/episode_002988.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002988.mp4" + }, + { + "episode_id": 11134, + "source_index": 11134, + "raw_length": 42, + "instruction": "move the green cloth to the far edge of the table", + "canonical_instruction": "move the green cloth to the far edge of the table", + "parquet": "data/chunk-011/episode_011134.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011134.mp4" + }, + { + "episode_id": 36044, + "source_index": 36044, + "raw_length": 21, + "instruction": "moved the thing to the right", + "canonical_instruction": "moved the thing to the right", + "parquet": "data/chunk-036/episode_036044.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036044.mp4" + }, + { + "episode_id": 2462, + "source_index": 2462, + "raw_length": 32, + "instruction": "move the spatula place it at the edge of the corner", + "canonical_instruction": "move the spatula place it at the edge of the corner", + "parquet": "data/chunk-002/episode_002462.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002462.mp4" + }, + { + "episode_id": 21007, + "source_index": 21007, + "raw_length": 27, + "instruction": "move the yellow cloth to the rigth of the table", + "canonical_instruction": "move the yellow cloth to the rigth of the table", + "parquet": "data/chunk-021/episode_021007.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021007.mp4" + }, + { + "episode_id": 12630, + "source_index": 12630, + "raw_length": 31, + "instruction": "move the bishop to the right", + "canonical_instruction": "move the bishop to the right", + "parquet": "data/chunk-012/episode_012630.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012630.mp4" + }, + { + "episode_id": 12675, + "source_index": 12675, + "raw_length": 36, + "instruction": "move the silver pot to the left burner", + "canonical_instruction": "move the silver pot to the left burner", + "parquet": "data/chunk-012/episode_012675.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012675.mp4" + }, + { + "episode_id": 35772, + "source_index": 35772, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-035/episode_035772.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035772.mp4" + }, + { + "episode_id": 50265, + "source_index": 50265, + "raw_length": 40, + "instruction": "put the duck in the drawer", + "canonical_instruction": "put the duck in the drawer", + "parquet": "data/chunk-050/episode_050265.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050265.mp4" + }, + { + "episode_id": 10096, + "source_index": 10096, + "raw_length": 46, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-010/episode_010096.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010096.mp4" + }, + { + "episode_id": 48071, + "source_index": 48071, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-048/episode_048071.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048071.mp4" + }, + { + "episode_id": 44192, + "source_index": 44192, + "raw_length": 20, + "instruction": "put carrot in pot or pan", + "canonical_instruction": "put carrot in pot or pan", + "parquet": "data/chunk-044/episode_044192.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044192.mp4" + }, + { + "episode_id": 26465, + "source_index": 26465, + "raw_length": 52, + "instruction": "move the silver metallic bowl inside the sink", + "canonical_instruction": "move the silver metallic bowl inside the sink", + "parquet": "data/chunk-026/episode_026465.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026465.mp4" + }, + { + "episode_id": 30444, + "source_index": 30444, + "raw_length": 28, + "instruction": "move the green papper to the middle of the table", + "canonical_instruction": "move the green papper to the middle of the table", + "parquet": "data/chunk-030/episode_030444.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030444.mp4" + }, + { + "episode_id": 45076, + "source_index": 45076, + "raw_length": 36, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-045/episode_045076.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045076.mp4" + }, + { + "episode_id": 12046, + "source_index": 12046, + "raw_length": 32, + "instruction": "move the red and white object to the upper left side of the table", + "canonical_instruction": "move the red and white object to the upper left side of the table", + "parquet": "data/chunk-012/episode_012046.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012046.mp4" + }, + { + "episode_id": 25400, + "source_index": 25400, + "raw_length": 36, + "instruction": "Remove the white block on top and place it on the right side near the yelow block", + "canonical_instruction": "remove the white block on top and place it on the right side near the yelow block", + "parquet": "data/chunk-025/episode_025400.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025400.mp4" + }, + { + "episode_id": 38211, + "source_index": 38211, + "raw_length": 26, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-038/episode_038211.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038211.mp4" + }, + { + "episode_id": 40718, + "source_index": 40718, + "raw_length": 29, + "instruction": "Slide orange cloth down, to bottom edge of table.", + "canonical_instruction": "slide orange cloth down, to bottom edge of table", + "parquet": "data/chunk-040/episode_040718.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040718.mp4" + }, + { + "episode_id": 50673, + "source_index": 50673, + "raw_length": 34, + "instruction": "take beet from pot sink", + "canonical_instruction": "take beet from pot sink", + "parquet": "data/chunk-050/episode_050673.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050673.mp4" + }, + { + "episode_id": 21367, + "source_index": 21367, + "raw_length": 34, + "instruction": "move the pan from the top left of the burner to the bottom left of the burner", + "canonical_instruction": "move the pan from the top left of the burner to the bottom left of the burner", + "parquet": "data/chunk-021/episode_021367.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021367.mp4" + }, + { + "episode_id": 801, + "source_index": 801, + "raw_length": 31, + "instruction": "Put the brush on the cloth.", + "canonical_instruction": "put the brush on the cloth", + "parquet": "data/chunk-000/episode_000801.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000801.mp4" + }, + { + "episode_id": 44472, + "source_index": 44472, + "raw_length": 25, + "instruction": "moved the yellow brush and put it on the right side of the burner", + "canonical_instruction": "moved the yellow brush and put it on the right side of the burner", + "parquet": "data/chunk-044/episode_044472.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044472.mp4" + }, + { + "episode_id": 4141, + "source_index": 4141, + "raw_length": 34, + "instruction": "move silver pot from right side to left side", + "canonical_instruction": "move silver pot from right side to left side", + "parquet": "data/chunk-004/episode_004141.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004141.mp4" + }, + { + "episode_id": 14406, + "source_index": 14406, + "raw_length": 33, + "instruction": "Move the orange napkin to the back corner of the table.", + "canonical_instruction": "move the orange napkin to the back corner of the table", + "parquet": "data/chunk-014/episode_014406.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014406.mp4" + }, + { + "episode_id": 43578, + "source_index": 43578, + "raw_length": 28, + "instruction": "move the silver pot to the bottom left of the stove", + "canonical_instruction": "move the silver pot to the bottom left of the stove", + "parquet": "data/chunk-043/episode_043578.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043578.mp4" + }, + { + "episode_id": 38658, + "source_index": 38658, + "raw_length": 20, + "instruction": "put corn in pot which is in sink", + "canonical_instruction": "put corn in pot which is in sink", + "parquet": "data/chunk-038/episode_038658.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038658.mp4" + }, + { + "episode_id": 29801, + "source_index": 29801, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-029/episode_029801.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029801.mp4" + }, + { + "episode_id": 33720, + "source_index": 33720, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-033/episode_033720.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033720.mp4" + }, + { + "episode_id": 24572, + "source_index": 24572, + "raw_length": 33, + "instruction": "move pan behind and slightly left of towel", + "canonical_instruction": "move pan behind and slightly left of towel", + "parquet": "data/chunk-024/episode_024572.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024572.mp4" + }, + { + "episode_id": 11383, + "source_index": 11383, + "raw_length": 76, + "instruction": "put pickle in pot or pan an put pot or pan on stove", + "canonical_instruction": "put pickle in pot or pan an put pot or pan on stove", + "parquet": "data/chunk-011/episode_011383.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011383.mp4" + }, + { + "episode_id": 10725, + "source_index": 10725, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-010/episode_010725.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010725.mp4" + }, + { + "episode_id": 51840, + "source_index": 51840, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-051/episode_051840.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051840.mp4" + }, + { + "episode_id": 24968, + "source_index": 24968, + "raw_length": 36, + "instruction": "move the yellow thing to the right side of the stove", + "canonical_instruction": "move the yellow thing to the right side of the stove", + "parquet": "data/chunk-024/episode_024968.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024968.mp4" + }, + { + "episode_id": 33436, + "source_index": 33436, + "raw_length": 46, + "instruction": "Place the spatula on the far left edge of the table", + "canonical_instruction": "place the spatula on the far left edge of the table", + "parquet": "data/chunk-033/episode_033436.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033436.mp4" + }, + { + "episode_id": 37414, + "source_index": 37414, + "raw_length": 45, + "instruction": "fold the cloth on the right side", + "canonical_instruction": "fold the cloth on the right side", + "parquet": "data/chunk-037/episode_037414.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037414.mp4" + }, + { + "episode_id": 18623, + "source_index": 18623, + "raw_length": 25, + "instruction": "put banana on plate", + "canonical_instruction": "put banana on plate", + "parquet": "data/chunk-018/episode_018623.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018623.mp4" + }, + { + "episode_id": 23297, + "source_index": 23297, + "raw_length": 27, + "instruction": "put beet in pot sink", + "canonical_instruction": "put beet in pot sink", + "parquet": "data/chunk-023/episode_023297.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023297.mp4" + }, + { + "episode_id": 26246, + "source_index": 26246, + "raw_length": 23, + "instruction": "move the silver lid above silver pot", + "canonical_instruction": "move the silver lid above silver pot", + "parquet": "data/chunk-026/episode_026246.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026246.mp4" + }, + { + "episode_id": 39984, + "source_index": 39984, + "raw_length": 34, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-039/episode_039984.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039984.mp4" + }, + { + "episode_id": 45487, + "source_index": 45487, + "raw_length": 21, + "instruction": "put spoon into pan", + "canonical_instruction": "put spoon into pan", + "parquet": "data/chunk-045/episode_045487.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045487.mp4" + }, + { + "episode_id": 18911, + "source_index": 18911, + "raw_length": 26, + "instruction": "move red item from lower left burner to the middle of all four burners", + "canonical_instruction": "move red item from lower left burner to the middle of all four burners", + "parquet": "data/chunk-018/episode_018911.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018911.mp4" + }, + { + "episode_id": 31739, + "source_index": 31739, + "raw_length": 26, + "instruction": "take the thing out of the silver pot and put it on the left side of the table", + "canonical_instruction": "take the thing out of the silver pot and put it on the left side of the table", + "parquet": "data/chunk-031/episode_031739.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031739.mp4" + }, + { + "episode_id": 9915, + "source_index": 9915, + "raw_length": 43, + "instruction": "put the yellow figure on the bottom right edge of the cloth", + "canonical_instruction": "put the yellow figure on the bottom right edge of the cloth", + "parquet": "data/chunk-009/episode_009915.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009915.mp4" + }, + { + "episode_id": 50069, + "source_index": 50069, + "raw_length": 23, + "instruction": "move the orange thing to the right side of the blue cloth", + "canonical_instruction": "move the orange thing to the right side of the blue cloth", + "parquet": "data/chunk-050/episode_050069.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050069.mp4" + }, + { + "episode_id": 31900, + "source_index": 31900, + "raw_length": 29, + "instruction": "take the object from the left burner", + "canonical_instruction": "take the object from the left burner", + "parquet": "data/chunk-031/episode_031900.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031900.mp4" + }, + { + "episode_id": 431, + "source_index": 431, + "raw_length": 36, + "instruction": "Move the fork towards left side of counter.", + "canonical_instruction": "move the fork towards left side of counter", + "parquet": "data/chunk-000/episode_000431.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000431.mp4" + }, + { + "episode_id": 21765, + "source_index": 21765, + "raw_length": 43, + "instruction": "Place the mushroom on the orange cloth.", + "canonical_instruction": "place the mushroom on the orange cloth", + "parquet": "data/chunk-021/episode_021765.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021765.mp4" + }, + { + "episode_id": 277, + "source_index": 277, + "raw_length": 32, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-000/episode_000277.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000277.mp4" + }, + { + "episode_id": 3774, + "source_index": 3774, + "raw_length": 41, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-003/episode_003774.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003774.mp4" + }, + { + "episode_id": 29544, + "source_index": 29544, + "raw_length": 39, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-029/episode_029544.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029544.mp4" + }, + { + "episode_id": 28750, + "source_index": 28750, + "raw_length": 17, + "instruction": "put cup into pot or pan", + "canonical_instruction": "put cup into pot or pan", + "parquet": "data/chunk-028/episode_028750.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028750.mp4" + }, + { + "episode_id": 14661, + "source_index": 14661, + "raw_length": 21, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-014/episode_014661.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014661.mp4" + }, + { + "episode_id": 17525, + "source_index": 17525, + "raw_length": 46, + "instruction": "put the maroon cylinder on top of the yellow cube", + "canonical_instruction": "put the maroon cylinder on top of the yellow cube", + "parquet": "data/chunk-017/episode_017525.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017525.mp4" + }, + { + "episode_id": 46919, + "source_index": 46919, + "raw_length": 91, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-046/episode_046919.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046919.mp4" + }, + { + "episode_id": 15932, + "source_index": 15932, + "raw_length": 29, + "instruction": "put the red object on top of the drawer", + "canonical_instruction": "put the red object on top of the drawer", + "parquet": "data/chunk-015/episode_015932.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015932.mp4" + }, + { + "episode_id": 49866, + "source_index": 49866, + "raw_length": 29, + "instruction": "Put the croissant on the cloth.", + "canonical_instruction": "put the croissant on the cloth", + "parquet": "data/chunk-049/episode_049866.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049866.mp4" + }, + { + "episode_id": 8724, + "source_index": 8724, + "raw_length": 31, + "instruction": "move the figure from the square block with hole to the table", + "canonical_instruction": "move the figure from the square block with hole to the table", + "parquet": "data/chunk-008/episode_008724.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008724.mp4" + }, + { + "episode_id": 46596, + "source_index": 46596, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-046/episode_046596.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046596.mp4" + }, + { + "episode_id": 27777, + "source_index": 27777, + "raw_length": 39, + "instruction": "unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-027/episode_027777.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027777.mp4" + }, + { + "episode_id": 49140, + "source_index": 49140, + "raw_length": 21, + "instruction": "put pot or pan from sink into drying rack", + "canonical_instruction": "put pot or pan from sink into drying rack", + "parquet": "data/chunk-049/episode_049140.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049140.mp4" + }, + { + "episode_id": 24540, + "source_index": 24540, + "raw_length": 37, + "instruction": "Move the can behind the fork, near the back edge of the table.", + "canonical_instruction": "move the can behind the fork, near the back edge of the table", + "parquet": "data/chunk-024/episode_024540.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024540.mp4" + }, + { + "episode_id": 40883, + "source_index": 40883, + "raw_length": 34, + "instruction": "put the blue brush on top of the yellow cloth", + "canonical_instruction": "put the blue brush on top of the yellow cloth", + "parquet": "data/chunk-040/episode_040883.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040883.mp4" + }, + { + "episode_id": 37468, + "source_index": 37468, + "raw_length": 34, + "instruction": "take carrot out of pot cardboard fence", + "canonical_instruction": "take carrot out of pot cardboard fence", + "parquet": "data/chunk-037/episode_037468.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037468.mp4" + }, + { + "episode_id": 33530, + "source_index": 33530, + "raw_length": 25, + "instruction": "move the green cloth to the top of the right burner", + "canonical_instruction": "move the green cloth to the top of the right burner", + "parquet": "data/chunk-033/episode_033530.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033530.mp4" + }, + { + "episode_id": 19107, + "source_index": 19107, + "raw_length": 36, + "instruction": "move the green spatula to the left side of the left burner", + "canonical_instruction": "move the green spatula to the left side of the left burner", + "parquet": "data/chunk-019/episode_019107.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019107.mp4" + }, + { + "episode_id": 16633, + "source_index": 16633, + "raw_length": 46, + "instruction": "put the red arch on top of the yellow block", + "canonical_instruction": "put the red arch on top of the yellow block", + "parquet": "data/chunk-016/episode_016633.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016633.mp4" + }, + { + "episode_id": 12074, + "source_index": 12074, + "raw_length": 54, + "instruction": "move the white knife with yellow handle from the silver pot to the orange plastic pot below it", + "canonical_instruction": "move the white knife with yellow handle from the silver pot to the orange plastic pot below it", + "parquet": "data/chunk-012/episode_012074.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012074.mp4" + }, + { + "episode_id": 4189, + "source_index": 4189, + "raw_length": 20, + "instruction": "move the blue toy to the right side of the table", + "canonical_instruction": "move the blue toy to the right side of the table", + "parquet": "data/chunk-004/episode_004189.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004189.mp4" + }, + { + "episode_id": 1337, + "source_index": 1337, + "raw_length": 28, + "instruction": "move the white object to the left side of the table", + "canonical_instruction": "move the white object to the left side of the table", + "parquet": "data/chunk-001/episode_001337.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001337.mp4" + }, + { + "episode_id": 43666, + "source_index": 43666, + "raw_length": 18, + "instruction": "flip orange pot upright in sink", + "canonical_instruction": "flip orange pot upright in sink", + "parquet": "data/chunk-043/episode_043666.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043666.mp4" + }, + { + "episode_id": 16888, + "source_index": 16888, + "raw_length": 40, + "instruction": "move the silver pot to the upper right of table", + "canonical_instruction": "move the silver pot to the upper right of table", + "parquet": "data/chunk-016/episode_016888.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016888.mp4" + }, + { + "episode_id": 53005, + "source_index": 53005, + "raw_length": 24, + "instruction": "Unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-053/episode_053005.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053005.mp4" + }, + { + "episode_id": 45989, + "source_index": 45989, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-045/episode_045989.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045989.mp4" + }, + { + "episode_id": 20704, + "source_index": 20704, + "raw_length": 38, + "instruction": "pick up the blue spoon and move it in front of the microwave", + "canonical_instruction": "pick up the blue spoon and move it in front of the microwave", + "parquet": "data/chunk-020/episode_020704.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020704.mp4" + }, + { + "episode_id": 14664, + "source_index": 14664, + "raw_length": 28, + "instruction": "TAKE THE LID FROM THE POT AND PLACE IT ON THE LOWER LEFT HOB", + "canonical_instruction": "take the lid from the pot and place it on the lower left hob", + "parquet": "data/chunk-014/episode_014664.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014664.mp4" + }, + { + "episode_id": 30225, + "source_index": 30225, + "raw_length": 39, + "instruction": "take the cube with a hole and put it on top of the blue rectangle", + "canonical_instruction": "take the cube with a hole and put it on top of the blue rectangle", + "parquet": "data/chunk-030/episode_030225.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030225.mp4" + }, + { + "episode_id": 131, + "source_index": 131, + "raw_length": 39, + "instruction": "Pick up the green bell pepper and place it on the blue cloth", + "canonical_instruction": "pick up the green bell pepper and place it on the blue cloth", + "parquet": "data/chunk-000/episode_000131.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000131.mp4" + }, + { + "episode_id": 17182, + "source_index": 17182, + "raw_length": 25, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-017/episode_017182.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017182.mp4" + }, + { + "episode_id": 39532, + "source_index": 39532, + "raw_length": 27, + "instruction": "move the green cloth between something blue and yellow", + "canonical_instruction": "move the green cloth between something blue and yellow", + "parquet": "data/chunk-039/episode_039532.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039532.mp4" + }, + { + "episode_id": 20493, + "source_index": 20493, + "raw_length": 36, + "instruction": "put broccoli in pot", + "canonical_instruction": "put broccoli in pot", + "parquet": "data/chunk-020/episode_020493.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020493.mp4" + }, + { + "episode_id": 44569, + "source_index": 44569, + "raw_length": 36, + "instruction": "moved the metal pot to the bottom right burner", + "canonical_instruction": "moved the metal pot to the bottom right burner", + "parquet": "data/chunk-044/episode_044569.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044569.mp4" + }, + { + "episode_id": 51710, + "source_index": 51710, + "raw_length": 36, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-051/episode_051710.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051710.mp4" + }, + { + "episode_id": 32792, + "source_index": 32792, + "raw_length": 26, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-032/episode_032792.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032792.mp4" + }, + { + "episode_id": 12049, + "source_index": 12049, + "raw_length": 41, + "instruction": "moved the blue fork to the right corner", + "canonical_instruction": "moved the blue fork to the right corner", + "parquet": "data/chunk-012/episode_012049.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012049.mp4" + }, + { + "episode_id": 46784, + "source_index": 46784, + "raw_length": 22, + "instruction": "unfold the from left to right", + "canonical_instruction": "unfold the from left to right", + "parquet": "data/chunk-046/episode_046784.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046784.mp4" + }, + { + "episode_id": 1286, + "source_index": 1286, + "raw_length": 34, + "instruction": "Place the spoon behind the vessel.", + "canonical_instruction": "place the spoon behind the vessel", + "parquet": "data/chunk-001/episode_001286.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001286.mp4" + }, + { + "episode_id": 3435, + "source_index": 3435, + "raw_length": 33, + "instruction": "unfolds the cloth from left to right", + "canonical_instruction": "unfolds the cloth from left to right", + "parquet": "data/chunk-003/episode_003435.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003435.mp4" + }, + { + "episode_id": 22675, + "source_index": 22675, + "raw_length": 78, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-022/episode_022675.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022675.mp4" + }, + { + "episode_id": 21696, + "source_index": 21696, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-021/episode_021696.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021696.mp4" + }, + { + "episode_id": 34058, + "source_index": 34058, + "raw_length": 27, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-034/episode_034058.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034058.mp4" + }, + { + "episode_id": 34357, + "source_index": 34357, + "raw_length": 34, + "instruction": "Move the silver pot away from the yellow knife.", + "canonical_instruction": "move the silver pot away from the yellow knife", + "parquet": "data/chunk-034/episode_034357.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034357.mp4" + }, + { + "episode_id": 9291, + "source_index": 9291, + "raw_length": 36, + "instruction": "put carrot on plate", + "canonical_instruction": "put carrot on plate", + "parquet": "data/chunk-009/episode_009291.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009291.mp4" + }, + { + "episode_id": 51602, + "source_index": 51602, + "raw_length": 29, + "instruction": "move the red object from the white cloth to the bottom right of the cloth", + "canonical_instruction": "move the red object from the white cloth to the bottom right of the cloth", + "parquet": "data/chunk-051/episode_051602.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051602.mp4" + }, + { + "episode_id": 17465, + "source_index": 17465, + "raw_length": 70, + "instruction": "put sweetpotato on plate and stuffedelephant in pot or pan on stove", + "canonical_instruction": "put sweetpotato on plate and stuffedelephant in pot or pan on stove", + "parquet": "data/chunk-017/episode_017465.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017465.mp4" + }, + { + "episode_id": 7627, + "source_index": 7627, + "raw_length": 28, + "instruction": "move the purple cloth on the left burner", + "canonical_instruction": "move the purple cloth on the left burner", + "parquet": "data/chunk-007/episode_007627.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007627.mp4" + }, + { + "episode_id": 51681, + "source_index": 51681, + "raw_length": 33, + "instruction": "move the green cloth to the lower bottom side of the right burner", + "canonical_instruction": "move the green cloth to the lower bottom side of the right burner", + "parquet": "data/chunk-051/episode_051681.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051681.mp4" + }, + { + "episode_id": 47812, + "source_index": 47812, + "raw_length": 41, + "instruction": "move strainer from top left of the table to the top right of the table", + "canonical_instruction": "move strainer from top left of the table to the top right of the table", + "parquet": "data/chunk-047/episode_047812.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047812.mp4" + }, + { + "episode_id": 19690, + "source_index": 19690, + "raw_length": 45, + "instruction": "Move the bowl over to the right side of the counter.", + "canonical_instruction": "move the bowl over to the right side of the counter", + "parquet": "data/chunk-019/episode_019690.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019690.mp4" + }, + { + "episode_id": 9790, + "source_index": 9790, + "raw_length": 20, + "instruction": "pick up bit holder", + "canonical_instruction": "pick up bit holder", + "parquet": "data/chunk-009/episode_009790.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009790.mp4" + }, + { + "episode_id": 51569, + "source_index": 51569, + "raw_length": 25, + "instruction": "move the green cloth next to the white basket", + "canonical_instruction": "move the green cloth next to the white basket", + "parquet": "data/chunk-051/episode_051569.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051569.mp4" + }, + { + "episode_id": 2503, + "source_index": 2503, + "raw_length": 24, + "instruction": "upright basil bottle cardboard fence", + "canonical_instruction": "upright basil bottle cardboard fence", + "parquet": "data/chunk-002/episode_002503.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002503.mp4" + }, + { + "episode_id": 3433, + "source_index": 3433, + "raw_length": 39, + "instruction": "takes the silver pot and places it on the lower right burner", + "canonical_instruction": "takes the silver pot and places it on the lower right burner", + "parquet": "data/chunk-003/episode_003433.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003433.mp4" + }, + { + "episode_id": 21805, + "source_index": 21805, + "raw_length": 19, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-021/episode_021805.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021805.mp4" + }, + { + "episode_id": 11042, + "source_index": 11042, + "raw_length": 17, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-011/episode_011042.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011042.mp4" + }, + { + "episode_id": 39579, + "source_index": 39579, + "raw_length": 35, + "instruction": "remove the can on the table", + "canonical_instruction": "remove the can on the table", + "parquet": "data/chunk-039/episode_039579.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039579.mp4" + }, + { + "episode_id": 48628, + "source_index": 48628, + "raw_length": 26, + "instruction": "put can in pot", + "canonical_instruction": "put can in pot", + "parquet": "data/chunk-048/episode_048628.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048628.mp4" + }, + { + "episode_id": 37177, + "source_index": 37177, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-037/episode_037177.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037177.mp4" + }, + { + "episode_id": 30881, + "source_index": 30881, + "raw_length": 29, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-030/episode_030881.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030881.mp4" + }, + { + "episode_id": 45142, + "source_index": 45142, + "raw_length": 36, + "instruction": "take broccoli out of pan", + "canonical_instruction": "take broccoli out of pan", + "parquet": "data/chunk-045/episode_045142.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045142.mp4" + }, + { + "episode_id": 7630, + "source_index": 7630, + "raw_length": 32, + "instruction": "take the thing out of the drawer and put it on the left side of the table", + "canonical_instruction": "take the thing out of the drawer and put it on the left side of the table", + "parquet": "data/chunk-007/episode_007630.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007630.mp4" + }, + { + "episode_id": 19465, + "source_index": 19465, + "raw_length": 26, + "instruction": "put fork from basket to tray", + "canonical_instruction": "put fork from basket to tray", + "parquet": "data/chunk-019/episode_019465.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019465.mp4" + }, + { + "episode_id": 50103, + "source_index": 50103, + "raw_length": 35, + "instruction": "Put silver lid at the top of the silver pot", + "canonical_instruction": "put silver lid at the top of the silver pot", + "parquet": "data/chunk-050/episode_050103.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050103.mp4" + }, + { + "episode_id": 49895, + "source_index": 49895, + "raw_length": 28, + "instruction": "Move pot to front center of table.", + "canonical_instruction": "move pot to front center of table", + "parquet": "data/chunk-049/episode_049895.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049895.mp4" + }, + { + "episode_id": 41594, + "source_index": 41594, + "raw_length": 17, + "instruction": "put sweet potato in pot which is in sink", + "canonical_instruction": "put sweet potato in pot which is in sink", + "parquet": "data/chunk-041/episode_041594.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041594.mp4" + }, + { + "episode_id": 45103, + "source_index": 45103, + "raw_length": 44, + "instruction": "pick up green spatula and place on left side of bowl", + "canonical_instruction": "pick up green spatula and place on left side of bowl", + "parquet": "data/chunk-045/episode_045103.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045103.mp4" + }, + { + "episode_id": 46952, + "source_index": 46952, + "raw_length": 32, + "instruction": "fold the cloth from the left to the right", + "canonical_instruction": "fold the cloth from the left to the right", + "parquet": "data/chunk-046/episode_046952.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046952.mp4" + }, + { + "episode_id": 38723, + "source_index": 38723, + "raw_length": 21, + "instruction": "pick up bowl and put in small4fbox", + "canonical_instruction": "pick up bowl and put in small4fbox", + "parquet": "data/chunk-038/episode_038723.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038723.mp4" + }, + { + "episode_id": 47600, + "source_index": 47600, + "raw_length": 41, + "instruction": "Put the silver pot directly in front of the microwave.", + "canonical_instruction": "put the silver pot directly in front of the microwave", + "parquet": "data/chunk-047/episode_047600.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047600.mp4" + }, + { + "episode_id": 47685, + "source_index": 47685, + "raw_length": 27, + "instruction": "move silver bowl to above orange towel", + "canonical_instruction": "move silver bowl to above orange towel", + "parquet": "data/chunk-047/episode_047685.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047685.mp4" + }, + { + "episode_id": 45822, + "source_index": 45822, + "raw_length": 88, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-045/episode_045822.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045822.mp4" + }, + { + "episode_id": 449, + "source_index": 449, + "raw_length": 21, + "instruction": "move drying rack out of sink", + "canonical_instruction": "move drying rack out of sink", + "parquet": "data/chunk-000/episode_000449.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000449.mp4" + }, + { + "episode_id": 49770, + "source_index": 49770, + "raw_length": 18, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-049/episode_049770.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049770.mp4" + }, + { + "episode_id": 31695, + "source_index": 31695, + "raw_length": 44, + "instruction": "Pick up the potato and place it on the yellow cloth", + "canonical_instruction": "pick up the potato and place it on the yellow cloth", + "parquet": "data/chunk-031/episode_031695.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031695.mp4" + }, + { + "episode_id": 24355, + "source_index": 24355, + "raw_length": 46, + "instruction": "put the yellow knife in the brown pot", + "canonical_instruction": "put the yellow knife in the brown pot", + "parquet": "data/chunk-024/episode_024355.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024355.mp4" + }, + { + "episode_id": 17790, + "source_index": 17790, + "raw_length": 29, + "instruction": "put the red thing outside of the cloth to the top right", + "canonical_instruction": "put the red thing outside of the cloth to the top right", + "parquet": "data/chunk-017/episode_017790.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017790.mp4" + }, + { + "episode_id": 32947, + "source_index": 32947, + "raw_length": 38, + "instruction": "move the arch to the right side of the table", + "canonical_instruction": "move the arch to the right side of the table", + "parquet": "data/chunk-032/episode_032947.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032947.mp4" + }, + { + "episode_id": 41300, + "source_index": 41300, + "raw_length": 68, + "instruction": "lift and drop the red cutlery and white napkin", + "canonical_instruction": "lift and drop the red cutlery and white napkin", + "parquet": "data/chunk-041/episode_041300.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041300.mp4" + }, + { + "episode_id": 23780, + "source_index": 23780, + "raw_length": 36, + "instruction": "remove the blue cloth from the basket and put it in the washer", + "canonical_instruction": "remove the blue cloth from the basket and put it in the washer", + "parquet": "data/chunk-023/episode_023780.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023780.mp4" + }, + { + "episode_id": 9550, + "source_index": 9550, + "raw_length": 36, + "instruction": "put spatula on cutting board", + "canonical_instruction": "put spatula on cutting board", + "parquet": "data/chunk-009/episode_009550.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009550.mp4" + }, + { + "episode_id": 40646, + "source_index": 40646, + "raw_length": 40, + "instruction": "unfolded the cloth from top right to bottom left", + "canonical_instruction": "unfolded the cloth from top right to bottom left", + "parquet": "data/chunk-040/episode_040646.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040646.mp4" + }, + { + "episode_id": 24607, + "source_index": 24607, + "raw_length": 54, + "instruction": "moved down the silver pot into the left side of wooden spoon", + "canonical_instruction": "moved down the silver pot into the left side of wooden spoon", + "parquet": "data/chunk-024/episode_024607.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024607.mp4" + }, + { + "episode_id": 48472, + "source_index": 48472, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-048/episode_048472.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048472.mp4" + }, + { + "episode_id": 22873, + "source_index": 22873, + "raw_length": 24, + "instruction": "place the blue ladle on top of the blue cloth", + "canonical_instruction": "place the blue ladle on top of the blue cloth", + "parquet": "data/chunk-022/episode_022873.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022873.mp4" + }, + { + "episode_id": 35824, + "source_index": 35824, + "raw_length": 21, + "instruction": "put strawberry in pot", + "canonical_instruction": "put strawberry in pot", + "parquet": "data/chunk-035/episode_035824.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035824.mp4" + }, + { + "episode_id": 52116, + "source_index": 52116, + "raw_length": 46, + "instruction": "pick up the block and place it on top of a white block", + "canonical_instruction": "pick up the block and place it on top of a white block", + "parquet": "data/chunk-052/episode_052116.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052116.mp4" + }, + { + "episode_id": 12984, + "source_index": 12984, + "raw_length": 34, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-012/episode_012984.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012984.mp4" + }, + { + "episode_id": 30381, + "source_index": 30381, + "raw_length": 29, + "instruction": "Put the spoon on top of the purple towel.", + "canonical_instruction": "put the spoon on top of the purple towel", + "parquet": "data/chunk-030/episode_030381.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030381.mp4" + }, + { + "episode_id": 47213, + "source_index": 47213, + "raw_length": 21, + "instruction": "put pan from drying rack into sink", + "canonical_instruction": "put pan from drying rack into sink", + "parquet": "data/chunk-047/episode_047213.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047213.mp4" + }, + { + "episode_id": 9317, + "source_index": 9317, + "raw_length": 30, + "instruction": "take the arch off of the other arch and put it on the table", + "canonical_instruction": "take the arch off of the other arch and put it on the table", + "parquet": "data/chunk-009/episode_009317.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009317.mp4" + }, + { + "episode_id": 18048, + "source_index": 18048, + "raw_length": 54, + "instruction": "put stuffedpig in pan", + "canonical_instruction": "put stuffedpig in pan", + "parquet": "data/chunk-018/episode_018048.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018048.mp4" + }, + { + "episode_id": 28205, + "source_index": 28205, + "raw_length": 34, + "instruction": "Move the can to the back left corner of the table", + "canonical_instruction": "move the can to the back left corner of the table", + "parquet": "data/chunk-028/episode_028205.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028205.mp4" + }, + { + "episode_id": 1132, + "source_index": 1132, + "raw_length": 49, + "instruction": "moved the fruit out of the silver pot into a bucket", + "canonical_instruction": "moved the fruit out of the silver pot into a bucket", + "parquet": "data/chunk-001/episode_001132.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001132.mp4" + }, + { + "episode_id": 15782, + "source_index": 15782, + "raw_length": 45, + "instruction": "fold and put the cloth on the left burner", + "canonical_instruction": "fold and put the cloth on the left burner", + "parquet": "data/chunk-015/episode_015782.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015782.mp4" + }, + { + "episode_id": 20039, + "source_index": 20039, + "raw_length": 46, + "instruction": "Moves the yellow toy to the bottom right of the table.", + "canonical_instruction": "moves the yellow toy to the bottom right of the table", + "parquet": "data/chunk-020/episode_020039.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020039.mp4" + }, + { + "episode_id": 22683, + "source_index": 22683, + "raw_length": 21, + "instruction": "turn faucet left", + "canonical_instruction": "turn faucet left", + "parquet": "data/chunk-022/episode_022683.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022683.mp4" + }, + { + "episode_id": 28599, + "source_index": 28599, + "raw_length": 23, + "instruction": "place a corn on the table", + "canonical_instruction": "place a corn on the table", + "parquet": "data/chunk-028/episode_028599.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028599.mp4" + }, + { + "episode_id": 37579, + "source_index": 37579, + "raw_length": 38, + "instruction": "Put the pepper inside the pan.", + "canonical_instruction": "put the pepper inside the pan", + "parquet": "data/chunk-037/episode_037579.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037579.mp4" + }, + { + "episode_id": 14346, + "source_index": 14346, + "raw_length": 21, + "instruction": "put potato on plate", + "canonical_instruction": "put potato on plate", + "parquet": "data/chunk-014/episode_014346.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014346.mp4" + }, + { + "episode_id": 43968, + "source_index": 43968, + "raw_length": 46, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-043/episode_043968.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043968.mp4" + }, + { + "episode_id": 47198, + "source_index": 47198, + "raw_length": 46, + "instruction": "put the bottle in the drawer", + "canonical_instruction": "put the bottle in the drawer", + "parquet": "data/chunk-047/episode_047198.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047198.mp4" + }, + { + "episode_id": 46758, + "source_index": 46758, + "raw_length": 45, + "instruction": "take the salmon sushi and put it on the middle bottom side of table", + "canonical_instruction": "take the salmon sushi and put it on the middle bottom side of table", + "parquet": "data/chunk-046/episode_046758.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046758.mp4" + }, + { + "episode_id": 34614, + "source_index": 34614, + "raw_length": 37, + "instruction": "move the brown toy to the lower right burner", + "canonical_instruction": "move the brown toy to the lower right burner", + "parquet": "data/chunk-034/episode_034614.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034614.mp4" + }, + { + "episode_id": 51534, + "source_index": 51534, + "raw_length": 20, + "instruction": "put corn in pot which is in sink", + "canonical_instruction": "put corn in pot which is in sink", + "parquet": "data/chunk-051/episode_051534.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051534.mp4" + }, + { + "episode_id": 47598, + "source_index": 47598, + "raw_length": 26, + "instruction": "Move the orange cloth to the table's left edge.", + "canonical_instruction": "move the orange cloth to the table's left edge", + "parquet": "data/chunk-047/episode_047598.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047598.mp4" + }, + { + "episode_id": 22572, + "source_index": 22572, + "raw_length": 29, + "instruction": "moved the purple cloth to the top left side of the table", + "canonical_instruction": "moved the purple cloth to the top left side of the table", + "parquet": "data/chunk-022/episode_022572.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022572.mp4" + }, + { + "episode_id": 17217, + "source_index": 17217, + "raw_length": 35, + "instruction": "Move the yellow brush on the table from left to right", + "canonical_instruction": "move the yellow brush on the table from left to right", + "parquet": "data/chunk-017/episode_017217.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017217.mp4" + }, + { + "episode_id": 1458, + "source_index": 1458, + "raw_length": 31, + "instruction": "upright basil bottle cardboard fence", + "canonical_instruction": "upright basil bottle cardboard fence", + "parquet": "data/chunk-001/episode_001458.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001458.mp4" + }, + { + "episode_id": 20092, + "source_index": 20092, + "raw_length": 43, + "instruction": "Place pot on top of orange towel", + "canonical_instruction": "place pot on top of orange towel", + "parquet": "data/chunk-020/episode_020092.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020092.mp4" + }, + { + "episode_id": 48762, + "source_index": 48762, + "raw_length": 46, + "instruction": "Pick up green corn and move it right towards the table's edge", + "canonical_instruction": "pick up green corn and move it right towards the table's edge", + "parquet": "data/chunk-048/episode_048762.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048762.mp4" + }, + { + "episode_id": 17301, + "source_index": 17301, + "raw_length": 33, + "instruction": "move the can to the left side of the table", + "canonical_instruction": "move the can to the left side of the table", + "parquet": "data/chunk-017/episode_017301.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017301.mp4" + }, + { + "episode_id": 7935, + "source_index": 7935, + "raw_length": 42, + "instruction": "Move the red spoon beside the top left of the yellow cloth", + "canonical_instruction": "move the red spoon beside the top left of the yellow cloth", + "parquet": "data/chunk-007/episode_007935.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007935.mp4" + }, + { + "episode_id": 21868, + "source_index": 21868, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-021/episode_021868.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021868.mp4" + }, + { + "episode_id": 31194, + "source_index": 31194, + "raw_length": 33, + "instruction": "move the blue spoon to bottom right of the burner", + "canonical_instruction": "move the blue spoon to bottom right of the burner", + "parquet": "data/chunk-031/episode_031194.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031194.mp4" + }, + { + "episode_id": 24074, + "source_index": 24074, + "raw_length": 33, + "instruction": "moved the carrot from the lower right corner to the silver pot", + "canonical_instruction": "moved the carrot from the lower right corner to the silver pot", + "parquet": "data/chunk-024/episode_024074.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024074.mp4" + }, + { + "episode_id": 24393, + "source_index": 24393, + "raw_length": 38, + "instruction": "unfold the cloth from center to top", + "canonical_instruction": "unfold the cloth from center to top", + "parquet": "data/chunk-024/episode_024393.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024393.mp4" + }, + { + "episode_id": 20307, + "source_index": 20307, + "raw_length": 22, + "instruction": "move the cloth from to left of table", + "canonical_instruction": "move the cloth from to left of table", + "parquet": "data/chunk-020/episode_020307.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020307.mp4" + }, + { + "episode_id": 26931, + "source_index": 26931, + "raw_length": 31, + "instruction": "move the silver pot from upper left burner to the bottom right burner", + "canonical_instruction": "move the silver pot from upper left burner to the bottom right burner", + "parquet": "data/chunk-026/episode_026931.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026931.mp4" + }, + { + "episode_id": 7055, + "source_index": 7055, + "raw_length": 27, + "instruction": "put the spoon between the bowl and beet", + "canonical_instruction": "put the spoon between the bowl and beet", + "parquet": "data/chunk-007/episode_007055.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007055.mp4" + }, + { + "episode_id": 31542, + "source_index": 31542, + "raw_length": 35, + "instruction": "MOVE THE BLENDER INSIDE THE VESSEL", + "canonical_instruction": "move the blender inside the vessel", + "parquet": "data/chunk-031/episode_031542.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031542.mp4" + }, + { + "episode_id": 43637, + "source_index": 43637, + "raw_length": 29, + "instruction": "moved silver pot from bottom left of burners to the top left of burners", + "canonical_instruction": "moved silver pot from bottom left of burners to the top left of burners", + "parquet": "data/chunk-043/episode_043637.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043637.mp4" + }, + { + "episode_id": 33699, + "source_index": 33699, + "raw_length": 35, + "instruction": "move red spoon to lower left corner", + "canonical_instruction": "move red spoon to lower left corner", + "parquet": "data/chunk-033/episode_033699.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033699.mp4" + }, + { + "episode_id": 4307, + "source_index": 4307, + "raw_length": 38, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-004/episode_004307.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004307.mp4" + }, + { + "episode_id": 4510, + "source_index": 4510, + "raw_length": 31, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-004/episode_004510.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004510.mp4" + }, + { + "episode_id": 15790, + "source_index": 15790, + "raw_length": 37, + "instruction": "unfold the cloth from left to right", + "canonical_instruction": "unfold the cloth from left to right", + "parquet": "data/chunk-015/episode_015790.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015790.mp4" + }, + { + "episode_id": 41842, + "source_index": 41842, + "raw_length": 24, + "instruction": "move the silver pot on the bottom part of the right burner", + "canonical_instruction": "move the silver pot on the bottom part of the right burner", + "parquet": "data/chunk-041/episode_041842.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041842.mp4" + }, + { + "episode_id": 7780, + "source_index": 7780, + "raw_length": 45, + "instruction": "Place the red bell pepper on top of the green cloth.", + "canonical_instruction": "place the red bell pepper on top of the green cloth", + "parquet": "data/chunk-007/episode_007780.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007780.mp4" + }, + { + "episode_id": 29205, + "source_index": 29205, + "raw_length": 21, + "instruction": "put spatula in pan", + "canonical_instruction": "put spatula in pan", + "parquet": "data/chunk-029/episode_029205.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029205.mp4" + }, + { + "episode_id": 9802, + "source_index": 9802, + "raw_length": 36, + "instruction": "pour almonds in pot", + "canonical_instruction": "pour almonds in pot", + "parquet": "data/chunk-009/episode_009802.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009802.mp4" + }, + { + "episode_id": 46133, + "source_index": 46133, + "raw_length": 37, + "instruction": "put the red rectangular block on the green cube", + "canonical_instruction": "put the red rectangular block on the green cube", + "parquet": "data/chunk-046/episode_046133.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046133.mp4" + }, + { + "episode_id": 43897, + "source_index": 43897, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-043/episode_043897.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043897.mp4" + }, + { + "episode_id": 23521, + "source_index": 23521, + "raw_length": 39, + "instruction": "move the can to the bottom side of the blue cloth", + "canonical_instruction": "move the can to the bottom side of the blue cloth", + "parquet": "data/chunk-023/episode_023521.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023521.mp4" + }, + { + "episode_id": 3617, + "source_index": 3617, + "raw_length": 35, + "instruction": "Move the purple cloth to the upper left corner of the table", + "canonical_instruction": "move the purple cloth to the upper left corner of the table", + "parquet": "data/chunk-003/episode_003617.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003617.mp4" + }, + { + "episode_id": 31152, + "source_index": 31152, + "raw_length": 30, + "instruction": "move the white basket to the right side of the table", + "canonical_instruction": "move the white basket to the right side of the table", + "parquet": "data/chunk-031/episode_031152.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031152.mp4" + }, + { + "episode_id": 14959, + "source_index": 14959, + "raw_length": 40, + "instruction": "Put the lid of the silver pot on", + "canonical_instruction": "put the lid of the silver pot on", + "parquet": "data/chunk-014/episode_014959.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014959.mp4" + }, + { + "episode_id": 18966, + "source_index": 18966, + "raw_length": 21, + "instruction": "put knife on cutting board", + "canonical_instruction": "put knife on cutting board", + "parquet": "data/chunk-018/episode_018966.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018966.mp4" + }, + { + "episode_id": 48433, + "source_index": 48433, + "raw_length": 44, + "instruction": "Put up the silver pot move thy right burner", + "canonical_instruction": "put up the silver pot move thy right burner", + "parquet": "data/chunk-048/episode_048433.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048433.mp4" + }, + { + "episode_id": 32622, + "source_index": 32622, + "raw_length": 36, + "instruction": "take sushi out of pot cardboard fence", + "canonical_instruction": "take sushi out of pot cardboard fence", + "parquet": "data/chunk-032/episode_032622.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032622.mp4" + }, + { + "episode_id": 14699, + "source_index": 14699, + "raw_length": 33, + "instruction": "Put the pepper into the pot.", + "canonical_instruction": "put the pepper into the pot", + "parquet": "data/chunk-014/episode_014699.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014699.mp4" + }, + { + "episode_id": 30623, + "source_index": 30623, + "raw_length": 37, + "instruction": "Put the red object into the silver pot", + "canonical_instruction": "put the red object into the silver pot", + "parquet": "data/chunk-030/episode_030623.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030623.mp4" + }, + { + "episode_id": 32959, + "source_index": 32959, + "raw_length": 34, + "instruction": "move the red bell pepper to the right side of the right burner", + "canonical_instruction": "move the red bell pepper to the right side of the right burner", + "parquet": "data/chunk-032/episode_032959.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032959.mp4" + }, + { + "episode_id": 36968, + "source_index": 36968, + "raw_length": 22, + "instruction": "move the cloth from the left to the right of the table", + "canonical_instruction": "move the cloth from the left to the right of the table", + "parquet": "data/chunk-036/episode_036968.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036968.mp4" + }, + { + "episode_id": 5958, + "source_index": 5958, + "raw_length": 24, + "instruction": "Move blue napkin to back right corner of stove top", + "canonical_instruction": "move blue napkin to back right corner of stove top", + "parquet": "data/chunk-005/episode_005958.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005958.mp4" + }, + { + "episode_id": 5025, + "source_index": 5025, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-005/episode_005025.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005025.mp4" + }, + { + "episode_id": 15415, + "source_index": 15415, + "raw_length": 46, + "instruction": "pick circle ring on the table and place it in the middle of tower", + "canonical_instruction": "pick circle ring on the table and place it in the middle of tower", + "parquet": "data/chunk-015/episode_015415.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015415.mp4" + }, + { + "episode_id": 26138, + "source_index": 26138, + "raw_length": 33, + "instruction": "put the cake in the pot", + "canonical_instruction": "put the cake in the pot", + "parquet": "data/chunk-026/episode_026138.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026138.mp4" + }, + { + "episode_id": 52494, + "source_index": 52494, + "raw_length": 39, + "instruction": "move the towel next to the fork", + "canonical_instruction": "move the towel next to the fork", + "parquet": "data/chunk-052/episode_052494.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052494.mp4" + }, + { + "episode_id": 50925, + "source_index": 50925, + "raw_length": 44, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-050/episode_050925.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050925.mp4" + }, + { + "episode_id": 32630, + "source_index": 32630, + "raw_length": 30, + "instruction": "Pick up the salmon and put it in the pot", + "canonical_instruction": "pick up the salmon and put it in the pot", + "parquet": "data/chunk-032/episode_032630.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032630.mp4" + }, + { + "episode_id": 52801, + "source_index": 52801, + "raw_length": 29, + "instruction": "unfold the cloth from the right side to left", + "canonical_instruction": "unfold the cloth from the right side to left", + "parquet": "data/chunk-052/episode_052801.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052801.mp4" + }, + { + "episode_id": 35744, + "source_index": 35744, + "raw_length": 32, + "instruction": "move the cloth from bottom left of the table to top right of the table", + "canonical_instruction": "move the cloth from bottom left of the table to top right of the table", + "parquet": "data/chunk-035/episode_035744.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035744.mp4" + }, + { + "episode_id": 4028, + "source_index": 4028, + "raw_length": 35, + "instruction": "Moved the scoop to the left side of the cloth", + "canonical_instruction": "moved the scoop to the left side of the cloth", + "parquet": "data/chunk-004/episode_004028.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004028.mp4" + }, + { + "episode_id": 2706, + "source_index": 2706, + "raw_length": 46, + "instruction": "fold the cloth from bottom right to top left", + "canonical_instruction": "fold the cloth from bottom right to top left", + "parquet": "data/chunk-002/episode_002706.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002706.mp4" + }, + { + "episode_id": 9797, + "source_index": 9797, + "raw_length": 19, + "instruction": "move the light blue cloth to the bottom of the table", + "canonical_instruction": "move the light blue cloth to the bottom of the table", + "parquet": "data/chunk-009/episode_009797.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009797.mp4" + }, + { + "episode_id": 23744, + "source_index": 23744, + "raw_length": 26, + "instruction": "Move the wedge of cheese between the colander and cans", + "canonical_instruction": "move the wedge of cheese between the colander and cans", + "parquet": "data/chunk-023/episode_023744.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023744.mp4" + }, + { + "episode_id": 34832, + "source_index": 34832, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-034/episode_034832.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034832.mp4" + }, + { + "episode_id": 15219, + "source_index": 15219, + "raw_length": 23, + "instruction": "move the white ball to the bottom of the table", + "canonical_instruction": "move the white ball to the bottom of the table", + "parquet": "data/chunk-015/episode_015219.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015219.mp4" + }, + { + "episode_id": 1916, + "source_index": 1916, + "raw_length": 35, + "instruction": "Move the blue spoon to the left of the bowl", + "canonical_instruction": "move the blue spoon to the left of the bowl", + "parquet": "data/chunk-001/episode_001916.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001916.mp4" + }, + { + "episode_id": 25145, + "source_index": 25145, + "raw_length": 30, + "instruction": "fold the cloth from top right to bottom left", + "canonical_instruction": "fold the cloth from top right to bottom left", + "parquet": "data/chunk-025/episode_025145.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025145.mp4" + }, + { + "episode_id": 10672, + "source_index": 10672, + "raw_length": 32, + "instruction": "Move the brush top left of table", + "canonical_instruction": "move the brush top left of table", + "parquet": "data/chunk-010/episode_010672.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010672.mp4" + }, + { + "episode_id": 41864, + "source_index": 41864, + "raw_length": 36, + "instruction": "take carrot out of pot cardboard fence", + "canonical_instruction": "take carrot out of pot cardboard fence", + "parquet": "data/chunk-041/episode_041864.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041864.mp4" + }, + { + "episode_id": 23128, + "source_index": 23128, + "raw_length": 19, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-023/episode_023128.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023128.mp4" + }, + { + "episode_id": 48821, + "source_index": 48821, + "raw_length": 21, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-048/episode_048821.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048821.mp4" + }, + { + "episode_id": 16579, + "source_index": 16579, + "raw_length": 42, + "instruction": "Put the mushroom into the corner above the spatula.", + "canonical_instruction": "put the mushroom into the corner above the spatula", + "parquet": "data/chunk-016/episode_016579.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016579.mp4" + }, + { + "episode_id": 22099, + "source_index": 22099, + "raw_length": 31, + "instruction": "Move the can towards the bottom right corner of the counter.", + "canonical_instruction": "move the can towards the bottom right corner of the counter", + "parquet": "data/chunk-022/episode_022099.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022099.mp4" + }, + { + "episode_id": 1135, + "source_index": 1135, + "raw_length": 21, + "instruction": "move drying rack out of sink", + "canonical_instruction": "move drying rack out of sink", + "parquet": "data/chunk-001/episode_001135.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001135.mp4" + }, + { + "episode_id": 34032, + "source_index": 34032, + "raw_length": 76, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-034/episode_034032.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034032.mp4" + }, + { + "episode_id": 24961, + "source_index": 24961, + "raw_length": 29, + "instruction": "Place the pan over the violet cloth.", + "canonical_instruction": "place the pan over the violet cloth", + "parquet": "data/chunk-024/episode_024961.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024961.mp4" + }, + { + "episode_id": 48733, + "source_index": 48733, + "raw_length": 33, + "instruction": "put the purple cloth to the right side of the stove", + "canonical_instruction": "put the purple cloth to the right side of the stove", + "parquet": "data/chunk-048/episode_048733.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048733.mp4" + }, + { + "episode_id": 19982, + "source_index": 19982, + "raw_length": 22, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-019/episode_019982.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019982.mp4" + }, + { + "episode_id": 23290, + "source_index": 23290, + "raw_length": 43, + "instruction": "Mover bloque azul encima del bloque derecho", + "canonical_instruction": "mover bloque azul encima del bloque derecho", + "parquet": "data/chunk-023/episode_023290.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023290.mp4" + }, + { + "episode_id": 13758, + "source_index": 13758, + "raw_length": 34, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-013/episode_013758.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013758.mp4" + }, + { + "episode_id": 35551, + "source_index": 35551, + "raw_length": 22, + "instruction": "opened the closed drawer", + "canonical_instruction": "opened the closed drawer", + "parquet": "data/chunk-035/episode_035551.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035551.mp4" + }, + { + "episode_id": 41795, + "source_index": 41795, + "raw_length": 36, + "instruction": "upright metal pot cardboard fence", + "canonical_instruction": "upright metal pot cardboard fence", + "parquet": "data/chunk-041/episode_041795.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041795.mp4" + }, + { + "episode_id": 14559, + "source_index": 14559, + "raw_length": 26, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-014/episode_014559.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014559.mp4" + }, + { + "episode_id": 2982, + "source_index": 2982, + "raw_length": 27, + "instruction": "Place the croissant on top of the green towel", + "canonical_instruction": "place the croissant on top of the green towel", + "parquet": "data/chunk-002/episode_002982.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002982.mp4" + }, + { + "episode_id": 19890, + "source_index": 19890, + "raw_length": 21, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-019/episode_019890.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019890.mp4" + }, + { + "episode_id": 16148, + "source_index": 16148, + "raw_length": 20, + "instruction": "put brush into pot or pan", + "canonical_instruction": "put brush into pot or pan", + "parquet": "data/chunk-016/episode_016148.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016148.mp4" + }, + { + "episode_id": 17537, + "source_index": 17537, + "raw_length": 30, + "instruction": "take the red object out of the pot and put it on the left burner", + "canonical_instruction": "take the red object out of the pot and put it on the left burner", + "parquet": "data/chunk-017/episode_017537.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017537.mp4" + }, + { + "episode_id": 43888, + "source_index": 43888, + "raw_length": 19, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-043/episode_043888.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043888.mp4" + }, + { + "episode_id": 44520, + "source_index": 44520, + "raw_length": 42, + "instruction": "fold the cloth from top left to bottom right", + "canonical_instruction": "fold the cloth from top left to bottom right", + "parquet": "data/chunk-044/episode_044520.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044520.mp4" + }, + { + "episode_id": 19488, + "source_index": 19488, + "raw_length": 30, + "instruction": "Move blue brush to space between cans and purple cloth.", + "canonical_instruction": "move blue brush to space between cans and purple cloth", + "parquet": "data/chunk-019/episode_019488.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019488.mp4" + }, + { + "episode_id": 13393, + "source_index": 13393, + "raw_length": 21, + "instruction": "put lid on stove", + "canonical_instruction": "put lid on stove", + "parquet": "data/chunk-013/episode_013393.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013393.mp4" + }, + { + "episode_id": 41908, + "source_index": 41908, + "raw_length": 46, + "instruction": "Unfold the cloth from top right to bottom left", + "canonical_instruction": "unfold the cloth from top right to bottom left", + "parquet": "data/chunk-041/episode_041908.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041908.mp4" + }, + { + "episode_id": 39976, + "source_index": 39976, + "raw_length": 33, + "instruction": "Moved silver pot to the left side of the can", + "canonical_instruction": "moved silver pot to the left side of the can", + "parquet": "data/chunk-039/episode_039976.parquet", + "video": "videos/chunk-039/observation.images.image_0/episode_039976.mp4" + }, + { + "episode_id": 8154, + "source_index": 8154, + "raw_length": 33, + "instruction": "move the cloth from bottom to top", + "canonical_instruction": "move the cloth from bottom to top", + "parquet": "data/chunk-008/episode_008154.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008154.mp4" + }, + { + "episode_id": 29842, + "source_index": 29842, + "raw_length": 33, + "instruction": "move the banana to the top middle of table", + "canonical_instruction": "move the banana to the top middle of table", + "parquet": "data/chunk-029/episode_029842.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029842.mp4" + }, + { + "episode_id": 38320, + "source_index": 38320, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-038/episode_038320.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038320.mp4" + }, + { + "episode_id": 34626, + "source_index": 34626, + "raw_length": 36, + "instruction": "put knife in pot cardboard fence", + "canonical_instruction": "put knife in pot cardboard fence", + "parquet": "data/chunk-034/episode_034626.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034626.mp4" + }, + { + "episode_id": 38859, + "source_index": 38859, + "raw_length": 22, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-038/episode_038859.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038859.mp4" + }, + { + "episode_id": 16774, + "source_index": 16774, + "raw_length": 27, + "instruction": "put bowl on plate cardboard fence", + "canonical_instruction": "put bowl on plate cardboard fence", + "parquet": "data/chunk-016/episode_016774.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016774.mp4" + }, + { + "episode_id": 46914, + "source_index": 46914, + "raw_length": 96, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-046/episode_046914.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046914.mp4" + }, + { + "episode_id": 13109, + "source_index": 13109, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-013/episode_013109.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013109.mp4" + }, + { + "episode_id": 22225, + "source_index": 22225, + "raw_length": 37, + "instruction": "moved the orange lid from left to right side of the stove", + "canonical_instruction": "moved the orange lid from left to right side of the stove", + "parquet": "data/chunk-022/episode_022225.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022225.mp4" + }, + { + "episode_id": 5837, + "source_index": 5837, + "raw_length": 22, + "instruction": "put pear on plate", + "canonical_instruction": "put pear on plate", + "parquet": "data/chunk-005/episode_005837.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005837.mp4" + }, + { + "episode_id": 35594, + "source_index": 35594, + "raw_length": 38, + "instruction": "Place the colander behind the green towel", + "canonical_instruction": "place the colander behind the green towel", + "parquet": "data/chunk-035/episode_035594.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035594.mp4" + }, + { + "episode_id": 11245, + "source_index": 11245, + "raw_length": 43, + "instruction": "put the silver lid on the silver pan", + "canonical_instruction": "put the silver lid on the silver pan", + "parquet": "data/chunk-011/episode_011245.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011245.mp4" + }, + { + "episode_id": 8259, + "source_index": 8259, + "raw_length": 26, + "instruction": "Move the green rag off of the left stove burner.", + "canonical_instruction": "move the green rag off of the left stove burner", + "parquet": "data/chunk-008/episode_008259.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008259.mp4" + }, + { + "episode_id": 9351, + "source_index": 9351, + "raw_length": 40, + "instruction": "PICK UP THE BOWLSAND PUT ON THE TOWEL", + "canonical_instruction": "pick up the bowlsand put on the towel", + "parquet": "data/chunk-009/episode_009351.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009351.mp4" + }, + { + "episode_id": 8900, + "source_index": 8900, + "raw_length": 63, + "instruction": "put corncob in pot or pan an put pot or pan on stove", + "canonical_instruction": "put corncob in pot or pan an put pot or pan on stove", + "parquet": "data/chunk-008/episode_008900.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008900.mp4" + }, + { + "episode_id": 16350, + "source_index": 16350, + "raw_length": 26, + "instruction": "put small spoon from basket to tray", + "canonical_instruction": "put small spoon from basket to tray", + "parquet": "data/chunk-016/episode_016350.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016350.mp4" + }, + { + "episode_id": 46467, + "source_index": 46467, + "raw_length": 21, + "instruction": "put spoon in pot", + "canonical_instruction": "put spoon in pot", + "parquet": "data/chunk-046/episode_046467.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046467.mp4" + }, + { + "episode_id": 33345, + "source_index": 33345, + "raw_length": 47, + "instruction": "put the chicken leg to the pot", + "canonical_instruction": "put the chicken leg to the pot", + "parquet": "data/chunk-033/episode_033345.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033345.mp4" + }, + { + "episode_id": 52595, + "source_index": 52595, + "raw_length": 20, + "instruction": "take the gray toy from the drawer and put it on the table.", + "canonical_instruction": "take the gray toy from the drawer and put it on the table", + "parquet": "data/chunk-052/episode_052595.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052595.mp4" + }, + { + "episode_id": 50780, + "source_index": 50780, + "raw_length": 20, + "instruction": "ghfl_rr uklçè-çè- zqrg_èè fyrkè sè-_v ytu_è_y ftyk-è_-(__l", + "canonical_instruction": "ghfl_rr uklçè-çè- zqrg_èè fyrkè sè-_v ytu_è_y ftyk-è_-(__l", + "parquet": "data/chunk-050/episode_050780.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050780.mp4" + }, + { + "episode_id": 25435, + "source_index": 25435, + "raw_length": 26, + "instruction": "take carrot off plate", + "canonical_instruction": "take carrot off plate", + "parquet": "data/chunk-025/episode_025435.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025435.mp4" + }, + { + "episode_id": 10757, + "source_index": 10757, + "raw_length": 24, + "instruction": "gyhezriuo", + "canonical_instruction": "gyhezriuo", + "parquet": "data/chunk-010/episode_010757.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010757.mp4" + }, + { + "episode_id": 5513, + "source_index": 5513, + "raw_length": 44, + "instruction": "Place the silver bowl to the left of the purple eggplant", + "canonical_instruction": "place the silver bowl to the left of the purple eggplant", + "parquet": "data/chunk-005/episode_005513.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005513.mp4" + }, + { + "episode_id": 26160, + "source_index": 26160, + "raw_length": 26, + "instruction": "move the blue clothe", + "canonical_instruction": "move the blue clothe", + "parquet": "data/chunk-026/episode_026160.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026160.mp4" + }, + { + "episode_id": 40785, + "source_index": 40785, + "raw_length": 34, + "instruction": "open low fridge", + "canonical_instruction": "open low fridge", + "parquet": "data/chunk-040/episode_040785.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040785.mp4" + }, + { + "episode_id": 8374, + "source_index": 8374, + "raw_length": 36, + "instruction": "close low fridge", + "canonical_instruction": "close low fridge", + "parquet": "data/chunk-008/episode_008374.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008374.mp4" + }, + { + "episode_id": 19459, + "source_index": 19459, + "raw_length": 28, + "instruction": "take corn out of bowl sink", + "canonical_instruction": "take corn out of bowl sink", + "parquet": "data/chunk-019/episode_019459.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019459.mp4" + }, + { + "episode_id": 33470, + "source_index": 33470, + "raw_length": 32, + "instruction": "picked up the silver pot lid and put it on the bottom right of the table", + "canonical_instruction": "picked up the silver pot lid and put it on the bottom right of the table", + "parquet": "data/chunk-033/episode_033470.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033470.mp4" + }, + { + "episode_id": 5805, + "source_index": 5805, + "raw_length": 38, + "instruction": "move the cylinder to the top of the green arch", + "canonical_instruction": "move the cylinder to the top of the green arch", + "parquet": "data/chunk-005/episode_005805.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005805.mp4" + }, + { + "episode_id": 6147, + "source_index": 6147, + "raw_length": 21, + "instruction": "put green squash in pot or pan", + "canonical_instruction": "put green squash in pot or pan", + "parquet": "data/chunk-006/episode_006147.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006147.mp4" + }, + { + "episode_id": 2286, + "source_index": 2286, + "raw_length": 45, + "instruction": "fold the cloth from upper right to bottom left", + "canonical_instruction": "fold the cloth from upper right to bottom left", + "parquet": "data/chunk-002/episode_002286.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002286.mp4" + }, + { + "episode_id": 23450, + "source_index": 23450, + "raw_length": 36, + "instruction": "open fridge", + "canonical_instruction": "open fridge", + "parquet": "data/chunk-023/episode_023450.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023450.mp4" + }, + { + "episode_id": 24568, + "source_index": 24568, + "raw_length": 27, + "instruction": "move the the banana to the floor", + "canonical_instruction": "move the the banana to the floor", + "parquet": "data/chunk-024/episode_024568.parquet", + "video": "videos/chunk-024/observation.images.image_0/episode_024568.mp4" + }, + { + "episode_id": 47670, + "source_index": 47670, + "raw_length": 36, + "instruction": "Move the bowl on the towel.", + "canonical_instruction": "move the bowl on the towel", + "parquet": "data/chunk-047/episode_047670.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047670.mp4" + }, + { + "episode_id": 46398, + "source_index": 46398, + "raw_length": 21, + "instruction": "lever vertical to front", + "canonical_instruction": "lever vertical to front", + "parquet": "data/chunk-046/episode_046398.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046398.mp4" + }, + { + "episode_id": 2742, + "source_index": 2742, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-002/episode_002742.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002742.mp4" + }, + { + "episode_id": 49214, + "source_index": 49214, + "raw_length": 38, + "instruction": "move the blue rag to the bottom of the orange pot", + "canonical_instruction": "move the blue rag to the bottom of the orange pot", + "parquet": "data/chunk-049/episode_049214.parquet", + "video": "videos/chunk-049/observation.images.image_0/episode_049214.mp4" + }, + { + "episode_id": 15183, + "source_index": 15183, + "raw_length": 21, + "instruction": "put cup from counter to sink", + "canonical_instruction": "put cup from counter to sink", + "parquet": "data/chunk-015/episode_015183.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015183.mp4" + }, + { + "episode_id": 23910, + "source_index": 23910, + "raw_length": 46, + "instruction": "Place the pot on the opposite side of the cloth.", + "canonical_instruction": "place the pot on the opposite side of the cloth", + "parquet": "data/chunk-023/episode_023910.parquet", + "video": "videos/chunk-023/observation.images.image_0/episode_023910.mp4" + }, + { + "episode_id": 41954, + "source_index": 41954, + "raw_length": 27, + "instruction": "take the yellow brush and moved it on the upper left side of the stove", + "canonical_instruction": "take the yellow brush and moved it on the upper left side of the stove", + "parquet": "data/chunk-041/episode_041954.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041954.mp4" + }, + { + "episode_id": 21975, + "source_index": 21975, + "raw_length": 27, + "instruction": "put potato in pot cardboard fence", + "canonical_instruction": "put potato in pot cardboard fence", + "parquet": "data/chunk-021/episode_021975.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021975.mp4" + }, + { + "episode_id": 28125, + "source_index": 28125, + "raw_length": 33, + "instruction": "put the ring in the cylinder", + "canonical_instruction": "put the ring in the cylinder", + "parquet": "data/chunk-028/episode_028125.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028125.mp4" + }, + { + "episode_id": 33753, + "source_index": 33753, + "raw_length": 20, + "instruction": "put corn in pan which is on stove", + "canonical_instruction": "put corn in pan which is on stove", + "parquet": "data/chunk-033/episode_033753.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033753.mp4" + }, + { + "episode_id": 16845, + "source_index": 16845, + "raw_length": 49, + "instruction": "move the kettle to the left side of the table", + "canonical_instruction": "move the kettle to the left side of the table", + "parquet": "data/chunk-016/episode_016845.parquet", + "video": "videos/chunk-016/observation.images.image_0/episode_016845.mp4" + }, + { + "episode_id": 20130, + "source_index": 20130, + "raw_length": 42, + "instruction": "takes the lid and puts it on the pot", + "canonical_instruction": "takes the lid and puts it on the pot", + "parquet": "data/chunk-020/episode_020130.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020130.mp4" + }, + { + "episode_id": 18241, + "source_index": 18241, + "raw_length": 36, + "instruction": "put the white object on top of the drawer", + "canonical_instruction": "put the white object on top of the drawer", + "parquet": "data/chunk-018/episode_018241.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018241.mp4" + }, + { + "episode_id": 31778, + "source_index": 31778, + "raw_length": 55, + "instruction": "moved the yellow object inside the silver pot", + "canonical_instruction": "moved the yellow object inside the silver pot", + "parquet": "data/chunk-031/episode_031778.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031778.mp4" + }, + { + "episode_id": 30217, + "source_index": 30217, + "raw_length": 29, + "instruction": "Place the pot to the bottom lower right hand corner of the napkin.", + "canonical_instruction": "place the pot to the bottom lower right hand corner of the napkin", + "parquet": "data/chunk-030/episode_030217.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030217.mp4" + }, + { + "episode_id": 2151, + "source_index": 2151, + "raw_length": 26, + "instruction": "move the silver bowl to the left burner", + "canonical_instruction": "move the silver bowl to the left burner", + "parquet": "data/chunk-002/episode_002151.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002151.mp4" + }, + { + "episode_id": 28948, + "source_index": 28948, + "raw_length": 21, + "instruction": "close brown1fbox flap", + "canonical_instruction": "close brown1fbox flap", + "parquet": "data/chunk-028/episode_028948.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028948.mp4" + }, + { + "episode_id": 33674, + "source_index": 33674, + "raw_length": 21, + "instruction": "put pot or pan in sink", + "canonical_instruction": "put pot or pan in sink", + "parquet": "data/chunk-033/episode_033674.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033674.mp4" + }, + { + "episode_id": 46715, + "source_index": 46715, + "raw_length": 40, + "instruction": "move the cloth to the middle of the table", + "canonical_instruction": "move the cloth to the middle of the table", + "parquet": "data/chunk-046/episode_046715.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046715.mp4" + }, + { + "episode_id": 46645, + "source_index": 46645, + "raw_length": 42, + "instruction": "put the ball in the cup", + "canonical_instruction": "put the ball in the cup", + "parquet": "data/chunk-046/episode_046645.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046645.mp4" + }, + { + "episode_id": 14849, + "source_index": 14849, + "raw_length": 35, + "instruction": "moved the silver plate to the left burner", + "canonical_instruction": "moved the silver plate to the left burner", + "parquet": "data/chunk-014/episode_014849.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014849.mp4" + }, + { + "episode_id": 35677, + "source_index": 35677, + "raw_length": 36, + "instruction": "Move the maize to the right side of the burner", + "canonical_instruction": "move the maize to the right side of the burner", + "parquet": "data/chunk-035/episode_035677.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035677.mp4" + }, + { + "episode_id": 37860, + "source_index": 37860, + "raw_length": 25, + "instruction": "sets blue arch to upright position", + "canonical_instruction": "sets blue arch to upright position", + "parquet": "data/chunk-037/episode_037860.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037860.mp4" + }, + { + "episode_id": 20163, + "source_index": 20163, + "raw_length": 17, + "instruction": "flip pot upright which is in sink", + "canonical_instruction": "flip pot upright which is in sink", + "parquet": "data/chunk-020/episode_020163.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020163.mp4" + }, + { + "episode_id": 51202, + "source_index": 51202, + "raw_length": 30, + "instruction": "move the shushi to the bottom side of the table", + "canonical_instruction": "move the shushi to the bottom side of the table", + "parquet": "data/chunk-051/episode_051202.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051202.mp4" + }, + { + "episode_id": 38866, + "source_index": 38866, + "raw_length": 40, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-038/episode_038866.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038866.mp4" + }, + { + "episode_id": 22819, + "source_index": 22819, + "raw_length": 34, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-022/episode_022819.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022819.mp4" + }, + { + "episode_id": 42608, + "source_index": 42608, + "raw_length": 75, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-042/episode_042608.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042608.mp4" + }, + { + "episode_id": 14828, + "source_index": 14828, + "raw_length": 42, + "instruction": "move the ball from the hoop to the cup on the lower left side of the table .", + "canonical_instruction": "move the ball from the hoop to the cup on the lower left side of the table", + "parquet": "data/chunk-014/episode_014828.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014828.mp4" + }, + { + "episode_id": 46291, + "source_index": 46291, + "raw_length": 33, + "instruction": "move the silver basket to the lower right corner of the sink", + "canonical_instruction": "move the silver basket to the lower right corner of the sink", + "parquet": "data/chunk-046/episode_046291.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046291.mp4" + }, + { + "episode_id": 35829, + "source_index": 35829, + "raw_length": 18, + "instruction": "put green squash in pot or pan", + "canonical_instruction": "put green squash in pot or pan", + "parquet": "data/chunk-035/episode_035829.parquet", + "video": "videos/chunk-035/observation.images.image_0/episode_035829.mp4" + }, + { + "episode_id": 7702, + "source_index": 7702, + "raw_length": 24, + "instruction": "moved the towel from the middle of washing machine to the right side>", + "canonical_instruction": "moved the towel from the middle of washing machine to the right side>", + "parquet": "data/chunk-007/episode_007702.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007702.mp4" + }, + { + "episode_id": 17308, + "source_index": 17308, + "raw_length": 33, + "instruction": "Place the laddle on the front left edge of the stove", + "canonical_instruction": "place the laddle on the front left edge of the stove", + "parquet": "data/chunk-017/episode_017308.parquet", + "video": "videos/chunk-017/observation.images.image_0/episode_017308.mp4" + }, + { + "episode_id": 276, + "source_index": 276, + "raw_length": 33, + "instruction": "move the brown pot to the bottom right corner of the stove", + "canonical_instruction": "move the brown pot to the bottom right corner of the stove", + "parquet": "data/chunk-000/episode_000276.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000276.mp4" + }, + { + "episode_id": 11813, + "source_index": 11813, + "raw_length": 30, + "instruction": "put carrot in pot cardboard fence", + "canonical_instruction": "put carrot in pot cardboard fence", + "parquet": "data/chunk-011/episode_011813.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011813.mp4" + }, + { + "episode_id": 50936, + "source_index": 50936, + "raw_length": 24, + "instruction": "Move the pot above the purple towel.", + "canonical_instruction": "move the pot above the purple towel", + "parquet": "data/chunk-050/episode_050936.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050936.mp4" + }, + { + "episode_id": 43688, + "source_index": 43688, + "raw_length": 37, + "instruction": "Move the purple cloth to the back right edge of the table", + "canonical_instruction": "move the purple cloth to the back right edge of the table", + "parquet": "data/chunk-043/episode_043688.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043688.mp4" + }, + { + "episode_id": 46660, + "source_index": 46660, + "raw_length": 33, + "instruction": "move the silver pot to the front left burner", + "canonical_instruction": "move the silver pot to the front left burner", + "parquet": "data/chunk-046/episode_046660.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046660.mp4" + }, + { + "episode_id": 30965, + "source_index": 30965, + "raw_length": 41, + "instruction": "Put the metal pot on top of the purple towel.", + "canonical_instruction": "put the metal pot on top of the purple towel", + "parquet": "data/chunk-030/episode_030965.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030965.mp4" + }, + { + "episode_id": 47467, + "source_index": 47467, + "raw_length": 36, + "instruction": "Move the brush to the left of the table", + "canonical_instruction": "move the brush to the left of the table", + "parquet": "data/chunk-047/episode_047467.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047467.mp4" + }, + { + "episode_id": 14505, + "source_index": 14505, + "raw_length": 26, + "instruction": "take the cucumber and put it on the drawer", + "canonical_instruction": "take the cucumber and put it on the drawer", + "parquet": "data/chunk-014/episode_014505.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014505.mp4" + }, + { + "episode_id": 46905, + "source_index": 46905, + "raw_length": 48, + "instruction": "put the wooden spoon on top of the silver pot", + "canonical_instruction": "put the wooden spoon on top of the silver pot", + "parquet": "data/chunk-046/episode_046905.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046905.mp4" + }, + { + "episode_id": 5860, + "source_index": 5860, + "raw_length": 46, + "instruction": "Take the red spoon and put it on the yellow cloth.", + "canonical_instruction": "take the red spoon and put it on the yellow cloth", + "parquet": "data/chunk-005/episode_005860.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005860.mp4" + }, + { + "episode_id": 32210, + "source_index": 32210, + "raw_length": 45, + "instruction": "Place the knife to the left of the yellow cloth.", + "canonical_instruction": "place the knife to the left of the yellow cloth", + "parquet": "data/chunk-032/episode_032210.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032210.mp4" + }, + { + "episode_id": 26195, + "source_index": 26195, + "raw_length": 22, + "instruction": "put banana in pot or pan", + "canonical_instruction": "put banana in pot or pan", + "parquet": "data/chunk-026/episode_026195.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026195.mp4" + }, + { + "episode_id": 3518, + "source_index": 3518, + "raw_length": 38, + "instruction": "put stuffedduck in pan", + "canonical_instruction": "put stuffedduck in pan", + "parquet": "data/chunk-003/episode_003518.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003518.mp4" + }, + { + "episode_id": 26218, + "source_index": 26218, + "raw_length": 45, + "instruction": "move the spatula to the left bottom corner of the table", + "canonical_instruction": "move the spatula to the left bottom corner of the table", + "parquet": "data/chunk-026/episode_026218.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026218.mp4" + }, + { + "episode_id": 5769, + "source_index": 5769, + "raw_length": 22, + "instruction": "move the can to the top right corner of the stove", + "canonical_instruction": "move the can to the top right corner of the stove", + "parquet": "data/chunk-005/episode_005769.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005769.mp4" + }, + { + "episode_id": 33905, + "source_index": 33905, + "raw_length": 41, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-033/episode_033905.parquet", + "video": "videos/chunk-033/observation.images.image_0/episode_033905.mp4" + }, + { + "episode_id": 43955, + "source_index": 43955, + "raw_length": 22, + "instruction": "move the can in a straight line to the upper side of the table next to the green object", + "canonical_instruction": "move the can in a straight line to the upper side of the table next to the green object", + "parquet": "data/chunk-043/episode_043955.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043955.mp4" + }, + { + "episode_id": 53100, + "source_index": 53100, + "raw_length": 46, + "instruction": "Open the drawer", + "canonical_instruction": "open the drawer", + "parquet": "data/chunk-053/episode_053100.parquet", + "video": "videos/chunk-053/observation.images.image_0/episode_053100.mp4" + }, + { + "episode_id": 4412, + "source_index": 4412, + "raw_length": 36, + "instruction": "open oven", + "canonical_instruction": "open oven", + "parquet": "data/chunk-004/episode_004412.parquet", + "video": "videos/chunk-004/observation.images.image_0/episode_004412.mp4" + }, + { + "episode_id": 47250, + "source_index": 47250, + "raw_length": 21, + "instruction": "put sweet potato in pot which is in sink", + "canonical_instruction": "put sweet potato in pot which is in sink", + "parquet": "data/chunk-047/episode_047250.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047250.mp4" + }, + { + "episode_id": 1400, + "source_index": 1400, + "raw_length": 31, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-001/episode_001400.parquet", + "video": "videos/chunk-001/observation.images.image_0/episode_001400.mp4" + }, + { + "episode_id": 47456, + "source_index": 47456, + "raw_length": 25, + "instruction": "put detergent in sink", + "canonical_instruction": "put detergent in sink", + "parquet": "data/chunk-047/episode_047456.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047456.mp4" + }, + { + "episode_id": 3845, + "source_index": 3845, + "raw_length": 56, + "instruction": "put the cooking stick on the left of the burner", + "canonical_instruction": "put the cooking stick on the left of the burner", + "parquet": "data/chunk-003/episode_003845.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003845.mp4" + }, + { + "episode_id": 48191, + "source_index": 48191, + "raw_length": 32, + "instruction": "move the red fork to the top of orange towel", + "canonical_instruction": "move the red fork to the top of orange towel", + "parquet": "data/chunk-048/episode_048191.parquet", + "video": "videos/chunk-048/observation.images.image_0/episode_048191.mp4" + }, + { + "episode_id": 13412, + "source_index": 13412, + "raw_length": 38, + "instruction": "move the black and white object to the orange cloth", + "canonical_instruction": "move the black and white object to the orange cloth", + "parquet": "data/chunk-013/episode_013412.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013412.mp4" + }, + { + "episode_id": 34261, + "source_index": 34261, + "raw_length": 30, + "instruction": "close the drawer", + "canonical_instruction": "close the drawer", + "parquet": "data/chunk-034/episode_034261.parquet", + "video": "videos/chunk-034/observation.images.image_0/episode_034261.mp4" + }, + { + "episode_id": 36480, + "source_index": 36480, + "raw_length": 45, + "instruction": "placed the blue-handled spoon to the left of the blue cloth", + "canonical_instruction": "placed the blue-handled spoon to the left of the blue cloth", + "parquet": "data/chunk-036/episode_036480.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036480.mp4" + }, + { + "episode_id": 27224, + "source_index": 27224, + "raw_length": 26, + "instruction": "put lid on pot or pan", + "canonical_instruction": "put lid on pot or pan", + "parquet": "data/chunk-027/episode_027224.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027224.mp4" + }, + { + "episode_id": 29918, + "source_index": 29918, + "raw_length": 69, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-029/episode_029918.parquet", + "video": "videos/chunk-029/observation.images.image_0/episode_029918.mp4" + }, + { + "episode_id": 5943, + "source_index": 5943, + "raw_length": 32, + "instruction": "take clothes out of laundry machine", + "canonical_instruction": "take clothes out of laundry machine", + "parquet": "data/chunk-005/episode_005943.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005943.mp4" + }, + { + "episode_id": 7588, + "source_index": 7588, + "raw_length": 22, + "instruction": "Move the spoon to the left of the mushroom", + "canonical_instruction": "move the spoon to the left of the mushroom", + "parquet": "data/chunk-007/episode_007588.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007588.mp4" + }, + { + "episode_id": 37979, + "source_index": 37979, + "raw_length": 23, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-037/episode_037979.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037979.mp4" + }, + { + "episode_id": 11481, + "source_index": 11481, + "raw_length": 32, + "instruction": "coloque o ovo dentro da gaveta", + "canonical_instruction": "coloque o ovo dentro da gaveta", + "parquet": "data/chunk-011/episode_011481.parquet", + "video": "videos/chunk-011/observation.images.image_0/episode_011481.mp4" + }, + { + "episode_id": 2675, + "source_index": 2675, + "raw_length": 35, + "instruction": "fold the cloth from bottom left to top right", + "canonical_instruction": "fold the cloth from bottom left to top right", + "parquet": "data/chunk-002/episode_002675.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002675.mp4" + }, + { + "episode_id": 28298, + "source_index": 28298, + "raw_length": 39, + "instruction": "move the white basket to the left side of the orange cloth", + "canonical_instruction": "move the white basket to the left side of the orange cloth", + "parquet": "data/chunk-028/episode_028298.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028298.mp4" + }, + { + "episode_id": 38892, + "source_index": 38892, + "raw_length": 42, + "instruction": "Place the green pear on top of the orange towel", + "canonical_instruction": "place the green pear on top of the orange towel", + "parquet": "data/chunk-038/episode_038892.parquet", + "video": "videos/chunk-038/observation.images.image_0/episode_038892.mp4" + }, + { + "episode_id": 15575, + "source_index": 15575, + "raw_length": 46, + "instruction": "put the blue figure on the top edge of the cloth", + "canonical_instruction": "put the blue figure on the top edge of the cloth", + "parquet": "data/chunk-015/episode_015575.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015575.mp4" + }, + { + "episode_id": 41834, + "source_index": 41834, + "raw_length": 32, + "instruction": "Pick up tomato and move it towards the bottom of the table under the bowl.", + "canonical_instruction": "pick up tomato and move it towards the bottom of the table under the bowl", + "parquet": "data/chunk-041/episode_041834.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041834.mp4" + }, + { + "episode_id": 5114, + "source_index": 5114, + "raw_length": 37, + "instruction": "Pick up the white donut and place it on the purple cloth", + "canonical_instruction": "pick up the white donut and place it on the purple cloth", + "parquet": "data/chunk-005/episode_005114.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005114.mp4" + }, + { + "episode_id": 26615, + "source_index": 26615, + "raw_length": 32, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-026/episode_026615.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026615.mp4" + }, + { + "episode_id": 7549, + "source_index": 7549, + "raw_length": 33, + "instruction": "put the blue rectangular block on top of the green rectangular block", + "canonical_instruction": "put the blue rectangular block on top of the green rectangular block", + "parquet": "data/chunk-007/episode_007549.parquet", + "video": "videos/chunk-007/observation.images.image_0/episode_007549.mp4" + }, + { + "episode_id": 6053, + "source_index": 6053, + "raw_length": 30, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-006/episode_006053.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006053.mp4" + }, + { + "episode_id": 25893, + "source_index": 25893, + "raw_length": 21, + "instruction": "turn lever vertical to front", + "canonical_instruction": "turn lever vertical to front", + "parquet": "data/chunk-025/episode_025893.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025893.mp4" + }, + { + "episode_id": 44602, + "source_index": 44602, + "raw_length": 78, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-044/episode_044602.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044602.mp4" + }, + { + "episode_id": 18927, + "source_index": 18927, + "raw_length": 46, + "instruction": "put the yellow cube on top of the green cube", + "canonical_instruction": "put the yellow cube on top of the green cube", + "parquet": "data/chunk-018/episode_018927.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018927.mp4" + }, + { + "episode_id": 21448, + "source_index": 21448, + "raw_length": 35, + "instruction": "open microwave", + "canonical_instruction": "open microwave", + "parquet": "data/chunk-021/episode_021448.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021448.mp4" + }, + { + "episode_id": 19216, + "source_index": 19216, + "raw_length": 36, + "instruction": "take the lid and put it on the the pot", + "canonical_instruction": "take the lid and put it on the the pot", + "parquet": "data/chunk-019/episode_019216.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019216.mp4" + }, + { + "episode_id": 40772, + "source_index": 40772, + "raw_length": 32, + "instruction": "unfold the cloth from bottom right to top left", + "canonical_instruction": "unfold the cloth from bottom right to top left", + "parquet": "data/chunk-040/episode_040772.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040772.mp4" + }, + { + "episode_id": 31910, + "source_index": 31910, + "raw_length": 31, + "instruction": "Put the blue cloth inside the washing machine", + "canonical_instruction": "put the blue cloth inside the washing machine", + "parquet": "data/chunk-031/episode_031910.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031910.mp4" + }, + { + "episode_id": 614, + "source_index": 614, + "raw_length": 36, + "instruction": "close microwave", + "canonical_instruction": "close microwave", + "parquet": "data/chunk-000/episode_000614.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000614.mp4" + }, + { + "episode_id": 37023, + "source_index": 37023, + "raw_length": 33, + "instruction": "Move the blue spoon and place in the middle of the counter between the bowl and red object", + "canonical_instruction": "move the blue spoon and place in the middle of the counter between the bowl and red object", + "parquet": "data/chunk-037/episode_037023.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037023.mp4" + }, + { + "episode_id": 46968, + "source_index": 46968, + "raw_length": 29, + "instruction": "Put the red capsicum in the pot", + "canonical_instruction": "put the red capsicum in the pot", + "parquet": "data/chunk-046/episode_046968.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046968.mp4" + }, + { + "episode_id": 52229, + "source_index": 52229, + "raw_length": 21, + "instruction": "put cup from anywhere into sink", + "canonical_instruction": "put cup from anywhere into sink", + "parquet": "data/chunk-052/episode_052229.parquet", + "video": "videos/chunk-052/observation.images.image_0/episode_052229.mp4" + }, + { + "episode_id": 32331, + "source_index": 32331, + "raw_length": 43, + "instruction": "Put the bowl between the sushi and towel.", + "canonical_instruction": "put the bowl between the sushi and towel", + "parquet": "data/chunk-032/episode_032331.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032331.mp4" + }, + { + "episode_id": 28859, + "source_index": 28859, + "raw_length": 31, + "instruction": "picks a yellow knife and moves it on the right top side", + "canonical_instruction": "picks a yellow knife and moves it on the right top side", + "parquet": "data/chunk-028/episode_028859.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028859.mp4" + }, + { + "episode_id": 14005, + "source_index": 14005, + "raw_length": 21, + "instruction": "unfold the cloth from the center to the top left", + "canonical_instruction": "unfold the cloth from the center to the top left", + "parquet": "data/chunk-014/episode_014005.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014005.mp4" + }, + { + "episode_id": 20235, + "source_index": 20235, + "raw_length": 46, + "instruction": "Move the blue measuring spoon to the bottom right corner of the table below the silver bowl.", + "canonical_instruction": "move the blue measuring spoon to the bottom right corner of the table below the silver bowl", + "parquet": "data/chunk-020/episode_020235.parquet", + "video": "videos/chunk-020/observation.images.image_0/episode_020235.mp4" + }, + { + "episode_id": 14659, + "source_index": 14659, + "raw_length": 40, + "instruction": "move the silver pot to the right side of the stove", + "canonical_instruction": "move the silver pot to the right side of the stove", + "parquet": "data/chunk-014/episode_014659.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014659.mp4" + }, + { + "episode_id": 13654, + "source_index": 13654, + "raw_length": 63, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-013/episode_013654.parquet", + "video": "videos/chunk-013/observation.images.image_0/episode_013654.mp4" + }, + { + "episode_id": 2959, + "source_index": 2959, + "raw_length": 21, + "instruction": "flip pot upright in sink", + "canonical_instruction": "flip pot upright in sink", + "parquet": "data/chunk-002/episode_002959.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002959.mp4" + }, + { + "episode_id": 51308, + "source_index": 51308, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-051/episode_051308.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051308.mp4" + }, + { + "episode_id": 22339, + "source_index": 22339, + "raw_length": 20, + "instruction": "Move the towel to the middle of the table.", + "canonical_instruction": "move the towel to the middle of the table", + "parquet": "data/chunk-022/episode_022339.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022339.mp4" + }, + { + "episode_id": 46665, + "source_index": 46665, + "raw_length": 32, + "instruction": "Place the yellow pepper on top of the blue towel", + "canonical_instruction": "place the yellow pepper on top of the blue towel", + "parquet": "data/chunk-046/episode_046665.parquet", + "video": "videos/chunk-046/observation.images.image_0/episode_046665.mp4" + }, + { + "episode_id": 22292, + "source_index": 22292, + "raw_length": 26, + "instruction": "put small spoon from basket to tray", + "canonical_instruction": "put small spoon from basket to tray", + "parquet": "data/chunk-022/episode_022292.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022292.mp4" + }, + { + "episode_id": 37037, + "source_index": 37037, + "raw_length": 45, + "instruction": "Place the blue spoon on the front left corner of the table", + "canonical_instruction": "place the blue spoon on the front left corner of the table", + "parquet": "data/chunk-037/episode_037037.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037037.mp4" + }, + { + "episode_id": 50013, + "source_index": 50013, + "raw_length": 24, + "instruction": "pick up box cutter and put into drawer", + "canonical_instruction": "pick up box cutter and put into drawer", + "parquet": "data/chunk-050/episode_050013.parquet", + "video": "videos/chunk-050/observation.images.image_0/episode_050013.mp4" + }, + { + "episode_id": 18226, + "source_index": 18226, + "raw_length": 19, + "instruction": "moved the can to the upper left side of the table", + "canonical_instruction": "moved the can to the upper left side of the table", + "parquet": "data/chunk-018/episode_018226.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018226.mp4" + }, + { + "episode_id": 15100, + "source_index": 15100, + "raw_length": 24, + "instruction": "put the banana on the bottom right burner", + "canonical_instruction": "put the banana on the bottom right burner", + "parquet": "data/chunk-015/episode_015100.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015100.mp4" + }, + { + "episode_id": 15303, + "source_index": 15303, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-015/episode_015303.parquet", + "video": "videos/chunk-015/observation.images.image_0/episode_015303.mp4" + }, + { + "episode_id": 32924, + "source_index": 32924, + "raw_length": 23, + "instruction": "fold the cloth from bottom right to left", + "canonical_instruction": "fold the cloth from bottom right to left", + "parquet": "data/chunk-032/episode_032924.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032924.mp4" + }, + { + "episode_id": 14810, + "source_index": 14810, + "raw_length": 44, + "instruction": "Put the knife on the upper right corner", + "canonical_instruction": "put the knife on the upper right corner", + "parquet": "data/chunk-014/episode_014810.parquet", + "video": "videos/chunk-014/observation.images.image_0/episode_014810.mp4" + }, + { + "episode_id": 32774, + "source_index": 32774, + "raw_length": 26, + "instruction": "move pear to towel", + "canonical_instruction": "move pear to towel", + "parquet": "data/chunk-032/episode_032774.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032774.mp4" + }, + { + "episode_id": 21596, + "source_index": 21596, + "raw_length": 26, + "instruction": "put potato on plate", + "canonical_instruction": "put potato on plate", + "parquet": "data/chunk-021/episode_021596.parquet", + "video": "videos/chunk-021/observation.images.image_0/episode_021596.mp4" + }, + { + "episode_id": 6636, + "source_index": 6636, + "raw_length": 36, + "instruction": "Place the silver pot on the right back of the table.", + "canonical_instruction": "place the silver pot on the right back of the table", + "parquet": "data/chunk-006/episode_006636.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006636.mp4" + }, + { + "episode_id": 10525, + "source_index": 10525, + "raw_length": 22, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-010/episode_010525.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010525.mp4" + }, + { + "episode_id": 19700, + "source_index": 19700, + "raw_length": 56, + "instruction": "Take the yellow brush and put inside the cooking pot", + "canonical_instruction": "take the yellow brush and put inside the cooking pot", + "parquet": "data/chunk-019/episode_019700.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019700.mp4" + }, + { + "episode_id": 9523, + "source_index": 9523, + "raw_length": 42, + "instruction": "put the yellow cube on top of the arch", + "canonical_instruction": "put the yellow cube on top of the arch", + "parquet": "data/chunk-009/episode_009523.parquet", + "video": "videos/chunk-009/observation.images.image_0/episode_009523.mp4" + }, + { + "episode_id": 26331, + "source_index": 26331, + "raw_length": 33, + "instruction": "move the cloth to the upper left", + "canonical_instruction": "move the cloth to the upper left", + "parquet": "data/chunk-026/episode_026331.parquet", + "video": "videos/chunk-026/observation.images.image_0/episode_026331.mp4" + }, + { + "episode_id": 5301, + "source_index": 5301, + "raw_length": 46, + "instruction": "take the red spoon and move it to the upper right side of the stove", + "canonical_instruction": "take the red spoon and move it to the upper right side of the stove", + "parquet": "data/chunk-005/episode_005301.parquet", + "video": "videos/chunk-005/observation.images.image_0/episode_005301.mp4" + }, + { + "episode_id": 19352, + "source_index": 19352, + "raw_length": 36, + "instruction": "put the black object into the silver pot", + "canonical_instruction": "put the black object into the silver pot", + "parquet": "data/chunk-019/episode_019352.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019352.mp4" + }, + { + "episode_id": 41848, + "source_index": 41848, + "raw_length": 36, + "instruction": "topple metal pot cardboard fence", + "canonical_instruction": "topple metal pot cardboard fence", + "parquet": "data/chunk-041/episode_041848.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041848.mp4" + }, + { + "episode_id": 51676, + "source_index": 51676, + "raw_length": 24, + "instruction": "move silver pot on top of orange cloth", + "canonical_instruction": "move silver pot on top of orange cloth", + "parquet": "data/chunk-051/episode_051676.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051676.mp4" + }, + { + "episode_id": 8877, + "source_index": 8877, + "raw_length": 36, + "instruction": "Place the knife between the pickle and colander", + "canonical_instruction": "place the knife between the pickle and colander", + "parquet": "data/chunk-008/episode_008877.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008877.mp4" + }, + { + "episode_id": 8261, + "source_index": 8261, + "raw_length": 35, + "instruction": "fold the cloth from the bottom to the top", + "canonical_instruction": "fold the cloth from the bottom to the top", + "parquet": "data/chunk-008/episode_008261.parquet", + "video": "videos/chunk-008/observation.images.image_0/episode_008261.mp4" + }, + { + "episode_id": 45555, + "source_index": 45555, + "raw_length": 73, + "instruction": "sweep into pile", + "canonical_instruction": "sweep into pile", + "parquet": "data/chunk-045/episode_045555.parquet", + "video": "videos/chunk-045/observation.images.image_0/episode_045555.mp4" + }, + { + "episode_id": 22900, + "source_index": 22900, + "raw_length": 24, + "instruction": "take bowl off plate cardboard fence", + "canonical_instruction": "take bowl off plate cardboard fence", + "parquet": "data/chunk-022/episode_022900.parquet", + "video": "videos/chunk-022/observation.images.image_0/episode_022900.mp4" + }, + { + "episode_id": 10760, + "source_index": 10760, + "raw_length": 35, + "instruction": "Move the spoon between the microwave and towel", + "canonical_instruction": "move the spoon between the microwave and towel", + "parquet": "data/chunk-010/episode_010760.parquet", + "video": "videos/chunk-010/observation.images.image_0/episode_010760.mp4" + }, + { + "episode_id": 30075, + "source_index": 30075, + "raw_length": 46, + "instruction": "Move the spoon below the pot with the eggplant", + "canonical_instruction": "move the spoon below the pot with the eggplant", + "parquet": "data/chunk-030/episode_030075.parquet", + "video": "videos/chunk-030/observation.images.image_0/episode_030075.mp4" + }, + { + "episode_id": 28799, + "source_index": 28799, + "raw_length": 21, + "instruction": "flip cup upright", + "canonical_instruction": "flip cup upright", + "parquet": "data/chunk-028/episode_028799.parquet", + "video": "videos/chunk-028/observation.images.image_0/episode_028799.mp4" + }, + { + "episode_id": 18912, + "source_index": 18912, + "raw_length": 36, + "instruction": "right pepper shaker", + "canonical_instruction": "right pepper shaker", + "parquet": "data/chunk-018/episode_018912.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018912.mp4" + }, + { + "episode_id": 51188, + "source_index": 51188, + "raw_length": 42, + "instruction": "moved the silver pot in the upper right side of the table", + "canonical_instruction": "moved the silver pot in the upper right side of the table", + "parquet": "data/chunk-051/episode_051188.parquet", + "video": "videos/chunk-051/observation.images.image_0/episode_051188.mp4" + }, + { + "episode_id": 40536, + "source_index": 40536, + "raw_length": 20, + "instruction": "close fridge", + "canonical_instruction": "close fridge", + "parquet": "data/chunk-040/episode_040536.parquet", + "video": "videos/chunk-040/observation.images.image_0/episode_040536.mp4" + }, + { + "episode_id": 47660, + "source_index": 47660, + "raw_length": 21, + "instruction": "put pear in bowl", + "canonical_instruction": "put pear in bowl", + "parquet": "data/chunk-047/episode_047660.parquet", + "video": "videos/chunk-047/observation.images.image_0/episode_047660.mp4" + }, + { + "episode_id": 18452, + "source_index": 18452, + "raw_length": 30, + "instruction": "Move the yellow cloth in front of the pot", + "canonical_instruction": "move the yellow cloth in front of the pot", + "parquet": "data/chunk-018/episode_018452.parquet", + "video": "videos/chunk-018/observation.images.image_0/episode_018452.mp4" + }, + { + "episode_id": 27670, + "source_index": 27670, + "raw_length": 25, + "instruction": "put sushi on plate", + "canonical_instruction": "put sushi on plate", + "parquet": "data/chunk-027/episode_027670.parquet", + "video": "videos/chunk-027/observation.images.image_0/episode_027670.mp4" + }, + { + "episode_id": 3889, + "source_index": 3889, + "raw_length": 53, + "instruction": "transfer the orange pot to the lower right burner", + "canonical_instruction": "transfer the orange pot to the lower right burner", + "parquet": "data/chunk-003/episode_003889.parquet", + "video": "videos/chunk-003/observation.images.image_0/episode_003889.mp4" + }, + { + "episode_id": 37090, + "source_index": 37090, + "raw_length": 34, + "instruction": "put the sushi below the right burner", + "canonical_instruction": "put the sushi below the right burner", + "parquet": "data/chunk-037/episode_037090.parquet", + "video": "videos/chunk-037/observation.images.image_0/episode_037090.mp4" + }, + { + "episode_id": 36086, + "source_index": 36086, + "raw_length": 37, + "instruction": "move the blue spoon to the bottom left of the stove", + "canonical_instruction": "move the blue spoon to the bottom left of the stove", + "parquet": "data/chunk-036/episode_036086.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036086.mp4" + }, + { + "episode_id": 44204, + "source_index": 44204, + "raw_length": 28, + "instruction": "Place the spoon above the napkin.", + "canonical_instruction": "place the spoon above the napkin", + "parquet": "data/chunk-044/episode_044204.parquet", + "video": "videos/chunk-044/observation.images.image_0/episode_044204.mp4" + }, + { + "episode_id": 36818, + "source_index": 36818, + "raw_length": 36, + "instruction": "take the orange thing inside the drawer", + "canonical_instruction": "take the orange thing inside the drawer", + "parquet": "data/chunk-036/episode_036818.parquet", + "video": "videos/chunk-036/observation.images.image_0/episode_036818.mp4" + }, + { + "episode_id": 19106, + "source_index": 19106, + "raw_length": 37, + "instruction": "unfold the cloth from the top right to the bottom left", + "canonical_instruction": "unfold the cloth from the top right to the bottom left", + "parquet": "data/chunk-019/episode_019106.parquet", + "video": "videos/chunk-019/observation.images.image_0/episode_019106.mp4" + }, + { + "episode_id": 6021, + "source_index": 6021, + "raw_length": 42, + "instruction": "fold the cloth from to top left to right", + "canonical_instruction": "fold the cloth from to top left to right", + "parquet": "data/chunk-006/episode_006021.parquet", + "video": "videos/chunk-006/observation.images.image_0/episode_006021.mp4" + }, + { + "episode_id": 32823, + "source_index": 32823, + "raw_length": 37, + "instruction": "move the yellow box to the white box on the top center", + "canonical_instruction": "move the yellow box to the white box on the top center", + "parquet": "data/chunk-032/episode_032823.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032823.mp4" + }, + { + "episode_id": 32506, + "source_index": 32506, + "raw_length": 31, + "instruction": "take sushi out of pot cardboard fence", + "canonical_instruction": "take sushi out of pot cardboard fence", + "parquet": "data/chunk-032/episode_032506.parquet", + "video": "videos/chunk-032/observation.images.image_0/episode_032506.mp4" + }, + { + "episode_id": 25760, + "source_index": 25760, + "raw_length": 34, + "instruction": "move the yellow knife to the left side of the table", + "canonical_instruction": "move the yellow knife to the left side of the table", + "parquet": "data/chunk-025/episode_025760.parquet", + "video": "videos/chunk-025/observation.images.image_0/episode_025760.mp4" + }, + { + "episode_id": 2611, + "source_index": 2611, + "raw_length": 21, + "instruction": "pick up pot", + "canonical_instruction": "pick up pot", + "parquet": "data/chunk-002/episode_002611.parquet", + "video": "videos/chunk-002/observation.images.image_0/episode_002611.mp4" + }, + { + "episode_id": 41851, + "source_index": 41851, + "raw_length": 46, + "instruction": "move the arch on top of the blocks", + "canonical_instruction": "move the arch on top of the blocks", + "parquet": "data/chunk-041/episode_041851.parquet", + "video": "videos/chunk-041/observation.images.image_0/episode_041851.mp4" + }, + { + "episode_id": 42185, + "source_index": 42185, + "raw_length": 44, + "instruction": "put the blue brush on top of the yellow cloth", + "canonical_instruction": "put the blue brush on top of the yellow cloth", + "parquet": "data/chunk-042/episode_042185.parquet", + "video": "videos/chunk-042/observation.images.image_0/episode_042185.mp4" + }, + { + "episode_id": 31940, + "source_index": 31940, + "raw_length": 43, + "instruction": "Place the green spatula behind the pot", + "canonical_instruction": "place the green spatula behind the pot", + "parquet": "data/chunk-031/episode_031940.parquet", + "video": "videos/chunk-031/observation.images.image_0/episode_031940.mp4" + }, + { + "episode_id": 43456, + "source_index": 43456, + "raw_length": 26, + "instruction": "take the blue spoon and put it on the upper left of the burner", + "canonical_instruction": "take the blue spoon and put it on the upper left of the burner", + "parquet": "data/chunk-043/episode_043456.parquet", + "video": "videos/chunk-043/observation.images.image_0/episode_043456.mp4" + }, + { + "episode_id": 12180, + "source_index": 12180, + "raw_length": 76, + "instruction": "put potato on plate and blueberry in pot or pan on stove", + "canonical_instruction": "put potato on plate and blueberry in pot or pan on stove", + "parquet": "data/chunk-012/episode_012180.parquet", + "video": "videos/chunk-012/observation.images.image_0/episode_012180.mp4" + }, + { + "episode_id": 721, + "source_index": 721, + "raw_length": 43, + "instruction": "move the silver lid to the lower left side of the table", + "canonical_instruction": "move the silver lid to the lower left side of the table", + "parquet": "data/chunk-000/episode_000721.parquet", + "video": "videos/chunk-000/observation.images.image_0/episode_000721.mp4" + } + ] +} diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000000.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000000.pt new file mode 100644 index 0000000000000000000000000000000000000000..88e2d67e634978fa0cba620cfa0cc746492cefce --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:687f0f703de49225386a7342f1bbee5e66da31c5cf9906f4a6e50ec5374f6698 +size 126637 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000050.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000050.pt new file mode 100644 index 0000000000000000000000000000000000000000..afffd9abea1701371418f260998c65f87357b78a --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000050.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee07951c28c6101fe6d14fb9854e551e49d8457593c1f0f7b16550d3b955f7a7 +size 126829 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000100.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000100.pt new file mode 100644 index 0000000000000000000000000000000000000000..4e2a02814d87f1dfc4b1b44f0dc5f30a2680aa63 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000100.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5001b163ae8c9bb33b8bce45a9b27db5b26d0277f8c435a64cd3b4e13206f57 +size 126189 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000150.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000150.pt new file mode 100644 index 0000000000000000000000000000000000000000..959c56e166931aefb25debf2a8ce3565f5ee1764 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000150.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a381f47c85508208b298762eb25fb9e537fd181b5626db21224f1c20d888156 +size 125805 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000200.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000200.pt new file mode 100644 index 0000000000000000000000000000000000000000..759efefa2119064f745ce99a38cb97f39bad3cd3 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000200.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cfc3f5f4ff7a027f4801b107ee8fad21c2ab2ca9e9732dc2e85f42244d7deac +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000250.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000250.pt new file mode 100644 index 0000000000000000000000000000000000000000..8269924344b27cb49b606802d9d57ee454dd5b66 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000250.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aafdfb041bd3845ad4b9785fd0cfa2ab2ac55ae687d22b75ae1f5ff6e38d4162 +size 126701 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000300.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000300.pt new file mode 100644 index 0000000000000000000000000000000000000000..c3584c2aabba9d893eed76ab452a76c640501602 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000300.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bcccf92e8dea201d90aecfe3f124bd3f5c8fced0ae7fa3183eb33f07f861863 +size 126125 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000350.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000350.pt new file mode 100644 index 0000000000000000000000000000000000000000..c0cc4faeedc95a62877c97bde6e2f76c2d04c4d7 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000350.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:249b7bf225f538b6ee5d17c5e22d0076243a1cdb9528b4f285fb88c0c515d7b3 +size 126701 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000400.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000400.pt new file mode 100644 index 0000000000000000000000000000000000000000..90bd8e30c0f963ccc83d86d17bf2fd6bde91f5e8 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000400.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d3975d1e7c388bc6a91d1d86d84dbe5d872b9a4ba8231e48195c4c9e709100d +size 126253 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000450.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000450.pt new file mode 100644 index 0000000000000000000000000000000000000000..0c7b9748dba774e93915b507d1f76ec58502c7a3 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000450.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed97fe5178f959a1eeaad943b391592ca4983161190775f7d27bbeb59a2c84b0 +size 126317 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000500.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000500.pt new file mode 100644 index 0000000000000000000000000000000000000000..f35a3684a876e96713f844ce03b7228f7274b7b4 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000500.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43ad9db1685e08dc3a76767dcbb1a6a07982adb89ab57f54e4d72013bd68c6ab +size 126253 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000550.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000550.pt new file mode 100644 index 0000000000000000000000000000000000000000..99efb585a7b2ece45af09cff9135cd2616d716bb --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000550.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a674b01436293b3643c6e3a0024cc28dbf4dacdad620816174f491f87745e4a5 +size 126829 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000600.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000600.pt new file mode 100644 index 0000000000000000000000000000000000000000..d50ab3be2f40f45606d9f1aa22c2c10c89d643c1 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000600.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8e6b2bbce6526e7c6f05ed9751ea683ac5f6b252980161ede8c7fd67cab3281 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000650.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000650.pt new file mode 100644 index 0000000000000000000000000000000000000000..4d15c7b993c73abcf95718ccd6a2b2c13e0694a0 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000650.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c2444152facc486535e267cbbfe8fba81f8f196c3d0ae046e0e1a439b92421 +size 126957 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000700.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000700.pt new file mode 100644 index 0000000000000000000000000000000000000000..6e6cae97e9a17fd46d56efdb5157f83b0548d732 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000700.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36d86f7c1db1a86ffbd5c92ce4b23b3efa2faeb094f8b66840bb186732583f29 +size 126381 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000750.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000750.pt new file mode 100644 index 0000000000000000000000000000000000000000..63eef3c41ed3212b0ba2b5023b9c02b2d8fe671d --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000750.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b96b9af83ca1e0815d18e8761127066785ac893350ed0888bf8f94a8ad095dbe +size 126381 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000800.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000800.pt new file mode 100644 index 0000000000000000000000000000000000000000..efb97f062c36ab9ee20ea14c1df8127c95d53c8e --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000800.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc0b8199dab94980f54f4c487eca8df16e73ebba942ae1bf86039e798b92f70e +size 126893 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000850.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000850.pt new file mode 100644 index 0000000000000000000000000000000000000000..5b2fe149dc8fbeaebbc33f1208290e9b8bd4ff20 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000850.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:debf9423acf800b44ad1d8eb691c6ed756d7e7fa4eb9d0f0adca6265c408fdc4 +size 126637 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000900.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000900.pt new file mode 100644 index 0000000000000000000000000000000000000000..42d568fec183a7b503d4ff4c8a977be6f10f8100 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000900.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f35a1eba5a1980ab19cf570ff386c6519d9b64ec5fa988560bb8d9aef0e4055a +size 126765 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000950.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000950.pt new file mode 100644 index 0000000000000000000000000000000000000000..b046759002db66abc2bd53fdb0a1747ab9bb3a26 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_000950.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f854bf56fdd8636470cf7a7040246caea57921fea33c3ea0c995cfa20c17e3d +size 126445 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001000.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001000.pt new file mode 100644 index 0000000000000000000000000000000000000000..dc06f7e6859d2281e3d8f66e3abd79462a223005 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6901357cbaeafb645bff1d170468d1f4a632f1782a7550a9d2c29515128b34c9 +size 126829 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001050.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001050.pt new file mode 100644 index 0000000000000000000000000000000000000000..24498b63c5712bfc609f71fc11d3fad62eb78e8b --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001050.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3162df69773a3eb928a24bb62f516e296d0d100a92691e953b4cbc6e7ea0b8fe +size 126765 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001100.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001100.pt new file mode 100644 index 0000000000000000000000000000000000000000..ca1a6dca1d24e0f814bf59bb52490c22002d4243 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001100.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eaf96a023be389c31f8470df8230e3df7e5245d67af17ca17113389d2703b1f +size 126637 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001150.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001150.pt new file mode 100644 index 0000000000000000000000000000000000000000..8da0e85c692fd24af34d5c5ebd4bd56b8b701442 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001150.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fcf41048f3b11dc5ec4647feeb5309fd6f9d9f873ba0e0feef30453d7dfc6ba +size 126189 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001200.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001200.pt new file mode 100644 index 0000000000000000000000000000000000000000..a4d6003291afcbbe6c806e971dc34e8de27e67ac --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001200.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b32e74d3fd3cb5147eb7957b39b37214c9a47f38d078de86ed70fcd4958408b +size 126701 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001250.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001250.pt new file mode 100644 index 0000000000000000000000000000000000000000..0bb1a1e0a493855cfbece02e041637ff2a49fdc3 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001250.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f47c223981f62374e562606b6b0c7442fd0ac8faf7f32787ae118548ba1cf16 +size 126765 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001300.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001300.pt new file mode 100644 index 0000000000000000000000000000000000000000..4c8e765919508255cfc2a891fe5f7750145c2cc4 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001300.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38319a01cb0fcdcd4c400e1f05fea3702b8dae39f55b07c8959639e24b648423 +size 126829 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001350.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001350.pt new file mode 100644 index 0000000000000000000000000000000000000000..3f3bbd68fc82fe177d59c7abce1b7cd3d8644e53 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001350.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9f772c37695df35a4ce77c370d9c3e101daa60551bd20f0d55460f42c468c6b +size 126573 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001400.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001400.pt new file mode 100644 index 0000000000000000000000000000000000000000..be24df6f9662d6ba93a3b4c93fbd86402ba7e55b --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001400.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e0081b97e04a3f3e3060f2947ba257043777ddbc891aae25dcf71ac3bb848ba +size 126573 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001450.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001450.pt new file mode 100644 index 0000000000000000000000000000000000000000..14ed5f7eb958b162649bccec0b496122698d5e01 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001450.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4f0e9d46bcbeda12fd16029d1dc5af7741ebbecfdc82805ec8197a84f044ef4 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001500.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001500.pt new file mode 100644 index 0000000000000000000000000000000000000000..4057a650e75bc74d7687f8a649b39e9f2598bfe8 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001500.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:082eca4121c95e9867c04502c8b0b5be4cba77ab0436cb15988ae57a4e1ea559 +size 126893 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001550.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001550.pt new file mode 100644 index 0000000000000000000000000000000000000000..88876209d7f82b3d69c200eadc7fc8276177700c --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001550.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4302769aab26c3ad44e877f213b5b565958cf9620590616136e2a92a06e8e32 +size 126445 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001600.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001600.pt new file mode 100644 index 0000000000000000000000000000000000000000..3b46ac58c07d553b68ae7f6de42060f473159836 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001600.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac473f6484fd1c08f50afc317f76aee9f5e469dabfa6298bddaab61c659e129c +size 126637 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001650.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001650.pt new file mode 100644 index 0000000000000000000000000000000000000000..4e1b577a95ce1a466e8610ffb140969e7a4b028f --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001650.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b0c17109a6772d9015c9b240581347ac7ee9197abe4366902ee5bce9be6dc8a +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001700.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001700.pt new file mode 100644 index 0000000000000000000000000000000000000000..65b58b42bfba12290561c850a62bc6ae8c633276 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001700.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:170e99833fa50abadddfa59b04cc5e9c0df8b1c43a69a7d2cb15e7331567fa64 +size 126829 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001750.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001750.pt new file mode 100644 index 0000000000000000000000000000000000000000..f5ab9d5406d8bc294997c88961a44f4aa2976798 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001750.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68b08663cf35280603d3053ca66ab1740a9a5dacf645998792e0a0c4d8cfd984 +size 126381 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001800.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001800.pt new file mode 100644 index 0000000000000000000000000000000000000000..b04ce9a312425ef0860d5dbdbeefdebfc99a18f3 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001800.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68c02663c4d4de4f263a88b7257769b8e6f465811e96a52196580279787c4884 +size 126573 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001850.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001850.pt new file mode 100644 index 0000000000000000000000000000000000000000..2e473f4430c3b40e6720442f22136a0e805eaa5f --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001850.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9050b76ca81d8f7295382ebefa72cc11229b333919f947c9442f6f5b521c93c0 +size 126125 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001900.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001900.pt new file mode 100644 index 0000000000000000000000000000000000000000..2c8decf18ab530a9706f3410b9870c725cda6bb2 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001900.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32581354a76de4c9dd835ae408bd21ef3011af6eec5775b1623f66ff2e8831ec +size 126445 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001950.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001950.pt new file mode 100644 index 0000000000000000000000000000000000000000..8432314acb29f9ce2ae43d891a1303de9bdd4af1 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_001950.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0aa856841af0cedbbff3d18b697302eb7b82c20adbad86e6af2bbe342c098837 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002000.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9d84dc99d2d28d84e7076ec64752bfe00bc9c7ac --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef4ed15000f7505c367881e7dda7f08e1ec1b613444f1c356f30b071cf131e90 +size 126765 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002050.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002050.pt new file mode 100644 index 0000000000000000000000000000000000000000..4a9b454deb04438703c047ca99dd71ba58deb21b --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002050.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11dbf5ce3a51a17314384f9f0869fb1c8bfe6b47f6331cb6b114e962c6327dc5 +size 126189 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002100.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002100.pt new file mode 100644 index 0000000000000000000000000000000000000000..bd09133ee572a89e6f46d21257eebd9179aa6c42 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002100.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09116752289e27ebfc43c9ccaf0ccc7525a61726ebd3654bc88a82d702d59b33 +size 126701 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002150.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002150.pt new file mode 100644 index 0000000000000000000000000000000000000000..79de7395d245a2a2f5e6a6c853a7f170e88023e0 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002150.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a923ca0be5ede6fde4bd66fe9ae747e0a66d79ce29544aaca982c5fab8b3bd6 +size 125997 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002200.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002200.pt new file mode 100644 index 0000000000000000000000000000000000000000..386594676c3fe16aa1769af205dd80c83212b6f4 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002200.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e82e4acedfd5e726d89ba6b6b76afc0d6740a7c4e9ae11216d64e77294a1ca67 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002250.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002250.pt new file mode 100644 index 0000000000000000000000000000000000000000..fd611a37cdfd7e79665eb7e14c6c81d8c18947f8 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002250.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5c1d6ce4a49195a9d220103fbd4644445f78ee77e83bd124e18318f3cb33c15 +size 126445 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002300.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002300.pt new file mode 100644 index 0000000000000000000000000000000000000000..80b28037049ed9c49f3cafb4b9d2a4a61c82c58d --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002300.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3027f36fbd35995b08caa0ca4b96a7b05a66610ca93437a22b072934142a485a +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002350.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002350.pt new file mode 100644 index 0000000000000000000000000000000000000000..d8d52299608a5c1e5da9ba58adf0de2f5f379f37 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002350.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b1ced0c140023ae88974c5db04fa143cc1d74b8eb9884aa13daac113c6805d0 +size 126637 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002400.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002400.pt new file mode 100644 index 0000000000000000000000000000000000000000..14bdf8ba98cb6dda898dff608cb62af9e8275b1e --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002400.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebc866ba989c9b04814720b6fe561d1e03d0ccf67bc86890ad6405dc1110d008 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002450.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002450.pt new file mode 100644 index 0000000000000000000000000000000000000000..ceff9372b2ab808b9052a8a12983cb5a43899b14 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002450.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7d28fafecefd9617a42cf4e9112f091194216ca8c424b2f4cc4f0c30cc07960 +size 126573 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002500.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002500.pt new file mode 100644 index 0000000000000000000000000000000000000000..d9b459a67f921dd9f1a0d6444460caf51b9e891e --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002500.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2568074c7adcb383b624e0462ac52db80ea9cd3b4cf43ca9253eb3f4d4cae2e4 +size 126253 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002550.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002550.pt new file mode 100644 index 0000000000000000000000000000000000000000..8998ff47603b2bdff5bdb5c0caea047a03150d48 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002550.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59036fab565492c7c96bc169eebd2a3c02564e08e6ce961f4af6446a1c91bcc8 +size 126573 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002600.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002600.pt new file mode 100644 index 0000000000000000000000000000000000000000..53b4a8c22b78372ce97f307ad01d3cdc8b3d27d3 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002600.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d9a94dcd820ec432522c8c3d0bccfb4725a0c7aaabe6a46f3df2a610fa149ee +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002650.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002650.pt new file mode 100644 index 0000000000000000000000000000000000000000..76dfb6dc87816b7214b0b3c9f83fd32c716c6e12 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002650.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:877cafcbe56d11d55de7fc32d58bc71c39412021aab000d95942d9e4e8967e43 +size 126765 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002700.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002700.pt new file mode 100644 index 0000000000000000000000000000000000000000..593a935811fcb1fdd3a8d1a791011ac158011cb1 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002700.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b1236d196d3ac9ad19161352260ced85cfdce4b1c2c83db84293969b7019d59 +size 126701 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002750.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002750.pt new file mode 100644 index 0000000000000000000000000000000000000000..8e3f4600d6c4765e9926d86e6107094afbb17f56 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002750.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79f9bcaeaea610b3abaaffda4140d3da1782e001319d25507e2d5e5d8e0bd6c4 +size 126765 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002800.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002800.pt new file mode 100644 index 0000000000000000000000000000000000000000..992b90063e9a9a827b87f744b6bf5654d875f0bc --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002800.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50212355947ff3864108921574ff730eebd55dc9c4f6397c7ab31667356675d3 +size 126125 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002850.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002850.pt new file mode 100644 index 0000000000000000000000000000000000000000..50a5163b3c5171a7f17d807ba62b61babcb8d6d5 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002850.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcd64ba27ef20a89e2ca840cd9520dcb61b4faf004fc08d5dc40c8ad6956aa78 +size 126701 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002900.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002900.pt new file mode 100644 index 0000000000000000000000000000000000000000..81c992e67ebee1c8650d1ae6fbe9aa0fcabefe69 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002900.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1874723b4a8bddbc63a7868b22d2994f9195432ffa1d7e6251e0130f86ce666 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002950.pt b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002950.pt new file mode 100644 index 0000000000000000000000000000000000000000..b0d6f9587881590a51346b6842d795030be193f6 --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/shards/part_002950.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1c43c707273527fa9021a9c35f5cd6cc7aaa664675b782186c4dca8824bcc60 +size 126509 diff --git a/releases/bridge-native-v3/memory/static_bank_3000/static_bank.pt b/releases/bridge-native-v3/memory/static_bank_3000/static_bank.pt new file mode 100644 index 0000000000000000000000000000000000000000..b73c451ccfb25bde1e417a12d9f65043653941ab --- /dev/null +++ b/releases/bridge-native-v3/memory/static_bank_3000/static_bank.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd248a1df2a908e3f16a6a6df66c50ad691514a011edb4c4704493c2e5799ffb +size 7557265 diff --git a/releases/bridge-native-v3/validation/implementation_validation.json b/releases/bridge-native-v3/validation/implementation_validation.json new file mode 100644 index 0000000000000000000000000000000000000000..0e9fb670a5280972c161356b2985ec07e6e85c4f --- /dev/null +++ b/releases/bridge-native-v3/validation/implementation_validation.json @@ -0,0 +1,51 @@ +{ + "implementation": "IMPLEMENTED_GPU_VALIDATION_NOT_RUN", + "cpu_regression_tests": { + "count": 17, + "status": "PASS" + }, + "cpu_distributed": { + "ranks": 2, + "status": "PASS", + "checks": [ + "non_domain7_BF16_and_master_exact", + "atomic_sharded_checkpoint", + "exact_restore", + "consumed_cursor" + ] + }, + "original_nano_meta_graph": { + "tensors": 1200, + "missing_original_tensors": [], + "generation_parameters": 6965486784, + "action_table_parameters": 16910336, + "bridge_parameters": 2628865 + }, + "real_ipec_window": { + "status": "PASS", + "pilot_train": 32, + "development": 8, + "support": 3000, + "continuous_candidates": 49119 + }, + "full_gpu_forward_backward": "NOT_RUN", + "controller_acceptance": "NOT_RUN", + "gate_50": "NOT_RUN", + "gate_500": "NOT_RUN", + "continuous": "NOT_RUN", + "source_files": { + "scripts/native_stage2/__init__.py": "e298e61dc925a4e8a3404d78ad4fc712891a41559000ca0540cf0b9b05d3a813", + "scripts/native_stage2/base.py": "083ef62e17c7f38b9fb4c169d9082c284842b6a5414cb786d4c032215f9ffd72", + "scripts/native_stage2/checkpoint.py": "437efb9d3c1c2185b24f20c907a09079c942fce591d6081fa099ff0c9c6e32f3", + "scripts/native_stage2/common.py": "3ed7362d12733207b4b96a76f104f90200d17694da793b1b0533f0ad3df5efc3", + "scripts/native_stage2/data.py": "9f9b6fe279b6dc55519114ffee7d434b5e8053b0d53e5be5d3430e6d44205cc4", + "scripts/native_stage2/evaluate.py": "b760548cdd457b39d99782552a6e11ce4a719305c1e809e47ac188fdf1769dd7", + "scripts/native_stage2/memory.py": "a3054a7defb760e1433ba6c4a5d39d7be31a479d6678343dc985782ee0f083d1", + "scripts/native_stage2/model.py": "cc385acb73419f8c2b6dfd060af073d6faec50fc5b08eabc129a447ced855697", + "scripts/native_stage2/online.py": "1e766b9ddbfe3d08904a4a2ac6a9319edf4193974f9c2f1c500140e532808718", + "scripts/native_stage2/optim.py": "15d0416113867ce8b376cf0373dfabb135abfac35cfde023b0bc95dd2dff4182", + "scripts/native_stage2/train.py": "7211ed654a885374b850c70ce46ac1694b6dbd94fa7963e7d04827079e19a537", + "scripts/run_bridge_stage2_native.py": "7bbca7fa269b55f51636b21fe96fc20c7408c69b58163b6bee4e69ded7ef7dd5" + }, + "release_note": "Training runner default bundle updated from v2 to v3; training implementation unchanged." +}