From cf38c1d6046dfe5a723156472e6bbd437ed32f0e Mon Sep 17 00:00:00 2001 From: Jeremy Tuloup Date: Mon, 15 Jan 2024 11:37:00 +0100 Subject: [PATCH] Add extension to interact with a host page via `postMessage` (#10) * bootstrap extension * move demo * Readme * dev setup * Clean up example notebooks * more action examples * Install the extension * fix installing the extension * fix links * fix artifact --- .copier-answers.yml | 19 + .github/workflows/build.yml | 88 + .github/workflows/check-release.yml | 26 + .github/workflows/deploy.yml | 12 +- .github/workflows/enforce-label.yml | 13 + .github/workflows/prep-release.yml | 41 + .github/workflows/publish-release.yml | 57 + .gitignore | 12 + .prettierignore | 6 + .yarnrc.yml | 1 + CHANGELOG.md | 5 + LICENSE | 29 + README.md | 61 +- RELEASE.md | 111 + content/javascript.ipynb | 86 - content/p5.ipynb | 150 - content/pyodide/altair.ipynb | 231 - content/pyodide/folium.ipynb | 154 - content/pyodide/interactive-widgets.ipynb | 268 - content/pyodide/ipycanvas.ipynb | 178 - content/pyodide/ipyleaflet.ipynb | 259 - content/pyodide/matplotlib.ipynb | 113 - content/pyodide/plotly.ipynb | 158 - content/pyodide/pyb2d/0_tutorial.ipynb | 649 -- content/pyodide/pyb2d/color_mixing.ipynb | 123 - .../pyodide/pyb2d/games/angry_shapes.ipynb | 419 -- content/pyodide/pyb2d/games/billiard.ipynb | 299 - content/pyodide/pyb2d/games/goo.ipynb | 575 -- content/pyodide/pyb2d/games/rocket.ipynb | 282 - content/pyodide/pyb2d/gauss_machine.ipynb | 128 - content/pyodide/pyb2d/newtons_cradle.ipynb | 130 - content/pyodide/renderers.ipynb | 1 - content/python.ipynb | 721 -- content/xeus-lua/canvas.ipynb | 29 - content/xeus-lua/game-of-life.ipynb | 92 - content/xeus-lua/widgets.ipynb | 632 -- .../content}/data/Museums_in_DC.geojson | 0 {content => demo/content}/data/bar.vl.json | 0 .../content}/data/fasta-example.fasta | 0 {content => demo/content}/data/iris.csv | 0 {content => demo/content}/data/matplotlib.png | Bin demo/content/intro.ipynb | 146 + .../content/sqlite-intro.ipynb | 0 demo/index.html | 52 + overrides.json => demo/overrides.json | 0 demo/repl/jupyter-lite.json | 10 + requirements.txt => demo/requirements.txt | 12 +- install.json | 5 + jupyterlite_capytale/__init__.py | 16 + package.json | 187 + pyproject.toml | 77 + repl/jupyter-lite.json | 11 - setup.py | 1 + src/index.ts | 84 + style/base.css | 5 + style/index.css | 1 + style/index.js | 1 + tsconfig.json | 23 + yarn.lock | 6247 +++++++++++++++++ 59 files changed, 7328 insertions(+), 5708 deletions(-) create mode 100644 .copier-answers.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/check-release.yml create mode 100644 .github/workflows/enforce-label.yml create mode 100644 .github/workflows/prep-release.yml create mode 100644 .github/workflows/publish-release.yml create mode 100644 .prettierignore create mode 100644 .yarnrc.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 RELEASE.md delete mode 100644 content/javascript.ipynb delete mode 100644 content/p5.ipynb delete mode 100644 content/pyodide/altair.ipynb delete mode 100644 content/pyodide/folium.ipynb delete mode 100644 content/pyodide/interactive-widgets.ipynb delete mode 100644 content/pyodide/ipycanvas.ipynb delete mode 100644 content/pyodide/ipyleaflet.ipynb delete mode 100644 content/pyodide/matplotlib.ipynb delete mode 100644 content/pyodide/plotly.ipynb delete mode 100644 content/pyodide/pyb2d/0_tutorial.ipynb delete mode 100644 content/pyodide/pyb2d/color_mixing.ipynb delete mode 100644 content/pyodide/pyb2d/games/angry_shapes.ipynb delete mode 100644 content/pyodide/pyb2d/games/billiard.ipynb delete mode 100644 content/pyodide/pyb2d/games/goo.ipynb delete mode 100644 content/pyodide/pyb2d/games/rocket.ipynb delete mode 100644 content/pyodide/pyb2d/gauss_machine.ipynb delete mode 100644 content/pyodide/pyb2d/newtons_cradle.ipynb delete mode 100644 content/pyodide/renderers.ipynb delete mode 100644 content/python.ipynb delete mode 100644 content/xeus-lua/canvas.ipynb delete mode 100644 content/xeus-lua/game-of-life.ipynb delete mode 100644 content/xeus-lua/widgets.ipynb rename {content => demo/content}/data/Museums_in_DC.geojson (100%) rename {content => demo/content}/data/bar.vl.json (100%) rename {content => demo/content}/data/fasta-example.fasta (100%) rename {content => demo/content}/data/iris.csv (100%) rename {content => demo/content}/data/matplotlib.png (100%) create mode 100644 demo/content/intro.ipynb rename content/xeus-sqlite/simple-operations.ipynb => demo/content/sqlite-intro.ipynb (100%) create mode 100644 demo/index.html rename overrides.json => demo/overrides.json (100%) create mode 100644 demo/repl/jupyter-lite.json rename requirements.txt => demo/requirements.txt (70%) create mode 100644 install.json create mode 100644 jupyterlite_capytale/__init__.py create mode 100644 package.json create mode 100644 pyproject.toml delete mode 100644 repl/jupyter-lite.json create mode 100644 setup.py create mode 100644 src/index.ts create mode 100644 style/base.css create mode 100644 style/index.css create mode 100644 style/index.js create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000..36b855c --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,19 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: v4.2.4 +_src_path: https://github.com/jupyterlab/extension-template +author_email: '' +author_name: Jeremy Tuloup +data_format: string +file_extension: '' +has_binder: false +has_settings: false +kind: frontend +labextension_name: jupyterlite-capytale +mimetype: '' +mimetype_name: '' +project_short_description: A JupyterLab extension to integrate with Capytale +python_name: jupyterlite_capytale +repository: https://github.com/QuantStack/jupyterlite-capytale +test: false +viewer_name: '' + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..9aa355a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,88 @@ +name: Build + +on: + push: + branches: main + pull_request: + branches: '*' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Base Setup + uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + + - name: Install dependencies + run: python -m pip install -U "jupyterlab>=4.0.0,<5" + + - name: Lint the extension + run: | + set -eux + jlpm + jlpm run lint:check + + - name: Build the extension + run: | + set -eux + python -m pip install .[test] + + jupyter labextension list + jupyter labextension list 2>&1 | grep -ie "jupyterlite-capytale.*OK" + python -m jupyterlab.browser_check + + - name: Package the extension + run: | + set -eux + + pip install build + python -m build + pip uninstall -y "jupyterlite_capytale" jupyterlab + + - name: Upload extension packages + uses: actions/upload-artifact@v3 + with: + name: extension-artifacts + path: dist/jupyterlite_capytale* + if-no-files-found: error + + test_isolated: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: '3.9' + architecture: 'x64' + - uses: actions/download-artifact@v3 + with: + name: extension-artifacts + - name: Install and Test + run: | + set -eux + # Remove NodeJS, twice to take care of system and locally installed node versions. + sudo rm -rf $(which node) + sudo rm -rf $(which node) + + pip install "jupyterlab>=4.0.0,<5" jupyterlite_capytale*.whl + + + jupyter labextension list + jupyter labextension list 2>&1 | grep -ie "jupyterlite-capytale.*OK" + python -m jupyterlab.browser_check --no-browser-test + + + check_links: + name: Check Links + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v3 + - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1 diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml new file mode 100644 index 0000000..b0e1b31 --- /dev/null +++ b/.github/workflows/check-release.yml @@ -0,0 +1,26 @@ +name: Check Release +on: + push: + branches: ["main"] + pull_request: + branches: ["*"] + +jobs: + check_release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Base Setup + uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - name: Check Release + uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2 + with: + + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Distributions + uses: actions/upload-artifact@v3 + with: + name: jupyterlite_capytale-releaser-dist-${{ github.run_number }} + path: .jupyter_releaser_checkout/dist diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 77fa9fe..8451dda 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,15 +20,19 @@ jobs: python-version: '3.10' - name: Install the dependencies run: | - python -m pip install -r requirements.txt + # install dependencies for the demo + python -m pip install -r demo/requirements.txt + + # install the extension + python -m pip install . - name: Build the JupyterLite site run: | - cp README.md content - jupyter lite build --contents content --output-dir dist + cp README.md demo/content + jlpm demo:build - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: - path: ./dist + path: ./demo deploy: needs: build diff --git a/.github/workflows/enforce-label.yml b/.github/workflows/enforce-label.yml new file mode 100644 index 0000000..725feab --- /dev/null +++ b/.github/workflows/enforce-label.yml @@ -0,0 +1,13 @@ +name: Enforce PR label + +on: + pull_request: + types: [labeled, unlabeled, opened, edited, synchronize] +jobs: + enforce-label: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: enforce-triage-label + uses: jupyterlab/maintainer-tools/.github/actions/enforce-label@v1 diff --git a/.github/workflows/prep-release.yml b/.github/workflows/prep-release.yml new file mode 100644 index 0000000..6f09281 --- /dev/null +++ b/.github/workflows/prep-release.yml @@ -0,0 +1,41 @@ +name: "Step 1: Prep Release" +on: + workflow_dispatch: + inputs: + version_spec: + description: "New Version Specifier" + default: "next" + required: false + branch: + description: "The branch to target" + required: false + post_version_spec: + description: "Post Version Specifier" + required: false + since: + description: "Use PRs with activity since this date or git reference" + required: false + since_last_stable: + description: "Use PRs with activity since the last stable git tag" + required: false + type: boolean +jobs: + prep_release: + runs-on: ubuntu-latest + steps: + - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + + - name: Prep Release + id: prep-release + uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2 + with: + token: ${{ secrets.ADMIN_GITHUB_TOKEN }} + version_spec: ${{ github.event.inputs.version_spec }} + post_version_spec: ${{ github.event.inputs.post_version_spec }} + branch: ${{ github.event.inputs.branch }} + since: ${{ github.event.inputs.since }} + since_last_stable: ${{ github.event.inputs.since_last_stable }} + + - name: "** Next Step **" + run: | + echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}" diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml new file mode 100644 index 0000000..cf6d905 --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,57 @@ +name: "Step 2: Publish Release" +on: + workflow_dispatch: + inputs: + branch: + description: "The target branch" + required: false + release_url: + description: "The URL of the draft GitHub release" + required: false + steps_to_skip: + description: "Comma separated list of steps to skip" + required: false + +jobs: + publish_release: + runs-on: ubuntu-latest + permissions: + # This is useful if you want to use PyPI trusted publisher + # and NPM provenance + id-token: write + steps: + - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + + - name: Populate Release + id: populate-release + uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2 + with: + token: ${{ secrets.ADMIN_GITHUB_TOKEN }} + branch: ${{ github.event.inputs.branch }} + release_url: ${{ github.event.inputs.release_url }} + steps_to_skip: ${{ github.event.inputs.steps_to_skip }} + + - name: Finalize Release + id: finalize-release + env: + # The following are needed if you use legacy PyPI set up + # PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + # PYPI_TOKEN_MAP: ${{ secrets.PYPI_TOKEN_MAP }} + # TWINE_USERNAME: __token__ + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2 + with: + token: ${{ secrets.ADMIN_GITHUB_TOKEN }} + release_url: ${{ steps.populate-release.outputs.release_url }} + + - name: "** Next Step **" + if: ${{ success() }} + run: | + echo "Verify the final release" + echo ${{ steps.finalize-release.outputs.release_url }} + + - name: "** Failure Message **" + if: ${{ failure() }} + run: | + echo "Failed to Publish the Draft Release Url:" + echo ${{ steps.populate-release.outputs.release_url }} diff --git a/.gitignore b/.gitignore index b661992..8b39fbf 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,15 @@ dmypy.json # jupyterlite *.doit.db _output + +# JupyterLab extension +.yarn +*.tsbuildinfo +jupyterlite_capytale/labextension +# Version file is handled by hatchling +jupyterlite_capytale/_version.py +.eslintcache +.stylelintcache + +# demo +demo/lite \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..906a972 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +node_modules +**/node_modules +**/lib +**/package.json +!/package.json +jupyterlite_capytale diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2d352af --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cf48cb5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2024, Jeremy Tuloup +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. diff --git a/README.md b/README.md index cc44395..5df2427 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,61 @@ -# JupyterLite Demo +# JupyterLite Capytale -[![lite-badge](https://jupyterlite.rtfd.io/en/latest/_static/badge.svg)](https://jupyterlite-capytale.quantstack.net) +[![lite-badge](https://jupyterlite.rtfd.io/en/latest/_static/badge.svg)](https://quantstack.net/jupyterlite-capytale) -JupyterLite deployed as a static site to GitHub Pages, for demo purposes. +Extension and demo to integrate JupyterLite with Capytale. -## ✨ Try it in your browser ✨ +## Structure -➡️ **https://jupyterlite-capytale.quantstack.net** +This repository contains a JupyterLab extension to integrate JupyterLite with Capytale, and a demo to show how to use it. -![github-pages](https://user-images.githubusercontent.com/591645/120649478-18258400-c47d-11eb-80e5-185e52ff2702.gif) +### Extension +The extension is located in the `src` folder. It sets up a bridge between a host application and a JupyterLite instance by using `postMessage` to communicate between the two. + +To install and develop the extension, see the `Development` and `Usage` sections below. + +### Demo + +The demo is located in the `demo` folder: + +- `index.html`: the main entry point of the demo +- `content`: a few example notebooks +- `overrides.json`: default set of override JupyterLab settings to customize the UI, to use a default display language, hide buttons and menu entries, etc... +- `requirements.txt`: list of Python packages to install before building the JupyterLite site + +This demo is also deployed on GitHub pages and available at https://quantstack.net/jupyterlite-capytale. + +## Development + +```bash +# Clone the repo to your local environment + +# Create a new environment +mamba create -n jupyterlite-capytale -c conda-forge python=3.11 jupyterlite-pyodide-kernel=0.2 jupyterlab=4 notebook=7 + +# Activate the environment +mamba activate jupyterlite-capytale + +# Install package in development mode +python -m pip install -e . + +# Link your development version of the extension +jupyter labextension develop . --overwrite + +# Rebuild extension Typescript source after making changes +jlpm build +``` + +### Usage + +Build a new JupyterLite site: + +```bash +# build the demo +jlpm demo:build + +# serve the demo +jlpm demo:build +``` + +Then go to http://localhost:8000 to open the demo. diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..dac7028 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,111 @@ +# Making a new release of jupyterlite_capytale + +The extension can be published to `PyPI` and `npm` manually or using the [Jupyter Releaser](https://github.com/jupyter-server/jupyter_releaser). + +## Manual release + +### Python package + +This extension can be distributed as Python packages. All of the Python +packaging instructions are in the `pyproject.toml` file to wrap your extension in a +Python package. Before generating a package, you first need to install some tools: + +```bash +pip install build twine hatch +``` + +Bump the version using `hatch`. By default this will create a tag. +See the docs on [hatch-nodejs-version](https://github.com/agoose77/hatch-nodejs-version#semver) for details. + +```bash +hatch version +``` + +Make sure to clean up all the development files before building the package: + +```bash +jlpm clean:all +``` + +You could also clean up the local git repository: + +```bash +git clean -dfX +``` + +To create a Python source package (`.tar.gz`) and the binary package (`.whl`) in the `dist/` directory, do: + +```bash +python -m build +``` + +> `python setup.py sdist bdist_wheel` is deprecated and will not work for this package. + +Then to upload the package to PyPI, do: + +```bash +twine upload dist/* +``` + +### NPM package + +To publish the frontend part of the extension as a NPM package, do: + +```bash +npm login +npm publish --access public +``` + +## Automated releases with the Jupyter Releaser + +The extension repository should already be compatible with the Jupyter Releaser. + +Check out the [workflow documentation](https://jupyter-releaser.readthedocs.io/en/latest/get_started/making_release_from_repo.html) for more information. + +Here is a summary of the steps to cut a new release: + +- Add tokens to the [Github Secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets) in the repository: + - `ADMIN_GITHUB_TOKEN` (with "public_repo" and "repo:status" permissions); see the [documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) + - `NPM_TOKEN` (with "automation" permission); see the [documentation](https://docs.npmjs.com/creating-and-viewing-access-tokens) +- Set up PyPI + +
Using PyPI trusted publisher (modern way) + +- Set up your PyPI project by [adding a trusted publisher](https://docs.pypi.org/trusted-publishers/adding-a-publisher/) + - The _workflow name_ is `publish-release.yml` and the _environment_ should be left blank. +- Ensure the publish release job as `permissions`: `id-token : write` (see the [documentation](https://docs.pypi.org/trusted-publishers/using-a-publisher/)) + +
+ +
Using PyPI token (legacy way) + +- If the repo generates PyPI release(s), create a scoped PyPI [token](https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/#saving-credentials-on-github). We recommend using a scoped token for security reasons. + +- You can store the token as `PYPI_TOKEN` in your fork's `Secrets`. + + - Advanced usage: if you are releasing multiple repos, you can create a secret named `PYPI_TOKEN_MAP` instead of `PYPI_TOKEN` that is formatted as follows: + + ```text + owner1/repo1,token1 + owner2/repo2,token2 + ``` + + If you have multiple Python packages in the same repository, you can point to them as follows: + + ```text + owner1/repo1/path/to/package1,token1 + owner1/repo1/path/to/package2,token2 + ``` + +
+ +- Go to the Actions panel +- Run the "Step 1: Prep Release" workflow +- Check the draft changelog +- Run the "Step 2: Publish Release" workflow + +## Publishing to `conda-forge` + +If the package is not on conda forge yet, check the documentation to learn how to add it: https://conda-forge.org/docs/maintainer/adding_pkgs.html + +Otherwise a bot should pick up the new version publish to PyPI, and open a new PR on the feedstock repository automatically. diff --git a/content/javascript.ipynb b/content/javascript.ipynb deleted file mode 100644 index a5e7487..0000000 --- a/content/javascript.ipynb +++ /dev/null @@ -1,86 +0,0 @@ -{ - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "javascript" - }, - "file_extension": ".js", - "mimetype": "text/javascript", - "name": "javascript", - "nbconvert_exporter": "javascript", - "pygments_lexer": "javascript", - "version": "es2017" - }, - "kernelspec": { - "name": "javascript", - "display_name": "JavaScript", - "language": "javascript" - }, - "toc-showcode": true - }, - "nbformat_minor": 4, - "nbformat": 4, - "cells": [ - { - "cell_type": "markdown", - "source": "# JavaScript in `JupyterLite`\n\n![](https://jupyterlite.readthedocs.io/en/latest/_static/kernelspecs/javascript.svg)", - "metadata": {} - }, - { - "cell_type": "markdown", - "source": "## Standard streams", - "metadata": {} - }, - { - "cell_type": "code", - "source": "console.log('hello world')", - "metadata": { - "trusted": true - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": "console.error('error')", - "metadata": { - "trusted": true - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": "## JavaScript specific constructs", - "metadata": {} - }, - { - "cell_type": "code", - "source": "const delay = 2000;\n\nsetTimeout(() => {\n console.log('done');\n}, delay);", - "metadata": { - "trusted": true - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": "var str = \"hello world\"\nstr.split('').forEach(c => {\n console.log(c)\n})", - "metadata": { - "trusted": true - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": "## Markdown cells", - "metadata": {} - }, - { - "cell_type": "markdown", - "source": "Lorenz system of differential equations\n\n$$\n\\begin{aligned}\n\\dot{x} & = \\sigma(y-x) \\\\\n\\dot{y} & = \\rho x - y - xz \\\\\n\\dot{z} & = -\\beta z + xy\n\\end{aligned}\n$$\n", - "metadata": {} - } - ] -} \ No newline at end of file diff --git a/content/p5.ipynb b/content/p5.ipynb deleted file mode 100644 index 78be9cb..0000000 --- a/content/p5.ipynb +++ /dev/null @@ -1,150 +0,0 @@ -{ - "metadata":{ - "kernelspec":{ - "name":"p5js", - "display_name":"p5.js", - "language":"javascript" - }, - "language_info":{ - "codemirror_mode":{ - "name":"javascript" - }, - "file_extension":".js", - "mimetype":"text/javascript", - "name":"p5js", - "nbconvert_exporter":"javascript", - "pygments_lexer":"javascript", - "version":"es2017" - } - }, - "nbformat_minor":4, - "nbformat":4, - "cells":[ - { - "cell_type":"markdown", - "source":"# p5 notebook\n\nA minimal Jupyter notebook UI for [p5.js](https://p5js.org) kernels.", - "metadata":{ - - } - }, - { - "cell_type":"markdown", - "source":"First let's define a couple of variables:", - "metadata":{ - - } - }, - { - "cell_type":"code", - "source":"var n = 4;\nvar speed = 1;", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - }, - { - "cell_type":"markdown", - "source":"## The `setup` function\n\nThe usual p5 setup function, which creates the canvas.", - "metadata":{ - - } - }, - { - "cell_type":"code", - "source":"function setup () {\n createCanvas(innerWidth, innerHeight);\n rectMode(CENTER);\n}", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - }, - { - "cell_type":"markdown", - "source":"## The `draw` function\n\nFrom the [p5.js documentation](https://p5js.org/reference/#/p5/draw):\n\n> The `draw()` function continuously executes the lines of code contained inside its block until the program is stopped or `noLoop()` is called.", - "metadata":{ - - } - }, - { - "cell_type":"code", - "source":"function draw() {\n background('#ddd');\n translate(innerWidth / 2, innerHeight / 2);\n for (let i = 0; i < n; i++) {\n push();\n rotate(frameCount * speed / 1000 * (i + 1));\n fill(i * 5, i * 100, i * 150);\n const s = 200 - i * 10;\n rect(0, 0, s, s);\n pop();\n }\n}", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - }, - { - "cell_type":"markdown", - "source":"## Show the sketch\n\nNow let's show the sketch by using the `%show` magic:", - "metadata":{ - - } - }, - { - "cell_type":"code", - "source":"%show", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - }, - { - "cell_type":"markdown", - "source":"## Tweak the values\n\nWe can also tweak some values in real time:", - "metadata":{ - - } - }, - { - "cell_type":"code", - "source":"speed = 3", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - }, - { - "cell_type":"code", - "source":"n = 20", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - }, - { - "cell_type":"markdown", - "source":"We can also show the sketch a second time taking into account the new values:", - "metadata":{ - - } - }, - { - "cell_type":"code", - "source":"%show", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ] - } - ] -} \ No newline at end of file diff --git a/content/pyodide/altair.ipynb b/content/pyodide/altair.ipynb deleted file mode 100644 index d7b8780..0000000 --- a/content/pyodide/altair.ipynb +++ /dev/null @@ -1,231 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Altair in `JupyterLite`\n", - "\n", - "**Altair** is a declarative statistical visualization library for Python.\n", - "\n", - "Most of the examples below are from: https://altair-viz.github.io/gallery" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Import the dependencies:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%pip install -q altair" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Simple Bar Chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import altair as alt\n", - "import pandas as pd\n", - "\n", - "source = pd.DataFrame({\n", - " 'a': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'],\n", - " 'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]\n", - "})\n", - "\n", - "alt.Chart(source).mark_bar().encode(\n", - " x='a',\n", - " y='b'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Simple Heatmap" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import altair as alt\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "# Compute x^2 + y^2 across a 2D grid\n", - "x, y = np.meshgrid(range(-5, 5), range(-5, 5))\n", - "z = x ** 2 + y ** 2\n", - "\n", - "# Convert this grid to columnar data expected by Altair\n", - "source = pd.DataFrame({'x': x.ravel(),\n", - " 'y': y.ravel(),\n", - " 'z': z.ravel()})\n", - "\n", - "alt.Chart(source).mark_rect().encode(\n", - " x='x:O',\n", - " y='y:O',\n", - " color='z:Q'\n", - ")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Install the Vega Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%pip install -q vega_datasets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Interactive Average" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import altair as alt\n", - "from vega_datasets import data\n", - "\n", - "source = data.seattle_weather()\n", - "brush = alt.selection(type='interval', encodings=['x'])\n", - "\n", - "bars = alt.Chart().mark_bar().encode(\n", - " x='month(date):O',\n", - " y='mean(precipitation):Q',\n", - " opacity=alt.condition(brush, alt.OpacityValue(1), alt.OpacityValue(0.7)),\n", - ").add_selection(\n", - " brush\n", - ")\n", - "\n", - "line = alt.Chart().mark_rule(color='firebrick').encode(\n", - " y='mean(precipitation):Q',\n", - " size=alt.SizeValue(3)\n", - ").transform_filter(\n", - " brush\n", - ")\n", - "\n", - "alt.layer(bars, line, data=source)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Locations of US Airports" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import altair as alt\n", - "from vega_datasets import data\n", - "\n", - "airports = data.airports.url\n", - "states = alt.topo_feature(data.us_10m.url, feature='states')\n", - "\n", - "# US states background\n", - "background = alt.Chart(states).mark_geoshape(\n", - " fill='lightgray',\n", - " stroke='white'\n", - ").properties(\n", - " width=500,\n", - " height=300\n", - ").project('albersUsa')\n", - "\n", - "# airport positions on background\n", - "points = alt.Chart(airports).transform_aggregate(\n", - " latitude='mean(latitude)',\n", - " longitude='mean(longitude)',\n", - " count='count()',\n", - " groupby=['state']\n", - ").mark_circle().encode(\n", - " longitude='longitude:Q',\n", - " latitude='latitude:Q',\n", - " size=alt.Size('count:Q', title='Number of Airports'),\n", - " color=alt.value('steelblue'),\n", - " tooltip=['state:N','count:Q']\n", - ").properties(\n", - " title='Number of airports in US'\n", - ")\n", - "\n", - "background + points\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/folium.ipynb b/content/pyodide/folium.ipynb deleted file mode 100644 index 2828de0..0000000 --- a/content/pyodide/folium.ipynb +++ /dev/null @@ -1,154 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "# `folium` Interactive Map Demo\n", - "\n", - "Simple demonstration of rendering a map in a `jupyterlite` notebook.\n", - "\n", - "Note that the `folium` package has several dependencies which themselves may have dependencies.\n", - "\n", - "The following code fragement, run in a fresh Python enviroment into which `folium` has already been installed, identifies the packages that are loaded in when `folium` is loaded:\n", - "\n", - "```python\n", - "#https://stackoverflow.com/a/40381601/454773\n", - "import sys\n", - "before = [str(m) for m in sys.modules]\n", - "import folium\n", - "after = [str(m) for m in sys.modules]\n", - "set([m.split('.')[0] for m in after if not m in before and not m.startswith('_')])\n", - "```\n", - "\n", - "The loaded packages are:\n", - "\n", - "```\n", - "{'branca',\n", - " 'certifi',\n", - " 'chardet',\n", - " 'cmath',\n", - " 'csv',\n", - " 'dateutil',\n", - " 'encodings',\n", - " 'folium',\n", - " 'gzip',\n", - " 'http',\n", - " 'idna',\n", - " 'importlib',\n", - " 'jinja2',\n", - " 'markupsafe',\n", - " 'mmap',\n", - " 'numpy',\n", - " 'pandas',\n", - " 'pkg_resources',\n", - " 'pytz',\n", - " 'requests',\n", - " 'secrets',\n", - " 'stringprep',\n", - " 'urllib3',\n", - " 'zipfile'}\n", - " ```\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following packages seem to need installing in order load `folium`, along with folium itself:\n", - "\n", - "```\n", - "chardet, certifi, idna, branca, urllib3, Jinja2, requests, Markupsafe\n", - "```\n", - "\n", - "Universal wheels, with filenames of the form `PACKAGE-VERSION-py2.py3-none-any.whl` appearing in the *Download files* area of a PyPi package page ([example](https://pypi.org/project/requests/#files)] are required in order to install the package.\n", - "\n", - "One required package, [`Markupsafe`](https://pypi.org/project/Markupsafe/#files)) *did not* have a universal wheel available, so a wheel was manually built elsewhere (by hacking the [`setup.py` file](https://github.com/pallets/markupsafe/blob/main/setup.py) to force it to build the wheel in a platform and speedup free way) and pushed to a downloadable location in an [*ad hoc* wheelhouse](https://opencomputinglab.github.io/vce-wheelhouse/)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "# Install folium requirements\n", - "%pip install -q folium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Demo of `folium` Map\n", - "\n", - "Load in the `folium` package:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import folium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And render a demo map:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "m = folium.Map(location=[50.693848, -1.304734], zoom_start=11)\n", - "m" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4, - "toc-showcode": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/interactive-widgets.ipynb b/content/pyodide/interactive-widgets.ipynb deleted file mode 100644 index 267273d..0000000 --- a/content/pyodide/interactive-widgets.ipynb +++ /dev/null @@ -1,268 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "9ca234f7-84b7-4107-9bcd-74f5a4ffd07d", - "metadata": {}, - "source": [ - "# `ipywidgets` Interactive Demo\n", - "\n", - "Simple demonstration of rendering Interactive widgets in a `jupyterlite` notebook.\n", - "\n", - "`ipywidgets` can be installed in this deployment (it provides the @jupyter-widgets/jupyterlab-manager federated extension), but you will need to make your own deployment to have access to other interactive widgets libraries." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d62fba6e", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install -q ipywidgets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3bab23f8-de91-43c9-9cec-84f4924425fc", - "metadata": {}, - "outputs": [], - "source": [ - "from ipywidgets import IntSlider" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a15c5acb-ee72-4005-8761-5693db853f22", - "metadata": {}, - "outputs": [], - "source": [ - "slider = IntSlider()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ba89682-e0d7-4bd2-961a-f9956850fd5a", - "metadata": {}, - "outputs": [], - "source": [ - "slider" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "50510ade-668f-4477-8cb2-41574609ac73", - "metadata": {}, - "outputs": [], - "source": [ - "slider" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7bac1ed8-8c77-426b-a781-1c1a6cfad829", - "metadata": {}, - "outputs": [], - "source": [ - "slider.value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "976a70a0-e99d-4c20-b005-f59bbba10f85", - "metadata": {}, - "outputs": [], - "source": [ - "slider.value = 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3134c76e-cffb-4701-8230-e6c4bfbbfdb9", - "metadata": {}, - "outputs": [], - "source": [ - "from ipywidgets import IntText, link" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f7b3fe0a-5695-4ef2-a573-40785e68fbae", - "metadata": {}, - "outputs": [], - "source": [ - "text = IntText()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5e2fd50e-19e0-4e20-a1f7-ad65400ec636", - "metadata": {}, - "outputs": [], - "source": [ - "text" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bb3bedce-7311-48c0-aeab-8fe3aa554b92", - "metadata": {}, - "outputs": [], - "source": [ - "link((slider, 'value'), (text, 'value'));" - ] - }, - { - "cell_type": "markdown", - "id": "71b68c3e-184e-4320-9513-d0bc72800a85", - "metadata": {}, - "source": [ - "# `bqplot` Interactive Demo\n", - "\n", - "Plotting in JupyterLite\n", - "\n", - "`bqplot` can be installed in this deployment (it provides the bqplot federated extension), but you will need to make your own deployment to have access to other interactive widgets libraries." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "119eb9a3-ac98-42c3-98d4-1ac460eb75d3", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install -q bqplot" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23b32857-2958-4083-b16a-ac26cd2408d4", - "metadata": {}, - "outputs": [], - "source": [ - "from bqplot import *\n", - "\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "np.random.seed(0)\n", - "\n", - "n = 100\n", - "\n", - "x = list(range(n))\n", - "y = np.cumsum(np.random.randn(n)) + 100.\n", - "\n", - "sc_x = LinearScale()\n", - "sc_y = LinearScale()\n", - "\n", - "lines = Lines(\n", - " x=x, y=y,\n", - " scales={'x': sc_x, 'y': sc_y}\n", - ")\n", - "ax_x = Axis(scale=sc_x, label='Index')\n", - "ax_y = Axis(scale=sc_y, orientation='vertical', label='lines')\n", - "\n", - "Figure(marks=[lines], axes=[ax_x, ax_y], title='Lines')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ddb6b44e-06a0-4049-a79d-33ffc90d5a03", - "metadata": {}, - "outputs": [], - "source": [ - "lines.colors = ['green']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e367e7fb-b403-41aa-9629-224827ec3005", - "metadata": {}, - "outputs": [], - "source": [ - "lines.fill = 'bottom'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d4a167f3-07c4-4880-92f5-7fcdea0c61c6", - "metadata": {}, - "outputs": [], - "source": [ - "lines.marker = 'circle'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1d1342f7-ec08-4f53-84dc-d712226d9e46", - "metadata": {}, - "outputs": [], - "source": [ - "n = 100\n", - "\n", - "x = list(range(n))\n", - "y = np.cumsum(np.random.randn(n))\n", - "\n", - "sc_x = LinearScale()\n", - "sc_y = LinearScale()\n", - "\n", - "bars = Bars(\n", - " x=x, y=y,\n", - " scales={'x': sc_x, 'y': sc_y}\n", - ")\n", - "ax_x = Axis(scale=sc_x, label='Index')\n", - "ax_y = Axis(scale=sc_y, orientation='vertical', label='bars')\n", - "\n", - "Figure(marks=[bars], axes=[ax_x, ax_y], title='Bars', animation_duration=1000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f86bbcfb-5b02-4700-b8d6-f90068893b55", - "metadata": {}, - "outputs": [], - "source": [ - "bars.y = np.cumsum(np.random.randn(n))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4, - "toc-showcode": false - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/pyodide/ipycanvas.ipynb b/content/pyodide/ipycanvas.ipynb deleted file mode 100644 index 33e1b9a..0000000 --- a/content/pyodide/ipycanvas.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ipycanvas: John Conway's Game Of Life" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some of the following code is adapted from https://jakevdp.github.io/blog/2013/08/07/conways-game-of-life/" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%pip install -q ipycanvas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import asyncio\n", - "\n", - "import numpy as np\n", - "\n", - "from ipycanvas import RoughCanvas, hold_canvas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "def life_step(x):\n", - " \"\"\"Game of life step\"\"\"\n", - " nbrs_count = sum(np.roll(np.roll(x, i, 0), j, 1)\n", - " for i in (-1, 0, 1) for j in (-1, 0, 1)\n", - " if (i != 0 or j != 0))\n", - " return (nbrs_count == 3) | (x & (nbrs_count == 2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "def draw(x, canvas, color='black'):\n", - " with hold_canvas(canvas):\n", - " canvas.clear()\n", - " canvas.fill_style = '#FFF0C9'\n", - " canvas.rough_fill_style = 'solid'\n", - " canvas.fill_rect(-10, -10, canvas.width + 10, canvas.height + 10)\n", - " canvas.rough_fill_style = 'cross-hatch'\n", - "\n", - " canvas.fill_style = color\n", - " canvas.stroke_style = color\n", - "\n", - " living_cells = np.where(x)\n", - " \n", - " rects_x = living_cells[1] * n_pixels\n", - " rects_y = living_cells[0] * n_pixels\n", - "\n", - " canvas.fill_rects(rects_x, rects_y, n_pixels)\n", - " canvas.stroke_rects(rects_x, rects_y, n_pixels)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "glider_gun =\\\n", - "[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],\n", - " [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0],\n", - " [0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n", - " [0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\n", - " [1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n", - " [1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0],\n", - " [0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],\n", - " [0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n", - " [0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]\n", - "\n", - "x = np.zeros((50, 70), dtype=bool)\n", - "x[1:10,1:37] = glider_gun" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "n_pixels = 15\n", - "\n", - "canvas = RoughCanvas(width=x.shape[1]*n_pixels, height=x.shape[0]*n_pixels)\n", - "canvas.fill_style = '#FFF0C9'\n", - "canvas.rough_fill_style = 'solid'\n", - "canvas.fill_rect(0, 0, canvas.width, canvas.height)\n", - "\n", - "canvas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "draw(x, canvas, '#5770B3')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "for _ in range(300):\n", - " x = life_step(x)\n", - " draw(x, canvas, '#5770B3')\n", - "\n", - " await asyncio.sleep(0.1)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4, - "toc-showcode": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/ipyleaflet.ipynb b/content/pyodide/ipyleaflet.ipynb deleted file mode 100644 index 64dcff2..0000000 --- a/content/pyodide/ipyleaflet.ipynb +++ /dev/null @@ -1,259 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install -q bqplot ipyleaflet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from urllib.request import urlopen\n", - "import json\n", - "from datetime import datetime\n", - "\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "from js import fetch\n", - "\n", - "from ipywidgets import Dropdown\n", - "\n", - "from bqplot import Lines, Figure, LinearScale, DateScale, Axis\n", - "\n", - "from ipyleaflet import Map, GeoJSON, WidgetControl" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "URL = \"https://raw.githubusercontent.com/jupyter-widgets/ipyleaflet/master/examples/nations.json\"\n", - "\n", - "res = await fetch(URL)\n", - "text = await res.text()\n", - "\n", - "data = pd.read_json(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def clean_data(data):\n", - " for column in ['income', 'lifeExpectancy', 'population']:\n", - " data = data.drop(data[data[column].apply(len) <= 4].index)\n", - " return data\n", - "\n", - "def extrap_interp(data):\n", - " data = np.array(data)\n", - " x_range = np.arange(1800, 2009, 1.)\n", - " y_range = np.interp(x_range, data[:, 0], data[:, 1])\n", - " return y_range\n", - "\n", - "def extrap_data(data):\n", - " for column in ['income', 'lifeExpectancy', 'population']:\n", - " data[column] = data[column].apply(extrap_interp)\n", - " return data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data = clean_data(data)\n", - "data = extrap_data(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "date_start = datetime(1800, 12, 31)\n", - "date_end = datetime(2009, 12, 31)\n", - "\n", - "date_scale = DateScale(min=date_start, max=date_end)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "date_data = pd.date_range(start=date_start, end=date_end, freq='A', normalize=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_name = 'Angola'\n", - "data_name = 'income'\n", - "\n", - "x_data = data[data.name == country_name][data_name].values[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x_scale = LinearScale()\n", - "\n", - "lines = Lines(x=date_data, y=x_data, scales={'x': date_scale, 'y': x_scale})\n", - "\n", - "ax_x = Axis(label='Year', scale=date_scale, num_ticks=10, tick_format='%Y')\n", - "ax_y = Axis(label=data_name.capitalize(), scale=x_scale, orientation='vertical', side='left')\n", - "\n", - "figure = Figure(axes=[ax_x, ax_y], title=country_name, marks=[lines], animation_duration=500,\n", - " layout={'max_height': '250px', 'max_width': '400px'})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def update_figure(country_name, data_name):\n", - " try:\n", - " lines.y = data[data.name == country_name][data_name].values[0]\n", - " ax_y.label = data_name.capitalize()\n", - " figure.title = country_name\n", - " except IndexError:\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "URL = \"https://raw.githubusercontent.com/jupyter-widgets/ipyleaflet/master/examples/countries.geo.json\"\n", - "\n", - "res = await fetch(URL)\n", - "text = await res.text()\n", - "\n", - "countries = json.loads(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "m = Map(zoom=3)\n", - "\n", - "geo = GeoJSON(data=countries, style={'fillColor': 'white', 'weight': 0.5}, hover_style={'fillColor': '#1f77b4'}, name='Countries')\n", - "m.add_layer(geo)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "widget_control1 = WidgetControl(widget=figure, position='bottomright')\n", - "\n", - "m.add_control(widget_control1)\n", - "\n", - "def on_hover(event, feature, **kwargs):\n", - " global country_name\n", - "\n", - " country_name = feature['properties']['name']\n", - " update_figure(country_name, data_name)\n", - "\n", - "geo.on_hover(on_hover)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dropdown = Dropdown(\n", - " options=['income', 'population', 'lifeExpectancy'],\n", - " value=data_name,\n", - " description='Plotting:'\n", - ")\n", - "\n", - "def on_click(change):\n", - " global data_name\n", - "\n", - " data_name = change['new']\n", - " update_figure(country_name, data_name)\n", - "\n", - "dropdown.observe(on_click, 'value')\n", - "\n", - "widget_control2 = WidgetControl(widget=dropdown, position='bottomleft')\n", - "\n", - "m.add_control(widget_control2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "m" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4, - "toc-showcode": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/matplotlib.ipynb b/content/pyodide/matplotlib.ipynb deleted file mode 100644 index c2ec2be..0000000 --- a/content/pyodide/matplotlib.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Matplotlib" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "x = np.linspace(0, 10, 1000)\n", - "plt.plot(x, np.sin(x));" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAA9hAAAPYQGoP6dpAABmgklEQVR4nO3deXxTZdo+8OskaZKuKd1baKGFQtkLRUrZkQoILoy4oDgogzg6OqPCjCPvb9R3RmcYfd3GZWQYZXDfxhVUFMsOZWspe0sXoPveJt2X5Pz+yAIVKKVNcpKc6/v55A/DSXqnwsl1zvM89yOIoiiCiIiIiGRDIXUBRERERORcDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMsMASERERCQzDIBEREREMqOSugB3ZjKZUFpaCn9/fwiCIHU5RERE1AOiKKKhoQFRUVFQKOR5L4wBsA9KS0sRHR0tdRlERETUC0VFRRgwYIDUZUiCAbAP/P39AZj/AgUEBEhcDREREfWEwWBAdHS07XtcjhgA+8A67BsQEMAASERE5GbkPH1LngPfRERERDLGAEhEREQkMwyARERERDLDAEhEREQkMwyARERERDLDAEhEREQkMwyARERERDLDAEhEREQkMwyARERERDLjFgFw586duPHGGxEVFQVBEPDVV19d8TXbt2/H+PHjodFoMGTIEGzYsOGi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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Matplotlib: support for widgets backend" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install -q ipympl" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib widget" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = np.linspace(0, 10, 1000)\n", - "plt.plot(x, np.sin(x))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4, - "toc-showcode": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/plotly.ipynb b/content/pyodide/plotly.ipynb deleted file mode 100644 index 9716bee..0000000 --- a/content/pyodide/plotly.ipynb +++ /dev/null @@ -1,158 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Plotly in JupyterLite\n", - "\n", - "`plotly.py` is an interactive, open-source, and browser-based graphing library for Python: https://plotly.com/python/" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install -q nbformat plotly" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Basic Figure" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import plotly.graph_objects as go\n", - "fig = go.Figure()\n", - "fig.add_trace(go.Scatter(y=[2, 1, 4, 3]))\n", - "fig.add_trace(go.Bar(y=[1, 4, 3, 2]))\n", - "fig.update_layout(title = 'Hello Figure')\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Basic Table with a Pandas DataFrame" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import plotly.graph_objects as go\n", - "import pandas as pd\n", - "\n", - "from js import fetch\n", - "\n", - "URL = \"https://raw.githubusercontent.com/plotly/datasets/master/2014_usa_states.csv\"\n", - "\n", - "res = await fetch(URL)\n", - "text = await res.text()\n", - "\n", - "filename = 'data.csv'\n", - "\n", - "with open(filename, 'w') as f:\n", - " f.write(text)\n", - "\n", - "df = pd.read_csv(filename)\n", - "\n", - "fig = go.Figure(data=[go.Table(\n", - " header=dict(values=list(df.columns),\n", - " fill_color='paleturquoise',\n", - " align='left'),\n", - " cells=dict(values=[df.Rank, df.State, df.Postal, df.Population],\n", - " fill_color='lavender',\n", - " align='left'))\n", - "])\n", - "\n", - "fig.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Quiver Plot with Points" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import plotly.figure_factory as ff\n", - "import plotly.graph_objects as go\n", - "\n", - "import numpy as np\n", - "\n", - "x,y = np.meshgrid(np.arange(-2, 2, .2),\n", - " np.arange(-2, 2, .25))\n", - "z = x*np.exp(-x**2 - y**2)\n", - "v, u = np.gradient(z, .2, .2)\n", - "\n", - "# Create quiver figure\n", - "fig = ff.create_quiver(x, y, u, v,\n", - " scale=.25,\n", - " arrow_scale=.4,\n", - " name='quiver',\n", - " line_width=1)\n", - "\n", - "# Add points to figure\n", - "fig.add_trace(go.Scatter(x=[-.7, .75], y=[0,0],\n", - " mode='markers',\n", - " marker_size=12,\n", - " name='points'))\n", - "\n", - "fig.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4, - "toc-showcode": false - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/pyb2d/0_tutorial.ipynb b/content/pyodide/pyb2d/0_tutorial.ipynb deleted file mode 100644 index 3772314..0000000 --- a/content/pyodide/pyb2d/0_tutorial.ipynb +++ /dev/null @@ -1,649 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "b07a3b47-2262-4135-a1d2-52e8392b44eb", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')\n" - ] - }, - { - "cell_type": "markdown", - "id": "49c3f9ea-23ce-4c5c-b3fe-44f1cecadf20", - "metadata": {}, - "source": [ - "pyb2d is imported as b2d" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dff93359-2c68-467a-9239-478a0e550a4b", - "metadata": {}, - "outputs": [], - "source": [ - "import b2d\n", - "# import pyb2d_jupyterlite_backend\n", - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "import numpy as np\n", - "import matplotlib.pylab as plt" - ] - }, - { - "cell_type": "markdown", - "id": "bc977c4e-75ee-4349-9408-650c3dcd01e0", - "metadata": {}, - "source": [ - "# Tutorial 0: A free falling body\n", - "The first step with Box2D is the creation of the world. The world is parametrized by a gravity vector." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4ff914a6-eb18-45a1-b1ed-e8ad7ab0d298", - "metadata": {}, - "outputs": [], - "source": [ - "# the world\n", - "gravity = (0, -10)\n", - "world = b2d.World(gravity)" - ] - }, - { - "cell_type": "markdown", - "id": "3afdbb2a-e694-4779-b95e-73a5b38d34b6", - "metadata": {}, - "source": [ - "Create a circle-shaped body" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "99837a63-4628-483c-8f2d-cc4aec9cb1d5", - "metadata": {}, - "outputs": [], - "source": [ - "# the body def\n", - "body_def = b2d.BodyDef()\n", - "body_def.type = b2d.BodyType.dynamic\n", - "body_def.position = (0, 0)\n", - "\n", - "# the body\n", - "body = world.create_body(body_def)\n", - "\n", - "# shape\n", - "circle_shape = b2d.CircleShape()\n", - "circle_shape.radius = 1.0\n", - "\n", - "# the fixture\n", - "fixture_def = b2d.FixtureDef()\n", - "fixture_def.shape = circle_shape\n", - "fixture_def.density = 1.0\n", - "\n", - "# create and add the fixture to the body\n", - "fixture = body.create_fixture(fixture_def)" - ] - }, - { - "cell_type": "markdown", - "id": "bf9758a6-fb6e-4f9c-b15f-783f9488cf7e", - "metadata": {}, - "source": [ - "We can now have a look at the world: We render the world st. each meter in the Box2D world will be 100 pixels in the image:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8b433892-3c82-43be-a085-eda3e4279b2c", - "metadata": {}, - "outputs": [], - "source": [ - "# from b2d.plot import render_world\n", - "b2d.plot.plot_world(world, ppm=100)" - ] - }, - { - "cell_type": "markdown", - "id": "5e1db1f1-6e47-454c-9ea9-86262d7da309", - "metadata": {}, - "source": [ - "Lets run the world for a total of 5 seconds. \n", - "Usually one wants to run the world at a certain frame rate.\n", - "With the frame rate and the total time we can compute the delta for each iteration and how many steps we need" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "41a232a9-a3c5-425d-9aed-d3adb90d6314", - "metadata": {}, - "outputs": [], - "source": [ - "t = 5\n", - "fps = 40\n", - "dt = 1.0 / fps\n", - "n_steps = int(t / dt + 0.5)\n", - "print(f\"t={t} fps={fps} dt={dt} n_steps={n_steps}\")" - ] - }, - { - "cell_type": "markdown", - "id": "4d458acb-6d5c-47ba-bcbf-d15ea2cf2537", - "metadata": {}, - "source": [ - "in each step we query the bodies position and velocity and store then for later plotting" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4e042c7b-07a7-445f-ba04-e38173b46c0f", - "metadata": {}, - "outputs": [], - "source": [ - "positions = np.zeros([n_steps, 2])\n", - "velocites = np.zeros([n_steps, 2])\n", - "timepoints = np.zeros([n_steps])\n", - "\n", - "t_elapsed = 0.0\n", - "for i in range(n_steps):\n", - "\n", - " # get the bodies center of mass\n", - " positions[i, :] = body.world_center\n", - "\n", - " # get the bodies velocity\n", - " velocites[i, :] = body.linear_velocity\n", - "\n", - " timepoints[i] = t_elapsed\n", - "\n", - " world.step(time_step=dt, velocity_iterations=1, position_iterations=1)\n", - " t_elapsed += dt" - ] - }, - { - "cell_type": "markdown", - "id": "0ec7d66c-c979-40fa-8af3-9e99873ec105", - "metadata": {}, - "source": [ - "plot the y-position against the time. We can see that the body is falling down in an accelerating way:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "434cb907-1b76-414e-bb5e-6ea32dd1f829", - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(timepoints, positions[:, 1])\n", - "plt.ylabel('y-poistion [meter]')\n", - "plt.xlabel('t [sec]')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "b7f58954-4ea1-49f9-b0b0-7df38336860d", - "metadata": {}, - "source": [ - "as expected the x position is not changing since the gravity vector is non-zero only in the x direction" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "39573eed-e6c8-45bf-8e35-4251b660ce3f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "plt.plot(timepoints, positions[:, 0])\n", - "plt.ylabel('x-poistion [meter]')\n", - "plt.xlabel('t [sec]')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "cdb98dc5-3bc8-4933-91a0-a1db3afb9c34", - "metadata": {}, - "source": [ - "# Tutorial 1: A falling body in a box, more pythonic\n", - "Create a world, but in a more pythonic way, and animate the world" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d58c2639-21da-490b-8dcd-205962f63dfc", - "metadata": {}, - "outputs": [], - "source": [ - "# the world\n", - "world = b2d.world(gravity=(0, -10))\n", - "\n", - "# create the dynamic body\n", - "body = world.create_dynamic_body(\n", - " position=(5, 5),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=1), density=1, restitution=0.75),\n", - ")\n", - "\n", - "# create a box\n", - "box_shape = b2d.ChainShape()\n", - "box_shape.create_loop([(0, 0), (0, 10),(10,10),(10, 0)])\n", - "box = world.create_static_body(\n", - " position=(0, 0), fixtures=b2d.fixture_def(shape=box_shape, friction=0)\n", - ")\n", - "b2d.plot.animate_world(world, ppm=20, t=10)" - ] - }, - { - "cell_type": "markdown", - "id": "10dbb85a-84b0-4820-8fb3-6108d9c0fe00", - "metadata": {}, - "source": [ - "note that when we animate that world again, the body has already been fallen" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c919702c-7c62-4d87-bf1f-df5027d72a83", - "metadata": {}, - "outputs": [], - "source": [ - "b2d.plot.animate_world(world, ppm=20, t=2)" - ] - }, - { - "cell_type": "markdown", - "id": "7322e9c5-8608-4375-81ed-766cbb2af927", - "metadata": {}, - "source": [ - "# Tutorial 2: Interactive worlds\n", - "While animating the world already is already nice, interacting with the world is even better.\n", - "pyb2d has a framwork to interact with the world for multiple backends.\n", - "This framework is called `TestbedBase` since you can \"test\" your world in an interactive way" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "97cddd47-5a88-4cae-8543-cfcdf658255a", - "metadata": {}, - "outputs": [], - "source": [ - "from b2d.testbed import TestbedBase\n", - "\n", - "class InteractiveExample(TestbedBase):\n", - " def __init__(self, settings=None):\n", - " super(InteractiveExample, self).__init__(settings=settings)\n", - " # create two balls\n", - " body = self.world.create_dynamic_body(position=(5, 5),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=1), density=1, restitution=0.5),\n", - " )\n", - " body = self.world.create_dynamic_body(position=(8, 5),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=1), density=1, restitution=0.8),\n", - " )\n", - " # create a box\n", - " box_shape = b2d.ChainShape()\n", - " box_shape.create_loop([(0, 0), (0, 10),(10,10),(10, 0)])\n", - " box = self.world.create_static_body(\n", - " position=(0, 0), fixtures=b2d.fixture_def(shape=box_shape, friction=0)\n", - " )\n", - " \n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [300,300]\n", - "b2d.testbed.run(InteractiveExample, backend=JupyterAsyncGui, gui_settings=s);" - ] - }, - { - "cell_type": "markdown", - "id": "64bf55d1-4117-4af0-8f1f-65de33751743", - "metadata": { - "tags": [] - }, - "source": [ - "# Tutorial 3: Joints" - ] - }, - { - "cell_type": "markdown", - "id": "07147cab-23be-4406-85f7-4b3d174e3954", - "metadata": { - "tags": [] - }, - "source": [ - "## Tutorial 3.1: Prismatic Joint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9a2d178d-33d7-4c51-b0ff-f66c98cac673", - "metadata": {}, - "outputs": [], - "source": [ - "world = b2d.world(gravity=(0, -10))\n", - "anchor_body = world.create_static_body(position=(0, 0))\n", - "b = world.create_dynamic_body(\n", - " position=(10, 10),\n", - " fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[2, 0.5]), density=1),\n", - " linear_damping=0.0,\n", - " angular_damping=0.0,\n", - ")\n", - "world.create_prismatic_joint(anchor_body, b, local_axis_a=(1, 1))\n", - "b2d.plot.animate_world(world, ppm=20, t=3, bounding_box=((0,0),(10,10)))" - ] - }, - { - "cell_type": "markdown", - "id": "07971d69-b2ef-4d74-8c1c-48f38dcc708c", - "metadata": { - "tags": [] - }, - "source": [ - "## Tutorial 3.2: Pully Joint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "39b7fef2-4b4b-4904-9899-1a34f1039693", - "metadata": {}, - "outputs": [], - "source": [ - "world = b2d.world(gravity=(0, -10))\n", - "\n", - "\n", - "a = world.create_dynamic_body(\n", - " position=(-5, 0),\n", - " fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[2, 0.8]), density=1),\n", - " linear_damping=0.0,\n", - " angular_damping=0.0,\n", - ")\n", - "b = world.create_dynamic_body(\n", - " position=(5, 0),\n", - " fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[2, 0.5]), density=1),\n", - " linear_damping=0.0,\n", - " angular_damping=0.0,\n", - ")\n", - "world.create_pully_joint(\n", - " a,\n", - " b,\n", - " length_a=10,\n", - " length_b=10,\n", - " ground_anchor_a=(-5, 10),\n", - " ground_anchor_b=(5, 10),\n", - " local_anchor_a=(0, 0),\n", - " local_anchor_b=(0, 0),\n", - ")\n", - "b2d.plot.animate_world(world, ppm=20, t=5, bounding_box=((-10,-12),(10,12)))" - ] - }, - { - "cell_type": "markdown", - "id": "7e8fb17d-1dda-45cb-98df-6b98be5b4e6c", - "metadata": {}, - "source": [ - "## Tutorial 3.3: Revolute Joint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a2686e5f-3fa2-412d-8a40-2e9a67123d43", - "metadata": {}, - "outputs": [], - "source": [ - "world = b2d.world(gravity=(0, -10))\n", - "bodies = []\n", - "b = world.create_static_body(position=(0, 15))\n", - "bodies.append(b)\n", - "for i in range(5):\n", - " b = world.create_dynamic_body(\n", - " position=(i * 4 + 2, 15),\n", - " fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[2, 0.5]), density=1),\n", - " linear_damping=0.0,\n", - " angular_damping=0.0,\n", - " )\n", - " bodies.append(b)\n", - "world.create_revolute_joint(\n", - " bodies[0], bodies[1], local_anchor_a=(0, 0), local_anchor_b=(-2, 0.0)\n", - ")\n", - "for i in range(1, len(bodies) - 1):\n", - " a = bodies[i]\n", - " b = bodies[i + 1]\n", - " world.create_revolute_joint(a, b, local_anchor_a=(2, 0.0), local_anchor_b=(-2, 0.0))\n", - "b2d.plot.animate_world(world, ppm=20, t=5, bounding_box=((-20,-10),(20,20)))" - ] - }, - { - "cell_type": "markdown", - "id": "9caa18f0-4eb7-4e72-8445-8f6d096d9465", - "metadata": { - "tags": [] - }, - "source": [ - "## Tutorial 3.4: Weld Joint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d74fb2f-7da5-4ad7-8f21-fba1f97acee2", - "metadata": {}, - "outputs": [], - "source": [ - "# the world\n", - "world = b2d.world(gravity=(0, -10))\n", - "\n", - "\n", - "bodies = []\n", - "\n", - "# create a static body as anchor\n", - "b = world.create_static_body(\n", - " position=(0, 4), fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[0.3, 0.5]))\n", - ")\n", - "bodies.append(b)\n", - "\n", - "for i in range(4):\n", - " b = world.create_dynamic_body(\n", - " position=(i + 1.0, 4),\n", - " fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[0.3, 0.5]), density=0.1),\n", - " linear_damping=2.5,\n", - " angular_damping=2.5,\n", - " )\n", - " bodies.append(b)\n", - "\n", - "for i in range(len(bodies) - 1):\n", - " a = bodies[i]\n", - " b = bodies[i + 1]\n", - " world.create_weld_joint(\n", - " a,\n", - " b,\n", - " local_anchor_a=(0.5, 0.5),\n", - " local_anchor_b=(-0.5, 0.5),\n", - " damping=0.1,\n", - " reference_angle=0,\n", - " stiffness=20,\n", - " )\n", - " world.create_weld_joint(\n", - " a,\n", - " b,\n", - " local_anchor_a=(0.5, -0.5),\n", - " local_anchor_b=(-0.5, -0.5),\n", - " damping=0.1,\n", - " reference_angle=0,\n", - " stiffness=20,\n", - " )\n", - "b2d.plot.animate_world(world, ppm=20, t=5, bounding_box=((0,-5),(5,5)))" - ] - }, - { - "cell_type": "markdown", - "id": "7373461e-d1fa-4ad9-aeaa-048287839fd9", - "metadata": {}, - "source": [ - "## Tutorial 3.5: Wheel Joint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1eb711e0-ae53-43ed-b0c1-c0a2fe42b407", - "metadata": {}, - "outputs": [], - "source": [ - "world = b2d.world(gravity=(0, -10))\n", - "edge = world.create_static_body(\n", - " position=(0, 0), fixtures=b2d.fixture_def(shape=b2d.edge_shape([(-20, 0), (5, 0)]))\n", - ")\n", - "\n", - "# random slope\n", - "x = np.linspace(5, 50, 10)\n", - "y = np.random.rand(10) * 4 - 2\n", - "y[0] = 0\n", - "xy = np.stack([x, y]).T\n", - "xy = np.flip(xy, axis=0)\n", - "edge = world.create_static_body(\n", - " position=(0, 0),\n", - " fixtures=b2d.fixture_def(shape=b2d.chain_shape(xy, prev_vertex=(10, 0))),\n", - ")\n", - "# create car\n", - "left_wheel = world.create_dynamic_body(\n", - " position=(-3, 2),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=2), density=1),\n", - ")\n", - "right_wheel = world.create_dynamic_body(\n", - " position=(3, 2),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=2), density=1),\n", - ")\n", - "\n", - "chasis = world.create_dynamic_body(\n", - " position=(0, 2),\n", - " fixtures=b2d.fixture_def(shape=b2d.polygon_shape(box=[3, 0.5]), density=1),\n", - ")\n", - "\n", - "wheel_joint_def = dict(\n", - " stiffness=10,\n", - " enable_motor=True,\n", - " motor_speed=-100,\n", - " max_motor_torque=100,\n", - " collide_connected=False,\n", - " enable_limit=True,\n", - " lower_translation=-0.4,\n", - " upper_translation=0.4,\n", - " local_axis_a=(0, 1),\n", - ")\n", - "world.create_wheel_joint(chasis, left_wheel, local_anchor_a=(-3, 0), **wheel_joint_def)\n", - "world.create_wheel_joint(chasis, right_wheel, local_anchor_a=(3, 0), **wheel_joint_def)\n", - "\n", - "\n", - "b2d.plot.animate_world(world, ppm=20, t=15, bounding_box=((-10,-5),(20,5)))" - ] - }, - { - "cell_type": "markdown", - "id": "d9a0fffc-ae40-47ec-b185-2a6fe0dde496", - "metadata": {}, - "source": [ - "## Tutorial 3.6: Distance Joint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3c121398-f08f-4ea0-a875-de141ba53508", - "metadata": {}, - "outputs": [], - "source": [ - "world = b2d.world(gravity=(0, -10))\n", - "\n", - "for i in range(10):\n", - "\n", - " # create static anchor (does not need shape/fixture)\n", - " anchor = world.create_static_body(position=(i, 0))\n", - "\n", - " # 5 below the anchor\n", - " body = world.create_dynamic_body(\n", - " position=(i, -10),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=0.4), density=0.5),\n", - " )\n", - "\n", - " # distance joints of various stiffness-es\n", - " world.create_distance_joint(anchor, body, length=10, stiffness=0.5 * (i + 1))\n", - "\n", - "b2d.plot.animate_world(world, ppm=20, t=10, bounding_box=((-2,-20),(10,0)))" - ] - }, - { - "cell_type": "markdown", - "id": "fb6afaff-8236-4206-85c7-3ba2de466ba9", - "metadata": {}, - "source": [ - "# Tutorial 4: Particles" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8f5c3b83-51d9-47cb-9b73-d5f8b0e03a76", - "metadata": {}, - "outputs": [], - "source": [ - "world = b2d.world(gravity=(0, -10))\n", - "pdef = b2d.particle_system_def(radius=0.1)\n", - "psystem = world.create_particle_system(pdef)\n", - "\n", - "emitter_pos = (0, 0)\n", - "emitter_def = b2d.RandomizedLinearEmitterDef()\n", - "emitter_def.emite_rate = 400\n", - "emitter_def.lifetime = 5.1\n", - "emitter_def.size = (2, 1)\n", - "emitter_def.velocity = (6, 20)\n", - "emitter = b2d.RandomizedLinearEmitter(psystem, emitter_def)\n", - "b2d.plot.animate_world(world, ppm=20, t=10, bounding_box=((-10,-20),(20,5)), pre_step=emitter.step)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ea9d7882-d3a4-45bb-b59b-cb1c9cd33990", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/pyodide/pyb2d/color_mixing.ipynb b/content/pyodide/pyb2d/color_mixing.ipynb deleted file mode 100644 index 9dc274c..0000000 --- a/content/pyodide/pyb2d/color_mixing.ipynb +++ /dev/null @@ -1,123 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from b2d.testbed import TestbedBase\n", - "import random\n", - "import numpy\n", - "import b2d\n", - "\n", - "class ColorMixing(TestbedBase):\n", - "\n", - " name = \"ColorMixing\"\n", - "\n", - " def __init__(self, settings=None):\n", - " super(ColorMixing, self).__init__(settings=settings)\n", - " dimensions = [30, 30]\n", - "\n", - " # the outer box\n", - " box_shape = b2d.ChainShape()\n", - " box_shape.create_loop(\n", - " [\n", - " (0, 0),\n", - " (0, dimensions[1]),\n", - " (dimensions[0], dimensions[1]),\n", - " (dimensions[0], 0),\n", - " ]\n", - " )\n", - " box = self.world.create_static_body(position=(0, 0), shape=box_shape)\n", - "\n", - " fixtureA = b2d.fixture_def(\n", - " shape=b2d.circle_shape(1), density=2.2, friction=0.2, restitution=0.5\n", - " )\n", - " body = self.world.create_dynamic_body(position=(13, 10), fixtures=fixtureA)\n", - "\n", - " pdef = b2d.particle_system_def(\n", - " viscous_strength=0.9,\n", - " spring_strength=0.0,\n", - " damping_strength=0.5,\n", - " pressure_strength=0.5,\n", - " color_mixing_strength=0.008,\n", - " density=2,\n", - " )\n", - " psystem = self.world.create_particle_system(pdef)\n", - " psystem.radius = 0.3\n", - " psystem.damping = 1.0\n", - "\n", - " colors = [\n", - " (255, 0, 0, 255),\n", - " (0, 255, 0, 255),\n", - " (0, 0, 255, 255),\n", - " (255, 255, 0, 255),\n", - " ]\n", - " posiitons = [(6, 10), (20, 10), (20, 20), (6, 20)]\n", - " for color, pos in zip(colors, posiitons):\n", - "\n", - " shape = b2d.polygon_shape(box=(5, 5), center=pos, angle=0)\n", - " pgDef = b2d.particle_group_def(\n", - " flags=b2d.ParticleFlag.waterParticle\n", - " | b2d.ParticleFlag.colorMixingParticle,\n", - " # group_flags=b2d.ParticleGroupFlag.solidParticleGroup,\n", - " shape=shape,\n", - " strength=1.0,\n", - " color=color,\n", - " )\n", - " group = psystem.create_particle_group(pgDef)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "\n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [1000,500]\n", - "s.scale = 8\n", - "s.fps = 40\n", - "\n", - "tb = b2d.testbed.run(ColorMixing, backend=JupyterAsyncGui, gui_settings=s)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/pyb2d/games/angry_shapes.ipynb b/content/pyodide/pyb2d/games/angry_shapes.ipynb deleted file mode 100644 index cb199ef..0000000 --- a/content/pyodide/pyb2d/games/angry_shapes.ipynb +++ /dev/null @@ -1,419 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "2859de40-f927-4790-b192-c5b0531058f7", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ac3e93b-3e9e-4cd7-a183-0214b0dcb513", - "metadata": {}, - "outputs": [], - "source": [ - "from b2d.testbed import TestbedBase\n", - "import math\n", - "import numpy\n", - "import b2d\n", - "\n", - "class AngryShapes(TestbedBase):\n", - "\n", - " name = \"AngryShapes\"\n", - "\n", - " class Settings(TestbedBase.Settings):\n", - " substeps: int = 2\n", - "\n", - " def draw_segment(self, p1, p2, color, line_width=1):\n", - " screen_p1 = self._point(self.world_to_screen(p1))\n", - " screen_p2 = self._point(self.world_to_screen(p2))\n", - " screen_color = self._uint8_color(color)\n", - " screen_line_width = self._line_width(line_width)\n", - "\n", - " cv.line(self._image, screen_p1, screen_p2, screen_color, screen_line_width)\n", - "\n", - " def draw_polygon(self, vertices, color, line_width=1):\n", - " # todo add C++ function for this\n", - " screen_vertices = numpy.array(\n", - " [self._point(self.world_to_screen(v)) for v in vertices], dtype=\"int32\"\n", - " )\n", - " screen_color = self._uint8_color(color)\n", - " screen_line_width = self._line_width(line_width)\n", - "\n", - " cv.polylines(\n", - " self._image, [screen_vertices], True, screen_color, screen_line_width, 8\n", - " )\n", - "\n", - " def draw_solid_polygon(self, vertices, color):\n", - " # todo add C++ function for this\n", - " screen_vertices = numpy.array(\n", - " [self._point(self.world_to_screen(v)) for v in vertices], dtype=\"int32\"\n", - " )\n", - " screen_color = self._uint8_color(color)\n", - "\n", - " cv.fillPoly(self._image, [screen_vertices], screen_color, 8)\n", - "\n", - " def __init__(self, settings=None):\n", - " super(AngryShapes, self).__init__(settings=settings)\n", - "\n", - " self.targets = []\n", - " self.projectiles = []\n", - " self.marked_for_destruction = []\n", - " self.emitter = None\n", - "\n", - " # particle system\n", - " pdef = b2d.particle_system_def(\n", - " viscous_strength=0.9,\n", - " spring_strength=0.0,\n", - " damping_strength=100.5,\n", - " pressure_strength=1.0,\n", - " color_mixing_strength=0.05,\n", - " density=0.1,\n", - " )\n", - "\n", - " self.psystem = self.world.create_particle_system(pdef)\n", - " self.psystem.radius = 1\n", - " self.psystem.damping = 0.5\n", - "\n", - " self.build_outer_box()\n", - " self.build_castle()\n", - " self.build_launcher()\n", - " self.arm_launcher()\n", - " self.build_explosives()\n", - "\n", - " def build_outer_box(self):\n", - " # the outer box\n", - "\n", - " shape = b2d.edge_shape([(100, 0), (600, 0)])\n", - " box = self.world.create_static_body(\n", - " position=(0, 0), fixtures=b2d.fixture_def(shape=shape, friction=1)\n", - " )\n", - "\n", - " def build_target(self, pos):\n", - " t = self.world.create_dynamic_body(\n", - " position=pos,\n", - " fixtures=[\n", - " b2d.fixture_def(shape=b2d.circle_shape(radius=4), density=1.0),\n", - " b2d.fixture_def(\n", - " shape=b2d.circle_shape(radius=2, pos=(3, 3)), density=1.0\n", - " ),\n", - " b2d.fixture_def(\n", - " shape=b2d.circle_shape(radius=2, pos=(-3, 3)), density=1.0\n", - " ),\n", - " ],\n", - " linear_damping=0,\n", - " angular_damping=0,\n", - " user_data=\"target\",\n", - " )\n", - " self.targets.append(t)\n", - "\n", - " def build_castle(self):\n", - " def build_pyramid(offset, bar_shape, n):\n", - " def build_brick(pos, size):\n", - " hsize = [s / 2 for s in size]\n", - " self.world.create_dynamic_body(\n", - " position=(\n", - " pos[0] + hsize[0] + offset[0],\n", - " pos[1] + hsize[1] + offset[1],\n", - " ),\n", - " fixtures=b2d.fixture_def(\n", - " shape=b2d.polygon_shape(box=hsize), density=8\n", - " ),\n", - " user_data=\"brick\",\n", - " )\n", - "\n", - " bar_length = bar_shape[0]\n", - " bar_width = bar_shape[1]\n", - "\n", - " nxm = n\n", - " for y in range(nxm):\n", - " py = y * (bar_length + bar_width)\n", - " nx = nxm - y\n", - " for x in range(nx):\n", - " px = x * bar_length + y * (bar_length) / 2.0\n", - " if y + 1 < nxm - 1:\n", - " if x == 0:\n", - " px += bar_width / 2\n", - " if x + 1 == nx:\n", - " px -= bar_width / 2\n", - "\n", - " build_brick((px, py), (bar_width, bar_length))\n", - " if x < nx - 1:\n", - " self.build_target(\n", - " pos=(\n", - " px + offset[0] + bar_length / 2,\n", - " py + offset[1] + bar_width,\n", - " )\n", - " )\n", - " build_brick(\n", - " (px + bar_width / 2, py + bar_length),\n", - " (bar_length, bar_width),\n", - " )\n", - "\n", - " build_pyramid(offset=(100, 0), bar_shape=[40, 4], n=4)\n", - " build_pyramid(offset=(400, 0), bar_shape=[30, 3], n=4)\n", - "\n", - " def build_launcher(self):\n", - "\n", - " self.launcher_anchor_pos = (30, 0)\n", - " self.launcher_anchor = self.world.create_static_body(\n", - " position=self.launcher_anchor_pos\n", - " )\n", - "\n", - " def arm_launcher(self):\n", - " self.reload_time = None\n", - " self.is_armed = True\n", - " self.projectile_radius = 3\n", - " projectile_pos = (self.launcher_anchor_pos[0], self.launcher_anchor_pos[1] / 2)\n", - "\n", - " self.projectile = self.world.create_dynamic_body(\n", - " position=projectile_pos,\n", - " fixtures=b2d.fixture_def(\n", - " shape=b2d.circle_shape(radius=self.projectile_radius), density=100.0\n", - " ),\n", - " linear_damping=0,\n", - " angular_damping=0,\n", - " user_data=\"projectile\",\n", - " )\n", - " self.projectiles.append(self.projectile)\n", - " self.projectile_joint = self.world.create_distance_joint(\n", - " self.launcher_anchor, self.projectile, length=1, stiffness=10000\n", - " )\n", - " self.mouse_joint = None\n", - "\n", - " def build_explosives(self):\n", - " self.explosives = []\n", - "\n", - " def on_mouse_down(self, p):\n", - " if self.is_armed:\n", - " body = self.world.find_body(pos=p)\n", - " if body is not None and body.user_data is not None:\n", - " print(\"got body\")\n", - " if body.user_data == \"projectile\":\n", - " print(\"got projectile\")\n", - " kwargs = dict(\n", - " body_a=self.groundbody,\n", - " body_b=body,\n", - " target=p,\n", - " max_force=50000.0 * body.mass,\n", - " stiffness=10000.0,\n", - " )\n", - "\n", - " self.mouse_joint = self.world.create_mouse_joint(**kwargs)\n", - " body.awake = True\n", - " return True\n", - "\n", - " return False\n", - "\n", - " def on_mouse_move(self, p):\n", - " if self.is_armed:\n", - " if self.mouse_joint is not None:\n", - " self.mouse_joint.target = p\n", - " return True\n", - " return False\n", - "\n", - " def on_mouse_up(self, p):\n", - " if self.is_armed:\n", - " if self.mouse_joint is not None:\n", - " self.world.destroy_joint(self.mouse_joint)\n", - " if self.projectile_joint is not None:\n", - " self.world.destroy_joint(self.projectile_joint)\n", - " self.projectile_joint = None\n", - " self.mouse_joint = None\n", - " delta = self.launcher_anchor.position - b2d.vec2(p)\n", - " scaled_delta = delta * 50000.0\n", - " print(scaled_delta)\n", - "\n", - " self.projectile.apply_linear_impulse_to_center(scaled_delta, True)\n", - " self.reload_time = self.elapsed_time + 1.0\n", - " self.is_armed = False\n", - " return False\n", - "\n", - " def begin_contact(self, contact):\n", - " body_a = contact.body_a\n", - " body_b = contact.body_b\n", - " ud_a = body_a.user_data\n", - " ud_b = body_b.user_data\n", - " if ud_b == \"projectile\":\n", - " body_a, body_b = body_b, body_a\n", - " ud_a, ud_b = ud_b, ud_a\n", - " if ud_a == \"projectile\":\n", - "\n", - " if ud_b == \"target\" or ud_b == \"brick\":\n", - " self.marked_for_destruction.append(body_a)\n", - " emitter_def = b2d.RandomizedRadialEmitterDef()\n", - " emitter_def.emite_rate = 20000\n", - " emitter_def.lifetime = 0.7\n", - " emitter_def.enabled = True\n", - " emitter_def.inner_radius = 0.0\n", - " emitter_def.outer_radius = 1.0\n", - " emitter_def.velocity_magnitude = 1000.0\n", - " emitter_def.start_angle = 0\n", - " emitter_def.stop_angle = math.pi\n", - " emitter_def.transform = b2d.Transform(body_a.position, b2d.Rot(0))\n", - " self.emitter = b2d.RandomizedRadialEmitter(self.psystem, emitter_def)\n", - " self.emitter_die_time = self.elapsed_time + 0.02\n", - "\n", - " def pre_step(self, dt):\n", - "\n", - " if self.reload_time is not None:\n", - " if self.elapsed_time >= self.reload_time:\n", - " self.arm_launcher()\n", - "\n", - " # delete contact bodies\n", - " for body in self.marked_for_destruction:\n", - " if body in self.projectiles:\n", - " self.projectiles.remove(body)\n", - " self.world.destroy_body(body)\n", - " if body == self.projectile:\n", - " self.reload_time = self.elapsed_time + 1.0\n", - " self.marked_for_destruction = []\n", - "\n", - " # delete bodies which have fallen down\n", - " for body in self.world.bodies:\n", - " if body.position.y < -100:\n", - " if body.user_data == \"projectile\":\n", - " self.projectiles.remove(body)\n", - " if body.user_data == \"target\":\n", - " self.targets.remove(body)\n", - " self.world.destroy_body(body)\n", - "\n", - " # emmiter\n", - " if self.emitter is not None:\n", - " self.emitter.step(dt)\n", - " if self.elapsed_time >= self.emitter_die_time:\n", - " self.emitter = None\n", - "\n", - " def draw_target(self, target):\n", - " center = target.position\n", - " center_l = target.get_world_point((-3, 3))\n", - " center_r = target.get_world_point((3, 3))\n", - " eye_left = target.get_world_point((-1, 1))\n", - " eye_right = target.get_world_point((1, 1))\n", - " pink = [c / 255 for c in (248, 24, 148)]\n", - "\n", - " self.debug_draw.draw_solid_circle(\n", - " center=center, radius=4, axis=None, color=pink\n", - " )\n", - " self.debug_draw.draw_solid_circle(\n", - " center=center_l, radius=2, axis=None, color=pink\n", - " )\n", - " self.debug_draw.draw_solid_circle(\n", - " center=center_r, radius=2, axis=None, color=pink\n", - " )\n", - "\n", - " # schnautze\n", - " nose_center = target.get_world_point((0, -1))\n", - " nose_center_l = target.get_world_point((-0.3, -1))\n", - " nose_center_r = target.get_world_point((0.3, -1))\n", - "\n", - " self.debug_draw.draw_circle(\n", - " center=nose_center,\n", - " radius=2,\n", - " # axis=None,\n", - " color=(1, 1, 1),\n", - " line_width=0.2,\n", - " )\n", - " # eyes\n", - " for nose_center in [nose_center_l, nose_center_r]:\n", - " self.debug_draw.draw_solid_circle(\n", - " center=nose_center, radius=0.6, axis=None, color=(1, 1, 1)\n", - " )\n", - " # eyes\n", - " for eye_center in [eye_left, eye_right]:\n", - " self.debug_draw.draw_solid_circle(\n", - " center=eye_center, radius=1, axis=None, color=(1, 1, 1)\n", - " )\n", - " self.debug_draw.draw_solid_circle(\n", - " center=eye_center, radius=0.7, axis=None, color=(0, 0, 0)\n", - " )\n", - "\n", - " def draw_projectile(self, projectile):\n", - "\n", - " center = projectile.position\n", - " # center_l = target.get_world_point((-3,3))\n", - " # center_r = target.get_world_point(( 3,3))\n", - " eye_left = projectile.get_world_point((-1, 1))\n", - " eye_right = projectile.get_world_point((1, 1))\n", - "\n", - " self.debug_draw.draw_solid_circle(\n", - " center=center,\n", - " radius=self.projectile_radius * 1.1,\n", - " axis=None,\n", - " color=(1, 0, 0),\n", - " )\n", - "\n", - " # eyes\n", - " for eye_center in [eye_left, eye_right]:\n", - " self.debug_draw.draw_solid_circle(\n", - " center=eye_center, radius=1, axis=None, color=(1, 1, 1)\n", - " )\n", - " self.debug_draw.draw_solid_circle(\n", - " center=eye_center, radius=0.7, axis=None, color=(0, 0, 0)\n", - " )\n", - "\n", - " def post_debug_draw(self):\n", - " for target in self.targets:\n", - " self.draw_target(target)\n", - "\n", - " for projectile in self.projectiles:\n", - " self.draw_projectile(projectile)" - ] - }, - { - "cell_type": "markdown", - "id": "6df7c8b9-216b-4fd2-8ee8-aeec294e149d", - "metadata": {}, - "source": [ - "# Controlls\n", - "* To play this game, click and drag the red ball and release it to shot it.\n", - "* Use the mouse-wheel to zoom in/out, a\n", - "* Click and drag in the empty space to translate the view." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "df412e76-7a9a-4e1d-8bc7-c02e222e10dc", - "metadata": {}, - "outputs": [], - "source": [ - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [1000,500]\n", - "s.scale = 2\n", - "s.translate = [100,100]\n", - "tb = b2d.testbed.run(AngryShapes, backend=JupyterAsyncGui, gui_settings=s);" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/pyodide/pyb2d/games/billiard.ipynb b/content/pyodide/pyb2d/games/billiard.ipynb deleted file mode 100644 index 13fff3a..0000000 --- a/content/pyodide/pyb2d/games/billiard.ipynb +++ /dev/null @@ -1,299 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy\n", - "import b2d\n", - "import math\n", - "import random\n", - "\n", - "from b2d.testbed import TestbedBase\n", - "\n", - "class Billiard(TestbedBase):\n", - "\n", - " name = \"Billiard\"\n", - "\n", - " def __init__(self, settings=None):\n", - " super(Billiard, self).__init__(gravity=(0, 0), settings=settings)\n", - " dimensions = [30, 50]\n", - " self.dimensions = dimensions\n", - "\n", - " # the outer box\n", - " box_shape = b2d.ChainShape()\n", - " box_shape.create_loop(\n", - " [\n", - " (0, 0),\n", - " (0, dimensions[1]),\n", - " (dimensions[0], dimensions[1]),\n", - " (dimensions[0], 0),\n", - " ]\n", - " )\n", - " self.ball_radius = 1\n", - " box = self.world.create_static_body(\n", - " position=(0, 0), fixtures=b2d.fixture_def(shape=box_shape, friction=0)\n", - " )\n", - "\n", - " self.place_balls()\n", - " self.place_pockets()\n", - "\n", - " # mouse interaction\n", - " self._selected_ball = None\n", - " self._selected_ball_pos = None\n", - " self._last_pos = None\n", - "\n", - " # balls to be destroyed in the next step\n", - " # since they are in the pocket\n", - " self._to_be_destroyed = []\n", - "\n", - " def place_pockets(self):\n", - " pocket_radius = 1\n", - " self.pockets = []\n", - "\n", - " def place_pocket(position):\n", - " pocket_shape = b2d.circle_shape(radius=pocket_radius / 3)\n", - " pocket = self.world.create_static_body(\n", - " position=position,\n", - " fixtures=b2d.fixture_def(shape=pocket_shape, is_sensor=True),\n", - " user_data=(\"pocket\", None),\n", - " )\n", - " self.pockets.append(pocket)\n", - "\n", - " d = pocket_radius / 2\n", - "\n", - " place_pocket(position=(0 + d, 0 + d))\n", - " place_pocket(position=(self.dimensions[0] - d, 0 + d))\n", - "\n", - " place_pocket(position=(0 + d, self.dimensions[1] / 2))\n", - " place_pocket(position=(self.dimensions[0] - d, self.dimensions[1] / 2))\n", - "\n", - " place_pocket(position=(0 + d, self.dimensions[1] - d))\n", - " place_pocket(position=(self.dimensions[0] - d, self.dimensions[1] - d))\n", - "\n", - " def place_balls(self):\n", - " self.balls = []\n", - "\n", - " base_colors = [\n", - " (1, 1, 0),\n", - " (0, 0, 1),\n", - " (1, 0, 0),\n", - " (1, 0, 1),\n", - " (1, 0.6, 0),\n", - " (0, 1, 0),\n", - " (0.7, 0.4, 0.4),\n", - " ]\n", - " colors = []\n", - " for color in base_colors:\n", - " # ``full`` ball\n", - " colors.append((color, color))\n", - " # ``half`` ball (half white)\n", - " colors.append((color, (1, 1, 1)))\n", - "\n", - " random.shuffle(colors)\n", - " colors.insert(4, ((0, 0, 0), (0, 0, 0))) # black\n", - "\n", - " n_y = 5\n", - " c_x = self.dimensions[0] / 2\n", - " diameter = (self.ball_radius * 2) * 1.01\n", - "\n", - " bi = 0\n", - " for y in range(n_y):\n", - "\n", - " py = y * diameter * 0.5 * math.sqrt(3)\n", - " n_x = y + 1\n", - " ox = diameter * (n_y - y) / 2\n", - " for x in range(y + 1):\n", - " position = (x * diameter + 10 + ox, py + 30)\n", - " self.create_billard_ball(position=position, color=colors[bi])\n", - " bi += 1\n", - "\n", - " self.create_billard_ball(position=(c_x, 10), color=((1, 1, 1), (1, 1, 1)))\n", - "\n", - " def create_billard_ball(self, position, color):\n", - "\n", - " ball = self.world.create_dynamic_body(\n", - " position=position,\n", - " fixtures=b2d.fixture_def(\n", - " shape=b2d.circle_shape(radius=self.ball_radius),\n", - " density=1.0,\n", - " restitution=0.8,\n", - " ),\n", - " linear_damping=0.8,\n", - " user_data=(\"ball\", color),\n", - " fixed_rotation=True,\n", - " )\n", - " self.balls.append(ball)\n", - "\n", - " def begin_contact(self, contact):\n", - " body_a = contact.body_a\n", - " body_b = contact.body_b\n", - "\n", - " ud_a = body_a.user_data\n", - " ud_b = body_b.user_data\n", - " if ud_a is None or ud_b is None:\n", - " return\n", - "\n", - " if ud_b[0] == \"ball\":\n", - " body_a, body_b = body_b, body_a\n", - " ud_a, ud_b = ud_b, ud_a\n", - "\n", - " if ud_a[0] == \"ball\" and ud_b[0] == \"pocket\":\n", - " self._to_be_destroyed.append(body_a)\n", - "\n", - " def pre_step(self, dt):\n", - " for b in self._to_be_destroyed:\n", - " self.balls.remove(b)\n", - " self.world.destroy_body(b)\n", - " self._to_be_destroyed = []\n", - "\n", - " def ball_at_position(self, pos):\n", - " body = self.world.find_body(pos)\n", - " if body is not None:\n", - " user_data = body.user_data\n", - " if user_data is not None and user_data[0] == \"ball\":\n", - " return body\n", - " return None\n", - "\n", - " def on_mouse_down(self, pos):\n", - " body = self.ball_at_position(pos)\n", - " if body is not None:\n", - " self._selected_ball = body\n", - " self._selected_ball_pos = pos\n", - " return True\n", - "\n", - " return False\n", - "\n", - " def on_mouse_move(self, pos):\n", - " if self._selected_ball is not None:\n", - " self._last_pos = pos\n", - " return True\n", - " return False\n", - "\n", - " def on_mouse_up(self, pos):\n", - " if self._selected_ball is not None:\n", - " self._last_pos = pos\n", - " # if the mouse is in the starting ball itself we do nothing\n", - " if self.ball_at_position(pos) != self._selected_ball:\n", - " delta = b2d.vec2(self._selected_ball_pos) - b2d.vec2(self._last_pos)\n", - " delta *= 100.0\n", - " self._selected_ball.apply_linear_impulse(\n", - " delta, self._selected_ball_pos, True\n", - " )\n", - " self._selected_ball = None\n", - " self._selected_ball_pos = None\n", - " self._last_pos = None\n", - " return False\n", - "\n", - " def post_debug_draw(self):\n", - "\n", - " for pocket in self.pockets:\n", - " self.debug_draw.draw_solid_circle(\n", - " pocket.position, self.ball_radius, (1, 0), (1, 1, 1)\n", - " )\n", - "\n", - " for ball in self.balls:\n", - " _, (color0, color1) = ball.user_data\n", - "\n", - " self.debug_draw.draw_solid_circle(\n", - " ball.position, self.ball_radius, (1, 0), color0\n", - " )\n", - " self.debug_draw.draw_solid_circle(\n", - " ball.position, self.ball_radius / 2, (1, 0), color1\n", - " )\n", - " self.debug_draw.draw_circle(\n", - " ball.position, self.ball_radius, (1, 1, 1), line_width=0.1\n", - " )\n", - "\n", - " if self._selected_ball is not None:\n", - "\n", - " # draw circle around selected ball\n", - " self.debug_draw.draw_circle(\n", - " self._selected_ball.position,\n", - " self.ball_radius * 2,\n", - " (1, 1, 1),\n", - " line_width=0.2,\n", - " )\n", - "\n", - " # mark position on selected ball with red dot\n", - " self.debug_draw.draw_solid_circle(\n", - " self._selected_ball_pos, self.ball_radius * 0.2, (1, 0), (1, 0, 0)\n", - " )\n", - "\n", - " # draw the line between marked pos on ball and last pos\n", - " if self._last_pos is not None:\n", - " self.debug_draw.draw_segment(\n", - " self._selected_ball_pos, self._last_pos, (1, 1, 1), line_width=0.2\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Controlls\n", - "* To play this game, click and hold inside a billiard ball, move and release the mouse to shoot the ball.\n", - "* Use the mouse-wheel to zoom in/out, a\n", - "* Click and drag in the empty space to translate the view." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "backend = JupyterAsyncGui\n", - "s = backend.Settings()\n", - "s.resolution = [500,600]\n", - "s.scale = 8\n", - "s.fps = 40\n", - "s.translate = [125,100]\n", - "b2d.testbed.run(Billiard, backend=backend, gui_settings=s);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/pyb2d/games/goo.ipynb b/content/pyodide/pyb2d/games/goo.ipynb deleted file mode 100644 index cbe018c..0000000 --- a/content/pyodide/pyb2d/games/goo.ipynb +++ /dev/null @@ -1,575 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('networkx')\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import b2d\n", - "from b2d.testbed import TestbedBase\n", - "import math\n", - "import random\n", - "import numpy\n", - "from functools import partial\n", - "import networkx\n", - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "\n", - "def best_pairwise_distance(data, f, distance):\n", - " n = len(data)\n", - " best = (None, None, float(\"inf\"))\n", - " for i in range(n - 1):\n", - " da = f(data[i])\n", - " for j in range(i + 1, n):\n", - " db = f(data[j])\n", - "\n", - " d = distance(da, db)\n", - " if d < best[2]:\n", - " best = (i, j, d)\n", - " return best\n", - "\n", - "class Level(object):\n", - " def __init__(self, testbed):\n", - " self.testbed = testbed\n", - " self.world = testbed.world\n", - "\n", - " self.gap_size = 15\n", - " self.kill_sensors_height = 0.5\n", - " self.usable_size = 20\n", - " self.h = 10\n", - " self.end_zone_height = 3\n", - "\n", - " self.outline_verts = [\n", - " (0, self.h),\n", - " (0, 2 * self.h),\n", - " (0, self.h),\n", - " (self.usable_size, self.h),\n", - " (self.usable_size, 0),\n", - " (self.usable_size + self.gap_size, 0),\n", - " (self.usable_size + self.gap_size, self.h),\n", - " (2 * self.usable_size + self.gap_size, self.h),\n", - " (2 * self.usable_size + self.gap_size, 2 * self.h),\n", - " ]\n", - "\n", - " # outline of the level\n", - " shape = b2d.chain_shape(vertices=numpy.flip(self.outline_verts, axis=0))\n", - " self.outline = self.world.create_static_body(position=(0, 0), shape=shape)\n", - "\n", - " # kill sensors\n", - " self.kill_sensor_pos = (\n", - " self.usable_size + self.gap_size / 2,\n", - " self.kill_sensors_height / 2,\n", - " )\n", - "\n", - " shape = b2d.polygon_shape(box=(self.gap_size / 2, self.kill_sensors_height / 2))\n", - " self._kill_sensor = self.world.create_static_body(\n", - " position=self.kill_sensor_pos,\n", - " fixtures=b2d.fixture_def(shape=shape, is_sensor=True),\n", - " )\n", - " self._kill_sensor.user_data = \"destroyer\"\n", - "\n", - " # end sensor\n", - " shape = b2d.polygon_shape(box=(self.usable_size / 2, self.end_zone_height / 2))\n", - " self._end_sensor = self.world.create_static_body(\n", - " position=(\n", - " 1.5 * self.usable_size + self.gap_size,\n", - " self.h + self.end_zone_height / 2,\n", - " ),\n", - " fixtures=b2d.fixture_def(shape=shape, is_sensor=True),\n", - " )\n", - " self._end_sensor.user_data = \"goal\"\n", - "\n", - " goo_radius = 1\n", - " a = self.testbed.insert_goo(\n", - " pos=(self.usable_size / 3, self.h + goo_radius), static=True\n", - " )\n", - " b = self.testbed.insert_goo(\n", - " pos=(self.usable_size * 2 / 3, self.h + goo_radius), static=True\n", - " )\n", - " c = self.testbed.insert_goo(\n", - " pos=(self.usable_size * 1 / 2, self.h + goo_radius + 4), static=False\n", - " )\n", - "\n", - " self.testbed.connect_goos(a, b)\n", - " self.testbed.connect_goos(a, c)\n", - " self.testbed.connect_goos(b, c)\n", - "\n", - " def draw(self, debug_draw):\n", - "\n", - " # draw outline\n", - " for i in range(len(self.outline_verts) - 1):\n", - " debug_draw.draw_segment(\n", - " self.outline_verts[i],\n", - " self.outline_verts[i + 1],\n", - " color=(1, 1, 0),\n", - " line_width=0.3,\n", - " )\n", - "\n", - " left = list(self.kill_sensor_pos)\n", - " left[0] -= self.gap_size / 2\n", - " left[1] += self.kill_sensors_height / 2\n", - "\n", - " right = list(self.kill_sensor_pos)\n", - " right[0] += self.gap_size / 2\n", - " right[1] += self.kill_sensors_height / 2\n", - " debug_draw.draw_segment(left, right, (1, 0, 0), line_width=0.4)\n", - "\n", - "\n", - "class FindGoos(b2d.QueryCallback):\n", - " def __init__(self):\n", - " super(FindGoos, self).__init__()\n", - " self.goos = []\n", - "\n", - " def report_fixture(self, fixture):\n", - " body = fixture.body\n", - " if body.user_data == \"goo\":\n", - " self.goos.append(body)\n", - " return True\n", - "\n", - "\n", - "class Goo(TestbedBase):\n", - "\n", - " name = \"Goo\"\n", - "\n", - " def __init__(self, settings=None):\n", - " super(Goo, self).__init__(settings=settings)\n", - "\n", - " self.goo_graph = networkx.Graph()\n", - " self.level = Level(testbed=self)\n", - "\n", - " # mouse related\n", - " self.last_mouse_pos = None\n", - " self.is_mouse_down = False\n", - " self.could_place_goo_when_mouse_was_down = False\n", - "\n", - " # callback to draw tentative placement\n", - " self.draw_callback = None\n", - "\n", - " # goos marked for destruction\n", - " self.goo_to_destroy = []\n", - "\n", - " # joints marked for destruction\n", - " self.joints_to_destroy = []\n", - " self.gamma = 0.003\n", - " self.break_threshold = 0.5\n", - "\n", - " # time point when goo can be inserted\n", - " self.insert_time_point = 0\n", - " self.insert_delay = 1.0\n", - "\n", - " # handle finishing of level\n", - " self.with_goal_contact = dict()\n", - "\n", - " # amount of seconds one has to be in the finishing zone\n", - " self.win_delay = 3.0\n", - "\n", - " # particle system will be defined an used on win!\n", - " # this is then used for some kind of fireworks\n", - " self.psystem = None\n", - " self.emitter = None\n", - " self.emitter_stop_time = None\n", - " self.emitter_start_time = None\n", - "\n", - " # trigger some fireworks on win\n", - " def on_win(self, win_body):\n", - "\n", - " if self.psystem is None:\n", - " # particle system\n", - " pdef = b2d.particle_system_def(\n", - " viscous_strength=0.9,\n", - " spring_strength=0.0,\n", - " damping_strength=100.5,\n", - " pressure_strength=1.0,\n", - " color_mixing_strength=0.05,\n", - " density=0.1,\n", - " )\n", - "\n", - " self.psystem = self.world.create_particle_system(pdef)\n", - " self.psystem.radius = 0.1\n", - " self.psystem.damping = 0.5\n", - "\n", - " emitter_def = b2d.RandomizedRadialEmitterDef()\n", - " emitter_def.emite_rate = 2000\n", - " emitter_def.lifetime = 0.9\n", - " emitter_def.enabled = True\n", - " emitter_def.inner_radius = 0.0\n", - " emitter_def.outer_radius = 0.1\n", - " emitter_def.velocity_magnitude = 1000.0\n", - " emitter_def.start_angle = 0\n", - " emitter_def.stop_angle = 2 * math.pi\n", - " emitter_def.transform = b2d.Transform(\n", - " win_body.position + b2d.vec2(0, 20), b2d.Rot(0)\n", - " )\n", - " self.emitter = b2d.RandomizedRadialEmitter(self.psystem, emitter_def)\n", - " self.emitter_stop_time = self.elapsed_time + 0.2\n", - "\n", - " def draw_goo(self, pos, angle, body=None):\n", - " self.debug_draw.draw_solid_circle(pos, 1, axis=None, color=(1, 0, 1))\n", - " self.debug_draw.draw_circle(pos, 1.1, (1, 1, 1), line_width=0.1)\n", - "\n", - " if body is not None:\n", - " centers = [\n", - " body.get_world_point((-0.3, 0.2)),\n", - " body.get_world_point((0.3, 0.2)),\n", - " ]\n", - " for center in centers:\n", - " self.debug_draw.draw_solid_circle(\n", - " center, 0.4, axis=None, color=(1, 1, 1)\n", - " )\n", - " self.debug_draw.draw_solid_circle(\n", - " center, 0.2, axis=None, color=(0, 0, 0)\n", - " )\n", - "\n", - " def draw_edge(self, pos_a, pos_b, stress):\n", - " no_stress = numpy.array([1, 1, 1])\n", - " has_stress = numpy.array([1, 0, 0])\n", - " color = (1.0 - stress) * no_stress + stress * has_stress\n", - " color = tuple([float(c) for c in color])\n", - " self.debug_draw.draw_segment(pos_a, pos_b, color=color, line_width=0.4)\n", - "\n", - " def insert_goo(self, pos, static=False):\n", - " if static:\n", - " f = self.world.create_static_body\n", - " else:\n", - " f = self.world.create_dynamic_body\n", - "\n", - " goo = f(\n", - " position=pos,\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=1), density=1),\n", - " user_data=\"goo\",\n", - " )\n", - " self.goo_graph.add_node(goo)\n", - " return goo\n", - "\n", - " def connect_goos(self, goo_a, goo_b):\n", - " length = (goo_a.position - goo_b.position).length\n", - " joint = self.world.create_distance_joint(\n", - " goo_a,\n", - " goo_b,\n", - " stiffness=500,\n", - " damping=0.1,\n", - " length=length,\n", - " user_data=dict(length=length, stress=0),\n", - " )\n", - " self.goo_graph.add_edge(goo_a, goo_b, joint=joint)\n", - "\n", - " def query_placement(self, pos):\n", - "\n", - " radius = 8\n", - "\n", - " # find all goos in around pos\n", - " pos = b2d.vec2(pos)\n", - " box = b2d.aabb(\n", - " lower_bound=pos - b2d.vec2(radius, radius),\n", - " upper_bound=pos + b2d.vec2(radius, radius),\n", - " )\n", - " query = FindGoos()\n", - " self.world.query_aabb(query, box)\n", - " goos = query.goos\n", - " n_goos = len(goos)\n", - "\n", - " if n_goos >= 2:\n", - "\n", - " # try to insert to goo as edge between\n", - " # 2 existing goos\n", - " def distance(a, b, p):\n", - " if self.goo_graph.has_edge(a[0], b[0]):\n", - " return float(\"inf\")\n", - " return numpy.linalg.norm((a[1] + b[1]) / 2 - p)\n", - "\n", - " i, j, best_dist = best_pairwise_distance(\n", - " goos,\n", - " f=lambda goo: (goo, numpy.array(goo.position)),\n", - " distance=partial(distance, p=pos),\n", - " )\n", - "\n", - " if best_dist < 0.8:\n", - "\n", - " def draw_callback():\n", - " self.draw_edge(goos[i].position, goos[j].position, stress=0)\n", - "\n", - " def insert_callack():\n", - " self.connect_goos(goos[i], goos[j])\n", - "\n", - " return True, draw_callback, insert_callack\n", - "\n", - " # try to insert the goo as brand new\n", - " # goo and connect it with 2 existing goos\n", - " f = lambda goo: (goo, (goo.position - b2d.vec2(pos)).length)\n", - "\n", - " def distance(a, b):\n", - " if not self.goo_graph.has_edge(a[0], b[0]):\n", - " return float(\"inf\")\n", - " return a[1] + b[1]\n", - "\n", - " i, j, best_dist = best_pairwise_distance(goos, f=f, distance=distance)\n", - " if best_dist < float(\"inf\"):\n", - "\n", - " def draw_callback():\n", - "\n", - " self.draw_edge(pos, goos[i].position, stress=0)\n", - " self.draw_edge(pos, goos[j].position, stress=0)\n", - " self.draw_goo(pos, angle=None)\n", - "\n", - " def insert_callack():\n", - " goo = self.insert_goo(pos=pos)\n", - " self.connect_goos(goo, goos[i])\n", - " self.connect_goos(goo, goos[j])\n", - "\n", - " return True, draw_callback, insert_callack\n", - "\n", - " return False, None, None\n", - "\n", - " def on_mouse_down(self, pos):\n", - " self.last_mouse_pos = pos\n", - " self.is_mouse_down = True\n", - " can_be_placed, draw_callback, insert_callback = self.query_placement(pos)\n", - " self.could_place_goo_when_mouse_was_down = can_be_placed\n", - " if can_be_placed:\n", - " if self.elapsed_time < self.insert_time_point:\n", - " return True\n", - " self.draw_callback = draw_callback\n", - " return True\n", - " return False\n", - "\n", - " def on_mouse_move(self, pos):\n", - " self.last_mouse_pos = pos\n", - " if self.is_mouse_down:\n", - " can_be_placed, draw_callback, insert_callback = self.query_placement(pos)\n", - " if can_be_placed:\n", - " if self.elapsed_time < self.insert_time_point:\n", - " return True\n", - " self.draw_callback = draw_callback\n", - " return True\n", - " else:\n", - " self.draw_callback = None\n", - " return self.could_place_goo_when_mouse_was_down\n", - "\n", - " def on_mouse_up(self, pos):\n", - " self.last_mouse_pos = pos\n", - " self.is_mouse_down = False\n", - " self.draw_callback = None\n", - " can_be_placed, draw_callback, insert_callback = self.query_placement(pos)\n", - " if can_be_placed:\n", - " if self.elapsed_time < self.insert_time_point:\n", - " return True\n", - " # self.draw_callback = draw_callback\n", - " insert_callback()\n", - " self.insert_time_point = self.elapsed_time + self.insert_delay\n", - " return True\n", - " return False\n", - "\n", - " def begin_contact(self, contact):\n", - " body_a = contact.body_a\n", - " body_b = contact.body_b\n", - " if body_b.user_data == \"goo\":\n", - " body_a, body_b = body_b, body_a\n", - "\n", - " user_data_a = body_a.user_data\n", - " user_data_b = body_b.user_data\n", - " if body_a.user_data == \"goo\":\n", - " if user_data_b == \"destroyer\":\n", - " self.goo_to_destroy.append(body_a)\n", - " elif user_data_b == \"goal\":\n", - " self.with_goal_contact[body_a] = self.elapsed_time + self.win_delay\n", - "\n", - " def end_contact(self, contact):\n", - " body_a = contact.body_a\n", - " body_b = contact.body_b\n", - " if body_b.user_data == \"goo\":\n", - " body_a, body_b = body_b, body_a\n", - "\n", - " user_data_a = body_a.user_data\n", - " user_data_b = body_b.user_data\n", - " if body_a.user_data == \"goo\":\n", - " if user_data_b == \"goal\":\n", - " if body_a in self.with_goal_contact:\n", - " del self.with_goal_contact[body_a]\n", - "\n", - " def pre_step(self, dt):\n", - "\n", - " # query if goo can be inserted\n", - " if (\n", - " self.is_mouse_down\n", - " and self.last_mouse_pos is not None\n", - " and self.draw_callback is None\n", - " ):\n", - " can_be_placed, draw_callback, insert_callback = self.query_placement(\n", - " self.last_mouse_pos\n", - " )\n", - " if can_be_placed and self.elapsed_time >= self.insert_time_point:\n", - " self.draw_callback = draw_callback\n", - "\n", - " # compute joint stress\n", - " for goo_a, goo_b, joint in self.goo_graph.edges(data=\"joint\"):\n", - " jd = joint.user_data\n", - "\n", - " # distance based stress\n", - " insert_length = jd[\"length\"]\n", - " length = (goo_a.position - goo_b.position).length\n", - "\n", - " d = length - insert_length\n", - " if d > 0:\n", - "\n", - " # reaction force based stress\n", - " rf = joint.get_reaction_force(30).length\n", - "\n", - " normalized_rf = 1.0 - math.exp(-rf * self.gamma)\n", - "\n", - " jd[\"stress\"] = normalized_rf / self.break_threshold\n", - " if normalized_rf > self.break_threshold:\n", - " self.joints_to_destroy.append((goo_a, goo_b, joint))\n", - "\n", - " else:\n", - " jd[\"stress\"] = 0\n", - "\n", - " for goo_a, goo_b, joint in self.joints_to_destroy:\n", - " self.goo_graph.remove_edge(u=goo_a, v=goo_b)\n", - " self.world.destroy_joint(joint)\n", - " self.joints_to_destroy = []\n", - "\n", - " # destroy goos\n", - " for goo in self.goo_to_destroy:\n", - " self.goo_graph.remove_node(goo)\n", - " self.world.destroy_body(goo)\n", - "\n", - " # destroy all with wrong degree\n", - " while True:\n", - " destroyed_any = False\n", - " to_remove = []\n", - " for goo in self.goo_graph.nodes:\n", - " if self.goo_graph.degree(goo) < 2:\n", - " destroyed_any = True\n", - " to_remove.append(goo)\n", - " if not destroyed_any:\n", - " break\n", - " for goo in to_remove:\n", - " self.goo_graph.remove_node(goo)\n", - " self.world.destroy_body(goo)\n", - " self.goo_to_destroy = []\n", - "\n", - " # check if we are done\n", - " for goo, finish_time in self.with_goal_contact.items():\n", - " if finish_time <= self.elapsed_time:\n", - " self.on_win(goo)\n", - "\n", - " if self.emitter is not None:\n", - " if self.emitter_stop_time is not None:\n", - " if self.elapsed_time > self.emitter_stop_time:\n", - " self.emitter.enabled = False\n", - " self.emitter_start_time = self.elapsed_time + 0.4\n", - " self.emitter_stop_time = None\n", - " p = list(self.emitter.position)\n", - " p[0] += (random.random() - 0.5) * 10.0\n", - " p[1] += (random.random() - 0.5) * 2.0\n", - " self.emitter.position = p\n", - " if self.emitter_start_time is not None:\n", - " if self.elapsed_time > self.emitter_start_time:\n", - " self.emitter.enabled = True\n", - " self.emitter_start_time = None\n", - " self.emitter_stop_time = self.elapsed_time + 0.2\n", - " self.emitter.step(dt)\n", - "\n", - " def post_debug_draw(self):\n", - "\n", - " self.level.draw(self.debug_draw)\n", - "\n", - " # draw mouse when mouse is down\n", - " if (\n", - " self.is_mouse_down\n", - " and self.last_mouse_pos is not None\n", - " and self.draw_callback is None\n", - " ):\n", - " d = (self.insert_time_point - self.elapsed_time) / self.insert_delay\n", - " if d > 0:\n", - " d = d * math.pi * 2\n", - " x = math.sin(d)\n", - " y = math.cos(d)\n", - " p = self.last_mouse_pos[0] + x, self.last_mouse_pos[1] + y\n", - " self.debug_draw.draw_segment(\n", - " p, self.last_mouse_pos, color=(1, 0, 0), line_width=0.2\n", - " )\n", - " self.debug_draw.draw_circle(\n", - " self.last_mouse_pos, 1, (1, 0, 0), line_width=0.2\n", - " )\n", - "\n", - " # draw the tentative placement\n", - " if self.draw_callback is not None:\n", - " self.draw_callback()\n", - "\n", - " for goo_a, goo_b, joint in self.goo_graph.edges(data=\"joint\"):\n", - " self.draw_edge(\n", - " goo_a.position, goo_b.position, stress=joint.user_data[\"stress\"]\n", - " )\n", - "\n", - " for goo in self.goo_graph:\n", - " self.draw_goo(goo.position, goo.angle, body=goo)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Controlls\n", - "* To play this game, click and drag next to the existing \"goos\"\n", - "* try to bridge the tiny gap\n", - "* Use the mouse-wheel to zoom in/out, a\n", - "* Click and drag in the empty space to translate the view." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [1000,500]\n", - "s.scale = 8\n", - "tb = b2d.testbed.run(Goo, backend=JupyterAsyncGui, gui_settings=s);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/pyodide/pyb2d/games/rocket.ipynb b/content/pyodide/pyb2d/games/rocket.ipynb deleted file mode 100644 index 316e9ce..0000000 --- a/content/pyodide/pyb2d/games/rocket.ipynb +++ /dev/null @@ -1,282 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "f7b8452d-61fe-4356-8084-cac603096fef", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0bfa61e4-9817-4bea-aa66-6a660a423ae6", - "metadata": {}, - "outputs": [], - "source": [ - "from b2d.testbed import TestbedBase\n", - "import random\n", - "import numpy\n", - "import b2d\n", - "import math\n", - "\n", - "class Rocket(TestbedBase):\n", - "\n", - " name = \"Rocket\"\n", - "\n", - " def __init__(self, settings=None):\n", - " super(Rocket, self).__init__(gravity=(0, 0), settings=settings)\n", - "\n", - " # gravitational constant\n", - " self.gravitational_constant = 6.0\n", - "\n", - " self.planets = {}\n", - "\n", - " # home planet\n", - " home_planet = self.world.create_kinematic_body(\n", - " position=(10, 0),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=20)),\n", - " user_data=\"home_planet\",\n", - " )\n", - "\n", - " # target planet\n", - " target_planet = self.world.create_kinematic_body(\n", - " position=(100, 100),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=10)),\n", - " user_data=\"target_planet\",\n", - " )\n", - "\n", - " # black hole\n", - " black_hole = self.world.create_kinematic_body(\n", - " position=(0, 400),\n", - " fixtures=b2d.fixture_def(shape=b2d.circle_shape(radius=1)),\n", - " user_data=\"black_hole\",\n", - " )\n", - "\n", - " self.planets = {\n", - " home_planet: dict(radius=20, density=1, color=(0, 0.2, 1)),\n", - " target_planet: dict(radius=10, density=1, color=(0.7, 0.7, 0.7)),\n", - " black_hole: dict(radius=1, density=10000, color=(0.1, 0.1, 0.1)),\n", - " }\n", - "\n", - " # a tiny rocket\n", - " self.rocket = self.world.create_dynamic_body(\n", - " position=(10, 10),\n", - " fixtures=[\n", - " b2d.fixture_def(shape=b2d.polygon_shape(box=[1, 1]), density=1),\n", - " b2d.fixture_def(\n", - " shape=b2d.polygon_shape(vertices=[(-1, 1), (0, 4), (1, 1)]),\n", - " density=1,\n", - " ),\n", - " ],\n", - " angular_damping=0.5,\n", - " linear_damping=0.2,\n", - " user_data=\"rocket\",\n", - " )\n", - " # check if the rocket is gone\n", - " self.touched_black_hole = False\n", - "\n", - " # particle system\n", - " pdef = b2d.particle_system_def(\n", - " viscous_strength=0.9,\n", - " spring_strength=0.0,\n", - " damping_strength=100.5,\n", - " pressure_strength=1.0,\n", - " color_mixing_strength=0.05,\n", - " density=0.1,\n", - " )\n", - "\n", - " psystem = self.world.create_particle_system(pdef)\n", - " psystem.radius = 0.1\n", - " psystem.damping = 0.5\n", - "\n", - " self.emitters = []\n", - " self.key_map = {\"w\": 0, \"a\": 1, \"d\": 2}\n", - "\n", - " angle_width = (math.pi * 2) / 16\n", - " emitter_def = b2d.RandomizedRadialEmitterDef()\n", - " emitter_def.emite_rate = 2000\n", - " emitter_def.lifetime = 1.0\n", - " emitter_def.enabled = False\n", - " emitter_def.inner_radius = 1\n", - " emitter_def.outer_radius = 1\n", - " emitter_def.velocity_magnitude = 10.0\n", - " emitter_def.start_angle = math.pi / 2 - angle_width / 2.0\n", - " emitter_def.stop_angle = math.pi / 2 + angle_width / 2.0\n", - " emitter_def.body = self.rocket\n", - "\n", - " delta = 0.2\n", - " self.emitter_local_anchors = [\n", - " (0, -delta), # main\n", - " (-delta, -0.5), # left,\n", - " (delta, -0.5), # right\n", - " ]\n", - " self.emitter_local_rot = [math.pi, math.pi / 2, -math.pi / 2] # main\n", - "\n", - " # main trust\n", - " emitter_def.emite_rate = 2000\n", - " world_anchor = self.rocket.get_world_point(self.emitter_local_anchors[0])\n", - " emitter_def.transform = b2d.Transform(\n", - " world_anchor, b2d.Rot(self.emitter_local_rot[0])\n", - " )\n", - " emitter = b2d.RandomizedRadialEmitter(psystem, emitter_def)\n", - " self.emitters.append(emitter)\n", - "\n", - " # left\n", - " emitter_def.emite_rate = 200\n", - " world_anchor = self.rocket.get_world_point(self.emitter_local_anchors[1])\n", - " emitter_def.transform = b2d.Transform(\n", - " world_anchor, b2d.Rot(self.emitter_local_rot[1])\n", - " )\n", - " emitter = b2d.RandomizedRadialEmitter(psystem, emitter_def)\n", - " self.emitters.append(emitter)\n", - "\n", - " # right\n", - " emitter_def.emite_rate = 200\n", - " world_anchor = self.rocket.get_world_point(self.emitter_local_anchors[1])\n", - " emitter_def.transform = b2d.Transform(\n", - " world_anchor, b2d.Rot(self.emitter_local_rot[1])\n", - " )\n", - " emitter = b2d.RandomizedRadialEmitter(psystem, emitter_def)\n", - " self.emitters.append(emitter)\n", - "\n", - " def pre_step(self, dt):\n", - "\n", - " # check if the rocket has died\n", - " if self.touched_black_hole:\n", - " if self.rocket is not None:\n", - " self.world.destroy_body(self.rocket)\n", - " self.rocket = None\n", - " else:\n", - " rocket_center = self.rocket.world_center\n", - " rocket_mass = self.rocket.mass\n", - " # compute gravitational forces\n", - " net_force = numpy.zeros([2])\n", - " for planet, planet_def in self.planets.items():\n", - " radius = planet_def[\"radius\"]\n", - " planet_center = planet.position\n", - " planet_mass = planet_def[\"density\"] * radius ** 2 * math.pi\n", - " delta = rocket_center - planet_center\n", - " distance = delta.normalize()\n", - " f = (\n", - " -self.gravitational_constant\n", - " * rocket_mass\n", - " * planet_mass\n", - " / (distance * distance)\n", - " )\n", - " net_force += delta * f\n", - " f = float(net_force[0]), float(net_force[1])\n", - " self.rocket.apply_force_to_center(f)\n", - "\n", - " # run the rockets engines\n", - " for emitter, local_anchor, local_rotation in zip(\n", - " self.emitters, self.emitter_local_anchors, self.emitter_local_rot\n", - " ):\n", - " world_anchor = self.rocket.get_world_point(local_anchor)\n", - " emitter.position = world_anchor\n", - " emitter.angle = self.rocket.angle + local_rotation\n", - " emitter.step(dt)\n", - "\n", - " def begin_contact(self, contact):\n", - " body_a = contact.body_a\n", - " body_b = contact.body_b\n", - " if body_b.user_data == \"rocket\":\n", - " body_a, body_b = body_b, body_a\n", - "\n", - " user_data_a = body_a.user_data\n", - " user_data_b = body_b.user_data\n", - " if body_a.user_data == \"rocket\":\n", - " if user_data_b == \"black_hole\":\n", - " self.touched_black_hole = True\n", - "\n", - " def on_keyboard_down(self, key):\n", - " if key in self.key_map:\n", - " self.emitters[self.key_map[key]].enabled = True\n", - " return True\n", - " return False\n", - "\n", - " def on_keyboard_up(self, key):\n", - " if key in self.key_map:\n", - " self.emitters[self.key_map[key]].enabled = False\n", - " return False\n", - " return False\n", - "\n", - " def pre_debug_draw(self):\n", - " pass\n", - "\n", - " def post_debug_draw(self):\n", - " for planet, planet_def in self.planets.items():\n", - " pos = planet.position\n", - " self.debug_draw.draw_solid_circle(\n", - " pos, planet_def[\"radius\"] + 0.1, axis=None, color=planet_def[\"color\"]\n", - " )\n", - " if planet.user_data == \"black_hole\":\n", - " self.debug_draw.draw_circle(\n", - " pos, planet_def[\"radius\"] * 5, color=(1, 1, 1), line_width=0.1\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "357866b3-876e-421f-8d2a-77d6697551d3", - "metadata": {}, - "source": [ - "# Controlls\n", - "* To play this game, use 'w','a','s','d' on your keyboard to steer the rocket\n", - "* try to land on the other planet\n", - "* avoid the black hole\n", - "* Use the mouse-wheel to zoom in/out, a\n", - "* Click and drag in the empty space to translate the view." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7bab75b7-cec1-4348-b95d-9ffd282ded5c", - "metadata": {}, - "outputs": [], - "source": [ - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [1000,1000]\n", - "s.scale = 3\n", - "tb = b2d.testbed.run(Rocket, backend=JupyterAsyncGui, gui_settings=s);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "674c57c8-b5b1-45a9-b75e-5ddc487f7d9b", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/pyodide/pyb2d/gauss_machine.ipynb b/content/pyodide/pyb2d/gauss_machine.ipynb deleted file mode 100644 index b7bb72c..0000000 --- a/content/pyodide/pyb2d/gauss_machine.ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "39a80aae-a990-4ed8-b880-3db2e7f70f16", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9d9f8d68-0f3b-49c1-9512-e3e8344e7342", - "metadata": {}, - "outputs": [], - "source": [ - "from b2d.testbed import TestbedBase\n", - "import random\n", - "import numpy\n", - "import b2d\n", - "\n", - "\n", - "class GaussMachine(TestbedBase):\n", - "\n", - " name = \"Gauss Machine\"\n", - "\n", - " def __init__(self, settings=None):\n", - " super(GaussMachine, self).__init__(settings=settings)\n", - "\n", - " self.box_shape = 30, 20\n", - " box_shape = self.box_shape\n", - "\n", - " # outer box\n", - " verts = numpy.array(\n", - " [(0, box_shape[1]), (0, 0), (box_shape[0], 0), (box_shape[0], box_shape[1])]\n", - " )\n", - " shape = b2d.chain_shape(vertices=numpy.flip(verts, axis=0))\n", - " box = self.world.create_static_body(position=(0, 0), shape=shape)\n", - "\n", - " # \"bins\"\n", - " bin_height = box_shape[1] / 3\n", - " bin_width = 1\n", - " for x in range(0, box_shape[0], bin_width):\n", - " box = self.world.create_static_body(\n", - " position=(0, 0), shape=b2d.two_sided_edge_shape((x, 0), (x, bin_height))\n", - " )\n", - "\n", - " # reflectors\n", - " ref_start_y = int(bin_height + box_shape[1] / 10.0)\n", - " ref_stop_y = int(box_shape[1] * 0.9)\n", - " for x in range(0, box_shape[0] + 1):\n", - "\n", - " for y in range(ref_start_y, ref_stop_y):\n", - " s = [0.5, 0][y % 2 == 0]\n", - " shape = b2d.circle_shape(radius=0.3)\n", - " box = self.world.create_static_body(position=(x + s, y), shape=shape)\n", - "\n", - " # particle system\n", - " pdef = b2d.particle_system_def(\n", - " viscous_strength=0.9,\n", - " spring_strength=0.0,\n", - " damping_strength=100.5,\n", - " pressure_strength=1.0,\n", - " color_mixing_strength=0.05,\n", - " density=2,\n", - " )\n", - "\n", - " psystem = self.world.create_particle_system(pdef)\n", - " psystem.radius = 0.1\n", - " psystem.damping = 0.5\n", - "\n", - " # linear emitter\n", - " emitter_pos = (self.box_shape[0] / 2, self.box_shape[1] + 10)\n", - " emitter_def = b2d.RandomizedLinearEmitterDef()\n", - " emitter_def.emite_rate = 400\n", - " emitter_def.lifetime = 25\n", - " emitter_def.size = (10, 1)\n", - " emitter_def.transform = b2d.Transform(emitter_pos, b2d.Rot(0))\n", - "\n", - " self.emitter = b2d.RandomizedLinearEmitter(psystem, emitter_def)\n", - "\n", - " def pre_step(self, dt):\n", - " self.emitter.step(dt)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "51e5df1b-f5e6-486a-a6c0-173597198e5d", - "metadata": {}, - "outputs": [], - "source": [ - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [350,400]\n", - "s.scale = 11\n", - "tb = b2d.testbed.run(GaussMachine, backend=JupyterAsyncGui, gui_settings=s);" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/pyodide/pyb2d/newtons_cradle.ipynb b/content/pyodide/pyb2d/newtons_cradle.ipynb deleted file mode 100644 index 9ef3ff3..0000000 --- a/content/pyodide/pyb2d/newtons_cradle.ipynb +++ /dev/null @@ -1,130 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "82ae535a-a041-40f0-8c40-e689b894b0bc", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if \"pyodide\" in sys.modules:\n", - " import piplite\n", - " await piplite.install('pyb2d-jupyterlite-backend>=0.4.0')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "7381ff66-7924-4216-b141-8f7b15ed038a", - "metadata": {}, - "outputs": [], - "source": [ - "from b2d.testbed import TestbedBase\n", - "import b2d\n", - "\n", - "\n", - "class NewtonsCradle(TestbedBase):\n", - "\n", - " name = \"newton's cradle\"\n", - "\n", - " def __init__(self, settings=None):\n", - " super(NewtonsCradle, self).__init__(settings=settings)\n", - "\n", - " # radius of the circles\n", - " r = 1.0\n", - " # length of the rope\n", - " l = 10.0\n", - " # how many balls\n", - " n = 10\n", - "\n", - " offset = (l + r, 2 * r)\n", - " dynamic_circles = []\n", - " static_bodies = []\n", - " for i in range(n):\n", - " if i + 1 == n:\n", - " position = (offset[0] + i * 2 * r + l, offset[1] + l)\n", - " else:\n", - " position = (offset[0] + i * 2 * r, offset[1])\n", - "\n", - " circle = self.world.create_dynamic_body(\n", - " position=position,\n", - " fixtures=b2d.fixture_def(\n", - " shape=b2d.circle_shape(radius=r * 0.90),\n", - " density=1.0,\n", - " restitution=1.0,\n", - " friction=0.0,\n", - " ),\n", - " linear_damping=0.01,\n", - " angular_damping=1.0,\n", - " fixed_rotation=True,\n", - " )\n", - " dynamic_circles.append(circle)\n", - "\n", - " static_body = self.world.create_static_body(\n", - " position=(offset[0] + i * 2 * r, offset[1] + l)\n", - " )\n", - "\n", - " self.world.create_distance_joint(\n", - " static_body,\n", - " circle,\n", - " local_anchor_a=(0, 0),\n", - " local_anchor_b=(0, 0),\n", - " max_length=l,\n", - " stiffness=0,\n", - " )\n", - "\n", - " static_bodies.append(static_body)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "6f694d32-8b23-40cf-91c3-0edd6abb658d", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b24ad88f6cfd4db19fc3145000e79635", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Output()" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n", - "s = JupyterAsyncGui.Settings()\n", - "s.resolution = [1000,300]\n", - "b2d.testbed.run(NewtonsCradle, backend=JupyterAsyncGui, gui_settings=s);" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/pyodide/renderers.ipynb b/content/pyodide/renderers.ipynb deleted file mode 100644 index 286490f..0000000 --- a/content/pyodide/renderers.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"metadata":{"language_info":{"codemirror_mode":{"name":"python","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8"},"kernelspec":{"name":"python","display_name":"Pyolite","language":"python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# JupyterLab Renderers","metadata":{}},{"cell_type":"markdown","source":"## FASTA","metadata":{}},{"cell_type":"code","source":"def Fasta(data=''):\n bundle = {}\n bundle['application/vnd.fasta.fasta'] = data\n bundle['text/plain'] = data\n display(bundle, raw=True)\n\nFasta(\"\"\">SEQUENCE_1\nMTEITAAMVKELRESTGAGMMDCKNALSETNGDFDKAVQLLREKGLGKAAKKADRLAAEG\nLVSVKVSDDFTIAAMRPSYLSYEDLDMTFVENEYKALVAELEKENEERRRLKDPNKPEHK\nIPQFASRKQLSDAILKEAEEKIKEELKAQGKPEKIWDNIIPGKMNSFIADNSQLDSKLTL\nMGQFYVMDDKKTVEQVIAEKEKEFGGKIKIVEFICFEVGEGLEKKTEDFAAEVAAQL\n>SEQUENCE_2\nSATVSEINSETDFVAKNDQFIALTKDTTAHIQSNSLQSVEELHSSTINGVKFEEYLKSQI\nATIGENLVVRRFATLKAGANGVVNGYIHTNGRVGVVIAAACDSAEVASKSRDLLRQICMH\"\"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## GeoJSON","metadata":{}},{"cell_type":"code","source":"def GeoJSON(data):\n bundle = {}\n bundle['application/geo+json'] = data\n bundle['text/plain'] = data\n display(bundle, raw=True)\n \nGeoJSON({\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Point\",\n \"coordinates\": [125.6, 10.1]\n },\n \"properties\": {\n \"name\": \"Dinagat Islands\"\n }\n})","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/content/python.ipynb b/content/python.ipynb deleted file mode 100644 index 689e883..0000000 --- a/content/python.ipynb +++ /dev/null @@ -1,721 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "# A Python kernel backed by Pyodide\n", - "\n", - "![](https://raw.githubusercontent.com/pyodide/pyodide/master/docs/_static/img/pyodide-logo.png)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import pyodide_kernel\n", - "pyodide_kernel.__version__" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simple code execution" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "a = 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "a" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "b = 89\n", - "\n", - "def sq(x):\n", - " return x * x\n", - "\n", - "sq(b)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "print" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "# Redirected streams" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import sys\n", - "\n", - "print(\"Error !!\", file=sys.stderr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Error handling" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true, - "trusted": true - }, - "outputs": [], - "source": [ - "\"Hello\"\n", - "\n", - "def dummy_function():\n", - " import missing_module" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "dummy_function()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Code completion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### press `tab` to see what is available in `sys` module" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from sys import " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Code inspection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### using the question mark" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "?print" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### by pressing `shift+tab`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "print(" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Input support" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "name = await input('Enter your name: ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "'Hello, ' + name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Rich representation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import display, Markdown, HTML, JSON, Latex" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## HTML" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "print('Before display')\n", - "\n", - "s = '

HTML Title

'\n", - "display(HTML(s))\n", - "\n", - "print('After display')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Markdown" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "Markdown('''\n", - "# Title\n", - "\n", - "**in bold**\n", - "\n", - "~~Strikthrough~~\n", - "''')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Pandas DataFrame" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "from string import ascii_uppercase as letters\n", - "from IPython.display import display\n", - "\n", - "df = pd.DataFrame(np.random.randint(0, 100, size=(100, len(letters))), columns=list(letters))\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Show the same DataFrame " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## IPython.display module" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import clear_output, display, update_display\n", - "from asyncio import sleep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Update display" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "class Square:\n", - " color = 'PeachPuff'\n", - " def _repr_html_(self):\n", - " return '''\n", - "
\n", - "
''' % self.color\n", - "square = Square()\n", - "\n", - "display(square, display_id='some-square')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "square.color = 'OliveDrab'\n", - "update_display(square, display_id='some-square')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Clear output" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "print(\"hello\")\n", - "await sleep(3)\n", - "clear_output() # will flicker when replacing \"hello\" with \"goodbye\"\n", - "print(\"goodbye\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "print(\"hello\")\n", - "await sleep(3)\n", - "clear_output(wait=True) # prevents flickering\n", - "print(\"goodbye\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Display classes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import HTML\n", - "HTML('''\n", - "
\n", - "
''')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import Math\n", - "Math(r'F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import Latex\n", - "Latex(r\"\"\"\\begin{eqnarray}\n", - "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n", - "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", - "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", - "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n", - "\\end{eqnarray}\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import ProgressBar\n", - "\n", - "for i in ProgressBar(10):\n", - " await sleep(0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import JSON\n", - "JSON(['foo', {'bar': ('baz', None, 1.0, 2)}], metadata={}, expanded=True, root='test')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from IPython.display import GeoJSON\n", - "GeoJSON(\n", - " data={\n", - " \"type\": \"Feature\",\n", - " \"geometry\": {\n", - " \"type\": \"Point\",\n", - " \"coordinates\": [11.8, -45.04]\n", - " }\n", - " }, url_template=\"http://s3-eu-west-1.amazonaws.com/whereonmars.cartodb.net/{basemap_id}/{z}/{x}/{y}.png\",\n", - " layer_options={\n", - " \"basemap_id\": \"celestia_mars-shaded-16k_global\",\n", - " \"attribution\" : \"Celestia/praesepe\",\n", - " \"tms\": True,\n", - " \"minZoom\" : 0,\n", - " \"maxZoom\" : 5\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Network requests and JSON" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import json\n", - "from js import fetch" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "res = await fetch('https://httpbin.org/get')\n", - "text = await res.text()\n", - "obj = json.loads(text) \n", - "JSON(obj)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sympy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "from sympy import Integral, sqrt, symbols, init_printing\n", - "\n", - "init_printing()\n", - "\n", - "x = symbols('x')\n", - "\n", - "Integral(sqrt(1 / x), x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Magics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import os\n", - "os.listdir()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%cd /home" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%pwd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "current_path = %pwd\n", - "print(current_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%%writefile test.txt\n", - "\n", - "This will create a new file. \n", - "With the text that you see here." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%history" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "import time" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "trusted": true - }, - "outputs": [], - "source": [ - "%%timeit \n", - "\n", - "time.sleep(0.1)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (Pyodide)", - "language": "python", - "name": "python" - }, - "language_info": { - "codemirror_mode": { - "name": "python", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/content/xeus-lua/canvas.ipynb b/content/xeus-lua/canvas.ipynb deleted file mode 100644 index 89f9e52..0000000 --- a/content/xeus-lua/canvas.ipynb +++ /dev/null @@ -1,29 +0,0 @@ -{ - "metadata": { - "orig_nbformat": 4, - "language_info": { - "file_extension": ".lua", - "mimetype": "text/x-luasrc", - "name": "lua", - "version": "14.0.0" - }, - "kernelspec": { - "name": "Lua", - "display_name": "Lua", - "language": "lua" - } - }, - "nbformat_minor": 4, - "nbformat": 4, - "cells": [ - { - "cell_type": "code", - "source": "canvas = ilua.canvas.canvas()\nilua.display.display(canvas)\ncanvas:cache()\nfor var=1,100 do\n canvas:begin_path()\n canvas:move_to(canvas:rand_coord())\n for s=1,10 do\n canvas:line_to(canvas:rand_coord())\n end\n canvas.fill_style = canvas:rand_color()\n canvas:fill()\nend\ncanvas:flush()", - "metadata": { - "trusted": true - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/content/xeus-lua/game-of-life.ipynb b/content/xeus-lua/game-of-life.ipynb deleted file mode 100644 index 09dabe4..0000000 --- a/content/xeus-lua/game-of-life.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "metadata":{ - "orig_nbformat":4, - "kernelspec":{ - "name":"Lua", - "display_name":"Lua", - "language":"lua" - }, - "language_info":{ - "file_extension":".lua", - "mimetype":"text/x-luasrc", - "name":"lua", - "version":"14.0.0" - } - }, - "nbformat_minor":5, - "nbformat":4, - "cells":[ - { - "cell_type":"code", - "source":"math = require(\"math\")\n\n-- the game of life class itself\nGameOfLife = {}\nGameOfLife.__index = GameOfLife\nfunction GameOfLife:Create(grid_size)\n local this =\n {\n grid_size = grid_size or {10,10},\n grid = {}\n }\n setmetatable(this, GameOfLife)\n this.size = this.grid_size[1] * this.grid_size[2]\n for i=1,this.size do\n this.grid[i] = 0\n end\n return this\nend", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ], - "id":"61dc1d13-5546-477d-a162-e18ec564e3ee" - }, - { - "cell_type":"code", - "source":"-- member function to initalize with some random values\nfunction GameOfLife:init_random(p)\n for i=1,self.size do\n self.grid[i] = (math.random() < p) and 1 or 0\n end\nend", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ], - "id":"72da5a15-dd9d-4a62-bfa3-5a3ec457c5f4" - }, - { - "cell_type":"code", - "source":"-- helper function to convert a coordinate {x,y} into a \n-- scalar offset\nfunction GameOfLife:to_offset(coord)\n return (coord[1]-1) * self.grid_size[2] + (coord[2] -1) + 1\nend\n-- helper function to access the value of the grid at a coordinate {x,y}\nfunction GameOfLife:at(coord)\n return self.grid[self:to_offset(coord)]\nend", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ], - "id":"0b341677-64f2-4ef3-8ea4-a8e2eb275df2" - }, - { - "cell_type":"code", - "source":"-- the function to do a step\nfunction GameOfLife:step()\n new_grid = {}\n \n for x=1,self.grid_size[1] do\n for y=1, self.grid_size[2] do\n \n local c = 0\n for xx=-1,1 do\n for yy=-1,1 do\n nx = x + xx\n ny = y + yy\n if nx >=1 and ny>=1 and nx <=self.grid_size[1] and ny <=self.grid_size[2] and not (xx==0 and yy ==0) then\n c = c + self:at({nx,ny})\n end\n end\n end\n \n local offset = self:to_offset({x,y})\n local current_state = self:at({x,y})\n \n new_grid[offset] = 0\n if current_state == 0 then\n if c == 3 then\n new_grid[offset] = 1\n end\n else\n if c==2 or c==3 then\n new_grid[offset] = 1\n else\n new_grid[offset] = 0\n end\n end\n-- \n end\n end\n self.grid = new_grid\nend", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ], - "id":"7958dd53-006c-480d-a4ad-9f04b147fd29" - }, - { - "cell_type":"code", - "source":"-- helper function to draw the grid as string\nfunction GameOfLife:__tostring()\n s = \"*\"\n for y=1, self.grid_size[2] do\n s = s .. \"--\"\n end\n s = s .. \"*\\n\"\n for x=1,self.grid_size[1] do\n s = s .. \"|\"\n for y=1, self.grid_size[2] do\n local state = self:at({x,y})\n if state == 0 then\n ss = \" \"\n else\n ss = \"O\"\n end\n s = s .. ss .. \" \"\n end\n s = s .. \"|\\n\"\n end\n s = s .. \"*\"\n for y=1, self.grid_size[2] do\n s = s .. \"--\"\n end\n s = s .. \"*\\n\"\n return s\nend", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ], - "id":"884414f6-8bc9-4719-9671-ef3be310356b" - }, - { - "cell_type":"code", - "source":"-- initalize the game of life\ngrid_size = {20,20}\ngame_of_life = GameOfLife:Create(grid_size)\ngame_of_life:init_random(0.5)\n\n-- a tiny gui\nfunction speed_to_interval(speed)\n return 1.0 / speed\nend\n\nspeed = 0.001\n\nhbox = ilua.widgets.hbox()\n\nplay = ilua.widgets.play({interval=speed_to_interval(speed), max=1000000})\noutput = ilua.widgets.output()\nstep_label = ilua.widgets.label({value=\"Step: \"..tostring(play.value)})\nspeed_label = ilua.widgets.label({value=\"Speed: \"..tostring(speed)})\nspeed_slider = ilua.widgets.slider({min=0.001, max=0.5, step=0.01})\n\nhbox:add(play,step_label,speed_label)\n\nspeed_slider:register_observer(function(value)\n output:captured(function()\n speed = value\n play.interval = speed_to_interval(speed)\n speed_label.value = \"Speed: \" .. tostring(speed)\n end)\nend)\n\nplay:register_observer(function(value)\n if value <= 0.1 then\n game_of_life:init_random(0.24)\n end\n -- use output widget to caputre prints \n output:captured(function()\n ilua.display.clear_output(false)\n step_label.value = \"STEP \"..tostring(play.value)\n game_of_life:step()\n print(tostring(game_of_life))\n end)\nend)\nilua.display.display(hbox,speed_slider, output)", - "metadata":{ - "trusted":true - }, - "execution_count":null, - "outputs":[ - - ], - "id":"40cabf23-7eef-4501-badd-99c1a68c5ced" - } - ] -} \ No newline at end of file diff --git a/content/xeus-lua/widgets.ipynb b/content/xeus-lua/widgets.ipynb deleted file mode 100644 index ef337f0..0000000 --- a/content/xeus-lua/widgets.ipynb +++ /dev/null @@ -1,632 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "6d755081-7f9f-4c6a-93e5-a28c8627a0ec", - "metadata": {}, - "source": [ - "Button\n", - "=======" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be69e205-0c56-44b7-926b-5482d5300a38", - "metadata": {}, - "outputs": [], - "source": [ - "button = ilua.widgets.button({description=\"hello\"})\n", - "output = ilua.widgets.output()\n", - "ilua.display.display(button,output)\n", - "button:on_click(function()\n", - " output:captured(function()\n", - " print(\"clicked\")\n", - " end)\n", - "end)" - ] - }, - { - "cell_type": "markdown", - "id": "d11b0def-5115-4369-9972-4766802c846f", - "metadata": { - "tags": [] - }, - "source": [ - "Box Layout\n", - "==========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5d044224-ac2e-4722-b3fb-6d75b13ec366", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "slider_a = ilua.widgets.slider({min=1, max=2, step=0.1})\n", - "slider_b = ilua.widgets.slider({min=10, max=20, step=1})\n", - "hbox = ilua.widgets.hbox()\n", - "output = ilua.widgets.output()\n", - "hbox:add(slider_a, slider_b)\n", - "ilua.display.display(hbox,output)\n", - "\n", - "slider_a:register_observer(function(value)\n", - " output:captured(function()\n", - " io.write(\"f(x) = x**2; f(\", value ,\")=\", value*value,\"\\n\")\n", - " end)\n", - "end)\n", - "slider_b:register_observer(function(value)\n", - " output:captured(function()\n", - " io.write(\"f(x) = x**3; f(\", value ,\")=\", value*value*value,\"\\n\")\n", - " end)\n", - "end)" - ] - }, - { - "cell_type": "markdown", - "id": "98e79948-9aeb-4c31-a7b9-3c6bce6c026f", - "metadata": {}, - "source": [ - "Accordion\n", - "================" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b755c37d-602a-4b46-97ee-8e044f2f2314", - "metadata": {}, - "outputs": [], - "source": [ - "output = ilua.widgets.output()\n", - "button = ilua.widgets.button({description=\"a button\"})\n", - "button:on_click(function() \n", - " output:captured(function()\n", - " print(\"clicked button\")\n", - " end)\n", - "end)\n", - "slider = ilua.widgets.slider()\n", - "color_picker = ilua.widgets.color_picker()\n", - "audio = ilua.widgets.audio()\n", - "accordion = ilua.widgets.accordion()\n", - "accordion:add(slider,button,color_picker,audio)\n", - "accordion:set_title(1,\"the slider\")\n", - "accordion:set_title(2,\"the button\")\n", - "accordion:set_title(3,\"the color_picker\")\n", - "accordion:set_title(4,\"the audio\")\n", - "ilua.display.display(accordion, output)\n", - "\n", - "slider:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"slider value\", value)\n", - " end)\n", - "end)\n", - "\n", - "color_picker:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"color_picker value\", value)\n", - " end)\n", - "end)" - ] - }, - { - "cell_type": "markdown", - "id": "097d19f7-a0c9-48a9-8eff-6e3e06780c88", - "metadata": { - "tags": [] - }, - "source": [ - "Dropdown\n", - "=========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "95e12c50-4e77-457c-b2c2-6d20421a3bea", - "metadata": {}, - "outputs": [], - "source": [ - "labels = {\"aaa\", \"bb\",\"cc\"}\n", - "dropdown = ilua.widgets.dropdown({_options_labels= labels})\n", - "output = ilua.widgets.output()\n", - "dropdown:register_observer(function(index)\n", - " output:captured(function()\n", - " print(labels[index])\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(dropdown, output)" - ] - }, - { - "cell_type": "markdown", - "id": "ca362331-bd0c-4203-9a6f-dc937d309297", - "metadata": {}, - "source": [ - "Html\n", - "=======" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "abc66753-53ba-4361-96a6-48cd9460c8e3", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "src = [[\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "

My First Page

\n", - "

This is my first page.

\n", - "

A secondary header.

\n", - "

Some more text.

\n", - " \n", - "\n", - "]]\n", - "html = ilua.widgets.html({value=src})\n", - "ilua.display.display(html)" - ] - }, - { - "cell_type": "markdown", - "id": "e8eeacfe-350a-4ecb-81a9-c8091af3c22e", - "metadata": { - "tags": [] - }, - "source": [ - "numeral\n", - "========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9c177cfe-2613-43a3-a217-d93bc257420e", - "metadata": {}, - "outputs": [], - "source": [ - "numeral = ilua.widgets.numeral()\n", - "output = ilua.widgets.output()\n", - "numeral:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "ilua.display.display(numeral, output)" - ] - }, - { - "cell_type": "markdown", - "id": "9fede355-2e4f-48c9-b39b-1886e060ce8b", - "metadata": {}, - "source": [ - "password\n", - "========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "455996cf-9b63-4d50-869a-0f479ab3daf4", - "metadata": {}, - "outputs": [], - "source": [ - "password = ilua.widgets.password()\n", - "output = ilua.widgets.output()\n", - "password:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(password, output)" - ] - }, - { - "cell_type": "markdown", - "id": "6306ce8e-37d3-4dbc-a8cf-955b2dfe684c", - "metadata": {}, - "source": [ - "play\n", - "=====" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "986147ab-c9de-4ad9-b8be-f65260dd815d", - "metadata": {}, - "outputs": [], - "source": [ - "play = ilua.widgets.play({interval=1000})\n", - "output = ilua.widgets.output()\n", - "play:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(play, output)" - ] - }, - { - "cell_type": "markdown", - "id": "4e03ccf2-3a10-40d6-8273-168a91f3d9a7", - "metadata": {}, - "source": [ - "progress\n", - "=========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a4f194ee-0995-44f3-8636-b629bd5b65ba", - "metadata": {}, - "outputs": [], - "source": [ - "progress = ilua.widgets.progress({min=10, max=20})\n", - "play = ilua.widgets.play({min=10, max=20, interval=100})\n", - "play:register_observer(function(value)\n", - " progress.value = value\n", - "end)\n", - "ilua.display.display(play, progress)" - ] - }, - { - "cell_type": "markdown", - "id": "39714034-99f4-4f36-b50f-33aa3f71d2a6", - "metadata": {}, - "source": [ - "Selection Slider\n", - "=================" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7f6aab9e-b3ce-4df9-83a6-94eb725aceb0", - "metadata": {}, - "outputs": [], - "source": [ - "labels = {\"aaa\", \"bb\",\"cc\"}\n", - "selectionslider = ilua.widgets.selectionslider({_options_labels = labels})\n", - "output = ilua.widgets.output()\n", - "selectionslider:register_observer(function(index)\n", - " output:captured(function()\n", - " print(labels[index])\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(selectionslider, output)" - ] - }, - { - "cell_type": "markdown", - "id": "45d72396-3fcc-421e-865e-487d93b333b8", - "metadata": {}, - "source": [ - "Tab\n", - "======" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6d0684e8-62a2-4483-995a-70d7cc2783ac", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "slider_a = ilua.widgets.slider()\n", - "slider_b = ilua.widgets.slider()\n", - "\n", - "titles = {\"aaa\", \"bb\",\"cc\"}\n", - "tab = ilua.widgets.tab({_titles = titles})\n", - "tab:add(slider_a,slider_b)\n", - "output = ilua.widgets.output()\n", - "\n", - "tab:register_observer(function(index)\n", - " -- use output widget to caputre prints \n", - " output:captured(function()\n", - " print(titles[index])\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(tab,output)" - ] - }, - { - "cell_type": "markdown", - "id": "7f9f85de-a5b8-4e60-9eff-33b25d819ec9", - "metadata": {}, - "source": [ - "Text\n", - "=====" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "893e92ad-eff2-4adb-ba82-71a9ed2cfe9e", - "metadata": {}, - "outputs": [], - "source": [ - "text = ilua.widgets.text()\n", - "output = ilua.widgets.output()\n", - "text:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "\n", - "text:on_submit(function()\n", - " output:captured(function()\n", - " print(\"on_submit\")\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(text, output)" - ] - }, - { - "cell_type": "markdown", - "id": "94572d62-12ea-4026-a531-d0e7bc5b20b9", - "metadata": {}, - "source": [ - "TextArea\n", - "=========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1e76b56f-f087-49f8-a50e-eb794060c63c", - "metadata": {}, - "outputs": [], - "source": [ - "textarea = ilua.widgets.textarea({continuous_update=false})\n", - "output = ilua.widgets.output()\n", - "textarea:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "ilua.display.display(textarea, output)" - ] - }, - { - "cell_type": "markdown", - "id": "68011d67-ac8c-43ff-bae9-4caf95273f98", - "metadata": {}, - "source": [ - "Toggle Button\n", - "=========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cf780275-b2de-48d4-bb2e-3f38e8c45bcd", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "togglebutton = ilua.widgets.togglebutton({\n", - " icon=\"plus\",\n", - " button_style=\"\"\n", - "})\n", - "output = ilua.widgets.output()\n", - "togglebutton:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(togglebutton, output)" - ] - }, - { - "cell_type": "markdown", - "id": "1bc5c504-cf9c-432f-a91c-2497910d787b", - "metadata": {}, - "source": [ - "ToggleButtons\n", - "=========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f764f285-d71f-4c93-92b4-923484846b0c", - "metadata": {}, - "outputs": [], - "source": [ - "togglebuttons = ilua.widgets.togglebuttons()\n", - "togglebuttons._options_labels = {\"1\", \"2\",\"3\"}\n", - "output = ilua.widgets.output()\n", - "togglebuttons:register_observer(function(value)\n", - " output:captured(function()\n", - " print(\"value\", value)\n", - " end)\n", - "end)\n", - "\n", - "ilua.display.display(togglebuttons, output)" - ] - }, - { - "cell_type": "markdown", - "id": "55447db2-bab0-4282-9a89-f6b9f8fd9e30", - "metadata": {}, - "source": [ - "Image\n", - "========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d21c5e4b-1d27-44e9-9966-0da4ef55f651", - "metadata": {}, - "outputs": [], - "source": [ - "io = require(\"io\")\n", - "file = io.open(\"marie.png\", \"r\")\n", - "content = file:read(\"*all\")\n", - "io.close(file)\n", - "\n", - "image = ilua.widgets.image()\n", - "image.value = content\n", - "ilua.display.display(image)" - ] - }, - { - "cell_type": "markdown", - "id": "ee4e079c-0101-49a9-94f6-2d7e73ad3f59", - "metadata": { - "tags": [] - }, - "source": [ - "Video\n", - "========" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "654c050a-3cff-48d2-b7a1-d8f6acfe042a", - "metadata": {}, - "outputs": [], - "source": [ - "io = require(\"io\")\n", - "file = io.open(\"Big.Buck.Bunny.mp4\", \"r\")\n", - "content = file:read(\"*all\")\n", - "io.close(file)\n", - "\n", - "video = ilua.widgets.video({loop=false})\n", - "video.value = content\n", - "ilua.display.display(video)" - ] - }, - { - "cell_type": "markdown", - "id": "829cf76c-238d-456f-a5b9-51f3a526f45c", - "metadata": {}, - "source": [ - "Audio\n", - "======" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "43922e68-ee53-40bd-bf2c-8dcc810bdb6a", - "metadata": {}, - "outputs": [], - "source": [ - "io = require(\"io\")\n", - "file = io.open(\"hehe.flac\", \"r\")\n", - "content = file:read(\"*all\")\n", - "io.close(file)\n", - "\n", - "audio = ilua.widgets.audio({loop=false})\n", - "audio.value = content\n", - "ilua.display.display(audio)" - ] - }, - { - "cell_type": "markdown", - "id": "2aee848b-a3e6-4ce3-9d2d-8650871bb225", - "metadata": {}, - "source": [ - "Valid\n", - "======" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ef2ae714-2077-4767-9c24-af821fbc2c9d", - "metadata": {}, - "outputs": [], - "source": [ - "valid = ilua.widgets.valid()\n", - "valid.value = false\n", - "ilua.display.display(valid)" - ] - }, - { - "cell_type": "markdown", - "id": "96b64ffe-ac69-4b0e-9299-0a54842a77c1", - "metadata": {}, - "source": [ - "Link Widgets\n", - "============" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "191675ca-c53e-4c83-a0cf-8dcd78b02fae", - "metadata": {}, - "outputs": [], - "source": [ - "slider = ilua.widgets.slider()\n", - "numeral = ilua.widgets.numeral()\n", - "\n", - "link = ilua.widgets.link(slider, \"value\", numeral, \"value\")\n", - "ilua.display.display(link, slider, numeral)" - ] - }, - { - "cell_type": "markdown", - "id": "3d54b0cc-7f2f-4ad7-92a8-9f61abe989f9", - "metadata": {}, - "source": [ - "Directional Link\n", - "===================" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21499154-6da9-4a4a-a6ce-7637916d26c6", - "metadata": {}, - "outputs": [], - "source": [ - "slider = ilua.widgets.slider()\n", - "numeral = ilua.widgets.numeral()\n", - "\n", - "link = ilua.widgets.directional_link(slider, \"value\", numeral, \"value\")\n", - "ilua.display.display(link, slider, numeral)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Lua 0.2 (XLua)", - "language": "lua", - "name": "xlua" - }, - "language_info": { - "file_extension": ".lua", - "mimetype": "text/x-luasrc", - "name": "lua", - "version": "14.0.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/content/data/Museums_in_DC.geojson b/demo/content/data/Museums_in_DC.geojson similarity index 100% rename from content/data/Museums_in_DC.geojson rename to demo/content/data/Museums_in_DC.geojson diff --git a/content/data/bar.vl.json b/demo/content/data/bar.vl.json similarity index 100% rename from content/data/bar.vl.json rename to demo/content/data/bar.vl.json diff --git a/content/data/fasta-example.fasta b/demo/content/data/fasta-example.fasta similarity index 100% rename from content/data/fasta-example.fasta rename to demo/content/data/fasta-example.fasta diff --git a/content/data/iris.csv b/demo/content/data/iris.csv similarity index 100% rename from content/data/iris.csv rename to demo/content/data/iris.csv diff --git a/content/data/matplotlib.png b/demo/content/data/matplotlib.png similarity index 100% rename from content/data/matplotlib.png rename to demo/content/data/matplotlib.png diff --git a/demo/content/intro.ipynb b/demo/content/intro.ipynb new file mode 100644 index 0000000..f33f01b --- /dev/null +++ b/demo/content/intro.ipynb @@ -0,0 +1,146 @@ +{ + "metadata": { + "kernelspec": { + "name": "python", + "display_name": "Python (Pyodide)", + "language": "python" + }, + "language_info": { + "codemirror_mode": { + "name": "python", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8" + } + }, + "nbformat_minor": 5, + "nbformat": 4, + "cells": [ + { + "id": "a35eeb9f-df70-4ab1-a243-2d2025888eb0", + "cell_type": "markdown", + "source": "## Example: visualizing data in the notebook ✨\n\nBelow is an example of a code cell. We'll visualize some simple data using two popular packages in Python. We'll use [NumPy](https://numpy.org/) to create some random data, and [Matplotlib](https://matplotlib.org) to visualize it.\n\nNote how the code and the results of running the code are bundled together.", + "metadata": {} + }, + { + "id": "fe55883a-6887-43dd-9498-5333a51799e2", + "cell_type": "code", + "source": "from matplotlib import pyplot as plt\nimport numpy as np\n\n# Generate 100 random data points along 3 dimensions\nx, y, scale = np.random.randn(3, 100)\nfig, ax = plt.subplots()\n\n# Map each onto a scatterplot we'll create with Matplotlib\nax.scatter(x=x, y=y, c=scale, s=np.abs(scale)*500)\nax.set(title=\"Some random data, created with JupyterLab!\")\nplt.show()", + "metadata": { + "trusted": true + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAA9hAAAPYQGoP6dpAADYYUlEQVR4nOzdd3wcxfn48c/sXlMvlmTJslzl3rEdgwvYxlRTDHFoScD0JEBCKAlOAgECIaRQvkBov9BJAIPpmG5sgzu4V7nJRbJ6l67tzu+Pk2Sf1U7S3anNOy+9gvf2ZubqPjflGSGllCiKoiiKoig9htbRDVAURVEURVHCSwWAiqIoiqIoPYwKABVFURRFUXoYFQAqiqIoiqL0MCoAVBRFURRF6WFUAKgoiqIoitLDqABQURRFURSlh1EBoKIoiqIoSg+jAkBFURRFUZQeRgWAiqIoiqIoPYwKABVFURRFUXoYFQAqiqIoiqL0MCoAVBRFURRF6WFUAKgoiqIoitLDqABQURRFURSlh1EBoKIoiqIoSg+jAkBFURRFUZQeRgWAiqIoiqIoPYwKABVFURRFUXoYFQAqiqIoiqL0MCoAVBRFURRF6WFUAKgoiqIoitLDqABQURRFURSlh1EBoKIoiqIoSg+jAkBFURRFUZQeRgWAiqIoiqIoPYwKABVFURRFUXoYFQAqiqIoiqL0MCoAVBRFURRF6WFUAKgoiqIoitLDqABQURRFURSlh1EBoKIoiqIoSg+jAkBFURRFUZQeRgWAiqIoiqIoPYwKABWlE1mwYAEDBgzo6Ga06N5770UI0dHNUI4zYMAAFixYEJKyX3rpJYQQHDhwIOBz169fH5K2KE0bMGAA5513Xkc3Q+kiVACotNmWLVuYP38+/fv3x+FwkJ6ezhlnnMETTzzR0U1TOrF///vfvPTSSx3djA7xySefcO+993Z0M4IiVK9j3Y+LwsLCoJfdFqF8vx44cAAhBP/85z9DUn5zvvnmG4QQfPPNN2GvW+kcVACotMnKlSuZNGkSmzZt4vrrr+fJJ5/kuuuuQ9M0Hn/88Y5untKJ9fQA8L777uvoZrTaz3/+c2pqaujfv3/9sZ7yOvaUx6n0PJaOboDSNT344IPExcWxbt064uPj/W7Lz8/vmEYFmdfrxTRNbDZbRzdFCbOqqiqioqI6uhmdhq7r6Lre0c3oNuq+WxSlI6keQKVN9u7dy6hRoxoEfwApKSl+//Z6vfzlL39h8ODB2O12BgwYwB/+8AdcLpffeXXzV7755hsmTZpEREQEY8aMqR+iWLx4MWPGjMHhcDBx4kQ2bNjQoO6dO3cyf/58EhMTcTgcTJo0iQ8++KDFx3P8UMxjjz1W39bt27fjdru55557mDhxInFxcURFRTFjxgyWLl3aZBnPPfdcfRmTJ09m3bp1Dep87733GD16NA6Hg9GjR/Puu+822raqqipuv/12MjIysNvtDBs2jH/+859IKf3OE0Jw8803s2jRIkaOHElERASnnHIKW7ZsAeDZZ58lMzMTh8PBzJkzA5rPBfDtt98yefJkHA4HgwcP5tlnn230vBdffJHZs2eTkpKC3W5n5MiRPP30037nDBgwgG3btrFs2TKEEAghmDlzJgDFxcXccccdjBkzhujoaGJjYznnnHPYtGlTQO1sys6dO7nkkktITk4mIiKCYcOG8cc//rH+9rohx+3bt3PFFVeQkJDA9OnT629/7bXXmDhxIhERESQmJnLZZZdx6NAhvzpWrFjBT37yE/r164fdbicjI4Pf/va31NTU1J+zYMECnnrqKYD6x378PErTNHnssccYNWoUDoeD3r17c+ONN1JSUuJXl5SSBx54gL59+xIZGcmsWbPYtm1bQM/FSSedxMUXX+x3bMyYMQgh2Lx5c/2xN998EyEEO3bsABrOAWzudazjcrm47bbbSE5OJioqiosuuoiCgoKA2nmipuY3zpw506/eumHNN998kz/84Q+kpqYSFRXFBRdc4Pea/fnPf8ZqtTbanhtuuIH4+HicTmeLj7O0tJRbb721/rOZmZnJww8/7BfcNffdEqhAPlvH+/zzzxk/fjwOh4ORI0eyePHigOtSehCpKG1w5plnypiYGLlly5YWz73qqqskIOfPny+feuopeeWVV0pAzps3z++8/v37y2HDhsm0tDR57733ykcffVSmp6fL6Oho+dprr8l+/frJv/3tb/Jvf/ubjIuLk5mZmdIwjPr7b926VcbFxcmRI0fKhx9+WD755JPy1FNPlUIIuXjx4mbbuH//fgnIkSNHykGDBsm//e1v8tFHH5XZ2dmyoKBApqWlydtuu00+/fTT8u9//7scNmyYtFqtcsOGDQ3KmDBhgszMzJQPP/yw/Pvf/y6TkpJk3759pdvt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888/T0pKSoOAfOLEiTz99NM88MADZGZmkpKSwuzZsznvvPO4//77ufrqq5k6dSpbtmzh9ddfb7SHZ+bMmSxbtqzFQO7//u//mD59OieddBI33HADAwcO5MCBA3z88cds3Lix2fsOHjyYBx54gIULF3LgwAHmzZtHTEwM+/fv59133+WGG27gjjvuYPjw4QwePJg77riDI0eOEBsbyzvvvNNoj9zEiRMB+PWvf81ZZ52FrutcdtllnHbaadx444089NBDbNy4kTPPPBOr1UpWVhaLFi3i8ccfZ/78+SQnJ3PHHXfw0EMPcd5553HuueeyYcMGlixZEnAvaWZmJqmpqezatYtbbrml/vipp57K73//e4CAAsCmXsdQuO6663j77bc5++yzueSSS9i7dy+vvfZak+//xMREpk+fztVXX01eXh6PPfYYmZmZXH/99X7nWa1WLrvsMp588kl0Xefyyy8P+HHeeeedfPDBB5x33nksWLCAiRMnUlVVxZYtW3j77bc5cOBAwK/JV199hdPpbHB83rx5rfpsgW/o+dprr2XdunX07t2bF154gby8vAYB47vvvsvVV1/N0qVLG+RwVHqI8C04VrqTJUuWyGuuuUYOHz5cRkdHS5vNJjMzM+Utt9wi8/Ly/M71eDzyvvvukwMHDpRWq1VmZGTIhQsX+qVrkdKXwmDu3LkN6gLkTTfd5HesqfQJe/fulVdeeaVMTU2VVqtVpqeny/POO0++/fbbzT6e5tIxmKYp//rXv8r+/ftLu90uJ0yYID/66CN51VVX+aVsaa4MQP75z3/2O/bOO+/IESNGSLvdLkeOHCkXL17coEwppayoqJC//e1vZZ8+faTVapVDhgyR//jHP/xSbLT2eapLAbFo0aJmnxcppVy2bJmcOHGitNlsctCgQfKZZ56pT9VxvA8++ECOHTtWOhwOOWDAAPnwww/LF154oUH6kKNHj8q5c+fKmJgYCdSn2HA6nfL222+XaWlpMiIiQk6bNk2uWrWqQaoPKaWcOHGiTE1NbbHtUvryQ1500UUyPj5eOhwOOWzYMHn33XfX395Y2pHjvfPOO3L69OkyKipKRkVFyeHDh8ubbrpJ7tq1q/6c7du3yzlz5sjo6GiZlJQkr7/+erlp0yYJyBdffLH+PK/XK2+55RaZnJwshRANnsPnnntOTpw4UUZERMiYmBg5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hMkkARRBycrKIisrq1/HVldXM3/+fMrLy3nkkUfQNOl4DlQgz7cIH7vdTnl5Oe+8807PIgRd13nnnXe48cYboxucECYxDIObbrqJF154gffff58RI0ZEOyQRBpIAirCqrq5m3rx5FBcXc99991FfX9/zPekxCY+qqioaGhqoqqrC7/ezatUqAMrKykhMTIxucEPA97//fa644gqmT5/OUUcdxe9//3tcLhdXXXVVtEMbstra2tiyZUvPv7dv386qVatIT0+nqKgoipENTTfccANPPvkkL730EklJST3zW1NSUnA6nVGOTphFysCIsHr00Ud7vTHKSy88rrzySh577LFDHn/vvfeYN29e5AMagu6//37uvfdeamtrmTJlCn/4wx+YOXNmtMMast5//33mz59/yONXXHEFjz76aOQDGuKUUod9/JFHHulzKooYPCQBFEIIIYSIMTIZSwghhBAixkgCKIQQQggRYyQBFEIIIYSIMZIACiGEEELEGEkAhRBCCCFijCSAQgghhBAxRhJAIYQQQogYIwmgEEIIIUSMkQRQCCGEECLGSAIohBBCCBFjJAEUQgghhIgxkgAKIYQQQsQYSQCFEEIIIWKMJIBCCCGEEDFGEkAhhBBCiBgjCaAQQgghRIyRBFAIIYQQIsZIAiiEEEIIEWMkARRCCCGEiDGSAAohhBBCxBhJAIUQQgghYowkgEIIIYQQMUYSQCGEEEKIGCMJoBBCCCFEjJEEUAghhBAixkgCKIQQQggRYyQBFEIIIYSIMZIACiGEEELEGEkAhRBCCCFijCSAQgghhBAxRhJAIYQQQogY8//jsbeYXOBKIQAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "metadata": {} + } + ], + "execution_count": 1 + }, + { + "id": "9ca234f7-84b7-4107-9bcd-74f5a4ffd07d", + "cell_type": "markdown", + "source": "# `ipywidgets` Interactive Demo\n\nSimple demonstration of rendering Interactive widgets in a `jupyterlite` notebook.\n\n`ipywidgets` can be installed in this deployment (it provides the @jupyter-widgets/jupyterlab-manager federated extension), but you will need to make your own deployment to have access to other interactive widgets libraries.", + "metadata": {} + }, + { + "id": "d62fba6e", + "cell_type": "code", + "source": "%pip install -q ipywidgets", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "3bab23f8-de91-43c9-9cec-84f4924425fc", + "cell_type": "code", + "source": "from ipywidgets import IntSlider", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "a15c5acb-ee72-4005-8761-5693db853f22", + "cell_type": "code", + "source": "slider = IntSlider()", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "8ba89682-e0d7-4bd2-961a-f9956850fd5a", + "cell_type": "code", + "source": "slider", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "50510ade-668f-4477-8cb2-41574609ac73", + "cell_type": "code", + "source": "slider", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "7bac1ed8-8c77-426b-a781-1c1a6cfad829", + "cell_type": "code", + "source": "slider.value", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "976a70a0-e99d-4c20-b005-f59bbba10f85", + "cell_type": "code", + "source": "slider.value = 5", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "3134c76e-cffb-4701-8230-e6c4bfbbfdb9", + "cell_type": "code", + "source": "from ipywidgets import IntText, link", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "f7b3fe0a-5695-4ef2-a573-40785e68fbae", + "cell_type": "code", + "source": "text = IntText()", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "5e2fd50e-19e0-4e20-a1f7-ad65400ec636", + "cell_type": "code", + "source": "text", + "metadata": {}, + "outputs": [], + "execution_count": null + }, + { + "id": "bb3bedce-7311-48c0-aeab-8fe3aa554b92", + "cell_type": "code", + "source": "link((slider, 'value'), (text, 'value'));", + "metadata": {}, + "outputs": [], + "execution_count": null + } + ] +} \ No newline at end of file diff --git a/content/xeus-sqlite/simple-operations.ipynb b/demo/content/sqlite-intro.ipynb similarity index 100% rename from content/xeus-sqlite/simple-operations.ipynb rename to demo/content/sqlite-intro.ipynb diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..3c48e43 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,52 @@ + + JupyterLite embed example + + +

Below is a JupyterLite site running in an IFrame

+

+ Click the following button sends a message to the JupyterLab IFrame to toggle the theme. +

+ + + + + + + + diff --git a/overrides.json b/demo/overrides.json similarity index 100% rename from overrides.json rename to demo/overrides.json diff --git a/demo/repl/jupyter-lite.json b/demo/repl/jupyter-lite.json new file mode 100644 index 0000000..6cfcd77 --- /dev/null +++ b/demo/repl/jupyter-lite.json @@ -0,0 +1,10 @@ +{ + "jupyter-lite-schema-version": 0, + "jupyter-config-data": { + "disabledExtensions": [ + "@jupyterlab/drawio-extension", + "jupyterlab-kernel-spy", + "jupyterlab-tour" + ] + } +} diff --git a/requirements.txt b/demo/requirements.txt similarity index 70% rename from requirements.txt rename to demo/requirements.txt index 060688c..5596a65 100644 --- a/requirements.txt +++ b/demo/requirements.txt @@ -1,6 +1,6 @@ # Core modules (mandatory) -jupyterlite-core==0.2.1 -jupyterlab~=4.0.7 +jupyterlite-core==0.2.2 +jupyterlab~=4.0.10 notebook~=7.0.6 # Python kernel (optional) @@ -16,18 +16,11 @@ jupyterlite-xeus-sqlite==0.2.1 jupyterlab-fasta>=3.3.0,<4 # JupyterLab: Geojson file renderer (optional) jupyterlab-geojson>=3.4.0,<4 -# JupyterLab: guided tour (optional) -# TODO: re-enable after https://github.com/jupyterlab-contrib/jupyterlab-tour/issues/76 -# jupyterlab-tour # JupyterLab: dark theme jupyterlab-night -# JupyterLab: Miami nights theme (optional) -jupyterlab_miami_nights # Python: ipywidget library for Jupyter notebooks (optional) ipywidgets>=8.0.0,<9 -# Python: ipyevents library for Jupyter notebooks (optional) -ipyevents>=2.0.1 # Python: interative Matplotlib library for Jupyter notebooks (optional) ipympl>=0.8.2 # Python: ipycanvas library for Jupyter notebooks (optional) @@ -37,4 +30,3 @@ ipyleaflet # Python: plotting libraries (optional) plotly>=5,<6 -bqplot diff --git a/install.json b/install.json new file mode 100644 index 0000000..ad7a77d --- /dev/null +++ b/install.json @@ -0,0 +1,5 @@ +{ + "packageManager": "python", + "packageName": "jupyterlite_capytale", + "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package jupyterlite_capytale" +} diff --git a/jupyterlite_capytale/__init__.py b/jupyterlite_capytale/__init__.py new file mode 100644 index 0000000..48cbc8d --- /dev/null +++ b/jupyterlite_capytale/__init__.py @@ -0,0 +1,16 @@ +try: + from ._version import __version__ +except ImportError: + # Fallback when using the package in dev mode without installing + # in editable mode with pip. It is highly recommended to install + # the package from a stable release or in editable mode: https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs + import warnings + warnings.warn("Importing 'jupyterlite_capytale' outside a proper installation.") + __version__ = "dev" + + +def _jupyter_labextension_paths(): + return [{ + "src": "labextension", + "dest": "jupyterlite-capytale" + }] diff --git a/package.json b/package.json new file mode 100644 index 0000000..a02395e --- /dev/null +++ b/package.json @@ -0,0 +1,187 @@ +{ + "name": "jupyterlite-capytale", + "version": "0.1.0", + "description": "A JupyterLab extension to integrate with Capytale", + "keywords": [ + "jupyter", + "jupyterlab", + "jupyterlab-extension" + ], + "homepage": "https://github.com/QuantStack/jupyterlite-capytale", + "bugs": { + "url": "https://github.com/QuantStack/jupyterlite-capytale/issues" + }, + "license": "BSD-3-Clause", + "author": "Jeremy Tuloup", + "files": [ + "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", + "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}" + ], + "main": "lib/index.js", + "types": "lib/index.d.ts", + "style": "style/index.css", + "repository": { + "type": "git", + "url": "https://github.com/QuantStack/jupyterlite-capytale.git" + }, + "scripts": { + "build": "jlpm build:lib && jlpm build:labextension:dev", + "build:prod": "jlpm clean && jlpm build:lib:prod && jlpm build:labextension", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "jupyter labextension build --development True .", + "build:lib": "tsc --sourceMap", + "build:lib:prod": "tsc", + "clean": "jlpm clean:lib", + "clean:lib": "rimraf lib tsconfig.tsbuildinfo", + "clean:lintcache": "rimraf .eslintcache .stylelintcache", + "clean:labextension": "rimraf jupyterlite_capytale/labextension jupyterlite_capytale/_version.py", + "clean:all": "jlpm clean:lib && jlpm clean:labextension && jlpm clean:lintcache", + "demo:build": "cd demo && jupyter lite build --contents content --output-dir lite", + "demo:serve": "python -m http.server --directory demo", + "eslint": "jlpm eslint:check --fix", + "eslint:check": "eslint . --cache --ext .ts,.tsx", + "install:extension": "jlpm build", + "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", + "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", + "prettier": "jlpm prettier:base --write --list-different", + "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", + "prettier:check": "jlpm prettier:base --check", + "stylelint": "jlpm stylelint:check --fix", + "stylelint:check": "stylelint --cache \"style/**/*.css\"", + "watch": "run-p watch:src watch:labextension", + "watch:src": "tsc -w --sourceMap", + "watch:labextension": "jupyter labextension watch ." + }, + "dependencies": { + "@jupyterlab/application": "^4.0.0", + "@jupyterlab/apputils": "^4.0.0", + "@jupyterlab/notebook": "^4.0.0" + }, + "devDependencies": { + "@jupyterlab/builder": "^4.0.0", + "@types/json-schema": "^7.0.11", + "@types/react": "^18.0.26", + "@types/react-addons-linked-state-mixin": "^0.14.22", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", + "css-loader": "^6.7.1", + "eslint": "^8.36.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^3.0.0", + "rimraf": "^5.0.1", + "source-map-loader": "^1.0.2", + "style-loader": "^3.3.1", + "stylelint": "^15.10.1", + "stylelint-config-recommended": "^13.0.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-csstree-validator": "^3.0.0", + "stylelint-prettier": "^4.0.0", + "typescript": "~5.0.2", + "yjs": "^13.5.0" + }, + "sideEffects": [ + "style/*.css", + "style/index.js" + ], + "styleModule": "style/index.js", + "publishConfig": { + "access": "public" + }, + "jupyterlab": { + "extension": true, + "outputDir": "jupyterlite_capytale/labextension" + }, + "eslintIgnore": [ + "node_modules", + "dist", + "coverage", + "**/*.d.ts" + ], + "eslintConfig": { + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "interface", + "format": [ + "PascalCase" + ], + "custom": { + "regex": "^I[A-Z]", + "match": true + } + } + ], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "args": "none" + } + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/quotes": [ + "error", + "single", + { + "avoidEscape": true, + "allowTemplateLiterals": false + } + ], + "curly": [ + "error", + "all" + ], + "eqeqeq": "error", + "prefer-arrow-callback": "error" + } + }, + "prettier": { + "singleQuote": true, + "trailingComma": "none", + "arrowParens": "avoid", + "endOfLine": "auto", + "overrides": [ + { + "files": "package.json", + "options": { + "tabWidth": 4 + } + } + ] + }, + "stylelint": { + "extends": [ + "stylelint-config-recommended", + "stylelint-config-standard", + "stylelint-prettier/recommended" + ], + "plugins": [ + "stylelint-csstree-validator" + ], + "rules": { + "csstree/validator": true, + "property-no-vendor-prefix": null, + "selector-class-pattern": "^([a-z][A-z\\d]*)(-[A-z\\d]+)*$", + "selector-no-vendor-prefix": null, + "value-no-vendor-prefix": null + } + } +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..5c26d63 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,77 @@ +[build-system] +requires = ["hatchling>=1.5.0", "jupyterlab>=4.0.0,<5", "hatch-nodejs-version>=0.3.2"] +build-backend = "hatchling.build" + +[project] +name = "jupyterlite_capytale" +readme = "README.md" +license = { file = "LICENSE" } +requires-python = ">=3.8" +classifiers = [ + "Framework :: Jupyter", + "Framework :: Jupyter :: JupyterLab", + "Framework :: Jupyter :: JupyterLab :: 4", + "Framework :: Jupyter :: JupyterLab :: Extensions", + "Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +dependencies = [ +] +dynamic = ["version", "description", "authors", "urls", "keywords"] + +[tool.hatch.version] +source = "nodejs" + +[tool.hatch.metadata.hooks.nodejs] +fields = ["description", "authors", "urls"] + +[tool.hatch.build.targets.sdist] +artifacts = ["jupyterlite_capytale/labextension"] +exclude = [".github", "binder"] + +[tool.hatch.build.targets.wheel.shared-data] +"jupyterlite_capytale/labextension" = "share/jupyter/labextensions/jupyterlite-capytale" +"install.json" = "share/jupyter/labextensions/jupyterlite-capytale/install.json" + +[tool.hatch.build.hooks.version] +path = "jupyterlite_capytale/_version.py" + +[tool.hatch.build.hooks.jupyter-builder] +dependencies = ["hatch-jupyter-builder>=0.5"] +build-function = "hatch_jupyter_builder.npm_builder" +ensured-targets = [ + "jupyterlite_capytale/labextension/static/style.js", + "jupyterlite_capytale/labextension/package.json", +] +skip-if-exists = ["jupyterlite_capytale/labextension/static/style.js"] + +[tool.hatch.build.hooks.jupyter-builder.build-kwargs] +build_cmd = "build:prod" +npm = ["jlpm"] + +[tool.hatch.build.hooks.jupyter-builder.editable-build-kwargs] +build_cmd = "install:extension" +npm = ["jlpm"] +source_dir = "src" +build_dir = "jupyterlite_capytale/labextension" + +[tool.jupyter-releaser.options] +version_cmd = "hatch version" + +[tool.jupyter-releaser.hooks] +before-build-npm = [ + "python -m pip install 'jupyterlab>=4.0.0,<5'", + "jlpm", + "jlpm build:prod" +] +before-build-python = ["jlpm clean:all"] + +[tool.check-wheel-contents] +ignore = ["W002"] diff --git a/repl/jupyter-lite.json b/repl/jupyter-lite.json deleted file mode 100644 index c202a1b..0000000 --- a/repl/jupyter-lite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "jupyter-lite-schema-version": 0, - "jupyter-config-data": { - "disabledExtensions": [ - "@jupyterlab/drawio-extension", - "jupyterlab-kernel-spy", - "jupyterlab-tour" - ] - } - } - \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..aefdf20 --- /dev/null +++ b/setup.py @@ -0,0 +1 @@ +__import__("setuptools").setup() diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..2023a97 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,84 @@ +import { + JupyterFrontEnd, + JupyterFrontEndPlugin +} from '@jupyterlab/application'; + +import { IThemeManager } from '@jupyterlab/apputils'; + +import { INotebookTracker } from '@jupyterlab/notebook'; + +/** + * The message type for communication between the JupyterLite and the host. + */ +const MESSAGE_TYPE = 'jupyterlite-capytale'; + +/** + * The list of actions for interacting the JupyterLite + */ +type Action = 'isDirty' | 'download' | 'restart' | 'save' | 'toggleTheme'; + +/** + * Initialization data for the jupyterlab-capytale extension. + */ +const plugin: JupyterFrontEndPlugin = { + id: 'jupyterlab-capytale:plugin', + autoStart: true, + requires: [INotebookTracker, IThemeManager], + activate: ( + app: JupyterFrontEnd, + notebookTracker: INotebookTracker, + themeManager: IThemeManager + ) => { + const { commands } = app; + + const toggleTheme = () => { + if (themeManager.theme === 'JupyterLab Dark') { + themeManager.setTheme('JupyterLab Light'); + } else { + themeManager.setTheme('JupyterLab Dark'); + } + }; + + // handle outgoing messages + const sendMessage = (action: Action, data?: any) => { + window.parent.postMessage( + { + type: MESSAGE_TYPE, + action, + data + }, + '*' + ); + }; + + // handle incoming message + window.addEventListener('message', event => { + if (event.data.type !== MESSAGE_TYPE) { + // bail if not a message from the host + return; + } + + console.log('Message received:', event.data); + + const action = event.data.action as Action; + + switch (action) { + case 'save': + void commands.execute('docmanager:save'); + break; + case 'download': { + const json = notebookTracker.currentWidget?.context.model.toJSON(); + sendMessage('download', json); + break; + } + case 'toggleTheme': + toggleTheme(); + break; + } + }); + + console.log('JupyterLab extension jupyterlab-capytale is activated!'); + } +}; + +export default plugin; diff --git a/style/base.css b/style/base.css new file mode 100644 index 0000000..e11f457 --- /dev/null +++ b/style/base.css @@ -0,0 +1,5 @@ +/* + See the JupyterLab Developer Guide for useful CSS Patterns: + + https://jupyterlab.readthedocs.io/en/stable/developer/css.html +*/ diff --git a/style/index.css b/style/index.css new file mode 100644 index 0000000..8a7ea29 --- /dev/null +++ b/style/index.css @@ -0,0 +1 @@ +@import url('base.css'); diff --git a/style/index.js b/style/index.js new file mode 100644 index 0000000..a028a76 --- /dev/null +++ b/style/index.js @@ -0,0 +1 @@ +import './base.css'; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9897917 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "composite": true, + "declaration": true, + "esModuleInterop": true, + "incremental": true, + "jsx": "react", + "module": "esnext", + "moduleResolution": "node", + "noEmitOnError": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "preserveWatchOutput": true, + "resolveJsonModule": true, + "outDir": "lib", + "rootDir": "src", + "strict": true, + "strictNullChecks": true, + "target": "ES2018" + }, + "include": ["src/*"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..97fc258 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6247 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + languageName: node + linkType: hard + +"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.5.1, @codemirror/autocomplete@npm:^6.7.1": + version: 6.12.0 + resolution: "@codemirror/autocomplete@npm:6.12.0" + dependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.17.0 + "@lezer/common": ^1.0.0 + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: 1d4da6ccc12f5a67053a76b361f2683b5af031dd405a0bd2a261a265eb8cb7dfb115343a3291260d1ba31ce7ccb5427208ebe50f50f6747fcf27a50b62c87f7e + languageName: node + linkType: hard + +"@codemirror/commands@npm:^6.2.3": + version: 6.3.3 + resolution: "@codemirror/commands@npm:6.3.3" + dependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.4.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.1.0 + checksum: 7d23aecc973823969434b839aefa9a98bb47212d2ce0e6869ae903adbb5233aad22a760788fb7bb6eb45b00b01a4932fb93ad43bacdcbc0215e7500cf54b17bb + languageName: node + linkType: hard + +"@codemirror/lang-cpp@npm:^6.0.2": + version: 6.0.2 + resolution: "@codemirror/lang-cpp@npm:6.0.2" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/cpp": ^1.0.0 + checksum: bb9eba482cca80037ce30c7b193cf45eff19ccbb773764fddf2071756468ecc25aa53c777c943635054f89095b0247b9b50c339e107e41e68d34d12a7295f9a9 + languageName: node + linkType: hard + +"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.1.1": + version: 6.2.1 + resolution: "@codemirror/lang-css@npm:6.2.1" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.2 + "@lezer/css": ^1.0.0 + checksum: 5a8457ee8a4310030a969f2d3128429f549c4dc9b7907ee8888b42119c80b65af99093801432efdf659b8ec36a147d2a947bc1ecbbf69a759395214e3f4834a8 + languageName: node + linkType: hard + +"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.3": + version: 6.4.7 + resolution: "@codemirror/lang-html@npm:6.4.7" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/lang-css": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/language": ^6.4.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.17.0 + "@lezer/common": ^1.0.0 + "@lezer/css": ^1.1.0 + "@lezer/html": ^1.3.0 + checksum: 26e3d9243bd8dea2c0f7769315f8ed4b77969497f52c545c84ff32f155489b3a29e476aa78ffc11e910a0f927bbebce4d28f4e17e1994f6c9d8df6bdd3c33ef1 + languageName: node + linkType: hard + +"@codemirror/lang-java@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-java@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/java": ^1.0.0 + checksum: 4679104683cbffcd224ac04c7e5d144b787494697b26470b07017259035b7bb3fa62609d9a61bfbc566f1756d9f972f9f26d96a3c1362dd48881c1172f9a914d + languageName: node + linkType: hard + +"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.1.7": + version: 6.2.1 + resolution: "@codemirror/lang-javascript@npm:6.2.1" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.6.0 + "@codemirror/lint": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.17.0 + "@lezer/common": ^1.0.0 + "@lezer/javascript": ^1.0.0 + checksum: 3df38c4cced06195283a9a2a9365aaa7c8c1b157852b331bc3a118403f774bbba57d2a392de52f5e28d2b344a323bc0146bcf7c8ef8be2473f167d815e4a37cd + languageName: node + linkType: hard + +"@codemirror/lang-json@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-json@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/json": ^1.0.0 + checksum: e9e87d50ff7b81bd56a6ab50740b1dd54e9a93f1be585e1d59d0642e2148842ea1528ac7b7221eb4ddc7fe84bbc28065144cc3ab86f6e06c6aeb2d4b4e62acf1 + languageName: node + linkType: hard + +"@codemirror/lang-markdown@npm:^6.1.1": + version: 6.2.3 + resolution: "@codemirror/lang-markdown@npm:6.2.3" + dependencies: + "@codemirror/autocomplete": ^6.7.1 + "@codemirror/lang-html": ^6.0.0 + "@codemirror/language": ^6.3.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/markdown": ^1.0.0 + checksum: 9b9e13cca288c36c68ad7e2cc5058cb4da2232e74479124c4952ecd2310d2e91f182c606414680570218119ceae99bdab6540dce081ce564030c9e4cadc96a64 + languageName: node + linkType: hard + +"@codemirror/lang-php@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-php@npm:6.0.1" + dependencies: + "@codemirror/lang-html": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/php": ^1.0.0 + checksum: c003a29a426486453fdfddbf7302982fa2aa7f059bf6f1ce4cbf08341b0162eee5e2f50e0d71c418dcd358491631780156d846fe352754d042576172c5d86721 + languageName: node + linkType: hard + +"@codemirror/lang-python@npm:^6.1.3": + version: 6.1.3 + resolution: "@codemirror/lang-python@npm:6.1.3" + dependencies: + "@codemirror/autocomplete": ^6.3.2 + "@codemirror/language": ^6.8.0 + "@lezer/python": ^1.1.4 + checksum: 65a0276a4503e4e3b70dd28d1c93ef472632b6d2c4bf3ae92d305d14ee8cf60b0bbbf62d5ceb51294de9598d9e2d42eafcde26f317ee7b90d0a11dfa863c1d1a + languageName: node + linkType: hard + +"@codemirror/lang-rust@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-rust@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/rust": ^1.0.0 + checksum: 8a439944cb22159b0b3465ca4fa4294c69843219d5d30e278ae6df8e48f30a7a9256129723c025ec9b5e694d31a3560fb004300b125ffcd81c22d13825845170 + languageName: node + linkType: hard + +"@codemirror/lang-sql@npm:^6.4.1": + version: 6.5.5 + resolution: "@codemirror/lang-sql@npm:6.5.5" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 404003ae73b986bd7a00f6924db78b7ffb28fdc38d689fdc11416aaafe2d5c6dc37cc18972530f82e940acb61e18ac74a1cf7712beef448c145344ff93970dc3 + languageName: node + linkType: hard + +"@codemirror/lang-wast@npm:^6.0.1": + version: 6.0.2 + resolution: "@codemirror/lang-wast@npm:6.0.2" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 72119d4a7d726c54167aa227c982ae9fa785c8ad97a158d8350ae95eecfbd8028a803eef939f7e6c5c6e626fcecda1dc37e9dffc6d5d6ec105f686aeda6b2c24 + languageName: node + linkType: hard + +"@codemirror/lang-xml@npm:^6.0.2": + version: 6.0.2 + resolution: "@codemirror/lang-xml@npm:6.0.2" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.4.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/xml": ^1.0.0 + checksum: e156ecafaa87e9b6ef4ab6812ccd00d8f3c6cb81f232837636b36336d80513b61936dfee6f4f6800574f236208b61e95a2abcb997cdcd7366585a6b796e0e13b + languageName: node + linkType: hard + +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0": + version: 6.10.0 + resolution: "@codemirror/language@npm:6.10.0" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.23.0 + "@lezer/common": ^1.1.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + style-mod: ^4.0.0 + checksum: 3bfd9968f5a34ce22434489a5b226db5f3bc454a1ae7c4381587ff4270ac6af61b10f93df560cb73e9a77cc13d4843722a7a7b94dbed02a3ab1971dd329b9e81 + languageName: node + linkType: hard + +"@codemirror/legacy-modes@npm:^6.3.2": + version: 6.3.3 + resolution: "@codemirror/legacy-modes@npm:6.3.3" + dependencies: + "@codemirror/language": ^6.0.0 + checksum: 3cd32b0f011b0a193e0948e5901b625f38aa6d9a8b24344531d6e142eb6fbb3e6cb5969429102044f3d04fbe53c4deaebd9f659c05067a0b18d17766290c9e05 + languageName: node + linkType: hard + +"@codemirror/lint@npm:^6.0.0": + version: 6.4.2 + resolution: "@codemirror/lint@npm:6.4.2" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: 5e699960c1b28dbaa584fe091a3201978907bf4b9e52810fb15d3ceaf310e38053435e0b594da0985266ae812039a5cd6c36023284a6f8568664bdca04db137f + languageName: node + linkType: hard + +"@codemirror/search@npm:^6.3.0": + version: 6.5.5 + resolution: "@codemirror/search@npm:6.5.5" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: 825196ef63273494ba9a6153b01eda385edb65e77a1e49980dd3a28d4a692af1e9575e03e4b6c84f6fa2afe72217113ff4c50f58b20d13fe0d277cda5dd7dc81 + languageName: node + linkType: hard + +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.2.0, @codemirror/state@npm:^6.4.0": + version: 6.4.0 + resolution: "@codemirror/state@npm:6.4.0" + checksum: c5236fe5786f1b85d17273a5c17fa8aeb063658c1404ab18caeb6e7591663ec96b65d453ab8162f75839c3801b04cd55ba4bc48f44cb61ebfeeee383f89553c7 + languageName: node + linkType: hard + +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.9.6": + version: 6.23.0 + resolution: "@codemirror/view@npm:6.23.0" + dependencies: + "@codemirror/state": ^6.4.0 + style-mod: ^4.1.0 + w3c-keyname: ^2.2.4 + checksum: 6e5f2314a3da2c724dc6a525654d949d3f2fcf7009f4d85f980d52ddc885c8969717e903ca1d9132afbe7c524af5d19bff8285fd394106282a965ae83aa47db4 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^2.3.1": + version: 2.5.0 + resolution: "@csstools/css-parser-algorithms@npm:2.5.0" + peerDependencies: + "@csstools/css-tokenizer": ^2.2.3 + checksum: 6bfbdb4052acca48de9db0806a1b18458709103390656634ebe3cf0390048a6e9b304b78173fbcd524e03669dacb5cc3bedbe8008c354ff9511aed4935dcfc6f + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^2.2.0": + version: 2.2.3 + resolution: "@csstools/css-tokenizer@npm:2.2.3" + checksum: a2a69f0de516046f85b8f47916879780f9712bdda8166ab01dd47613515ff5a0771555c78badd220686bc1dae3cb0eea5de6896e1e326247a276cc8965520aa6 + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^2.1.4": + version: 2.1.7 + resolution: "@csstools/media-query-list-parser@npm:2.1.7" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.5.0 + "@csstools/css-tokenizer": ^2.2.3 + checksum: f910d9c29c84e828d121f451607fe9c275297041f317075ede935ffacdd7fd53fcbc0dd4993585e405b5337b7f991b864d101dff3cb8fc400e8c32a9aedbfe69 + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^3.0.0": + version: 3.0.1 + resolution: "@csstools/selector-specificity@npm:3.0.1" + peerDependencies: + postcss-selector-parser: ^6.0.13 + checksum: e4b5aac3bd3ca1f824cb9578f52b16046a519aa8050ce291da37e611976a83cd3b2b2f908d2678dd4cbbe00bbde8ec28c34fffc40dbbf9a13608dfcaf382ee80 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:^0.5.0": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.6.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 + languageName: node + linkType: hard + +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 5804130574ef810207bdf321c265437814e7a26f4e6fac9b496de3206afd52f533e09ec002a3be06cd9adcc9da63e727f1883938e663c4e4751c007d5b58e539 + languageName: node + linkType: hard + +"@fortawesome/fontawesome-free@npm:^5.12.0": + version: 5.15.4 + resolution: "@fortawesome/fontawesome-free@npm:5.15.4" + checksum: 32281c3df4075290d9a96dfc22f72fadb3da7055d4117e48d34046b8c98032a55fa260ae351b0af5d6f6fb57a2f5d79a4abe52af456da35195f7cb7dda27b4a2 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" + dependencies: + "@humanwhocodes/object-schema": ^2.0.2 + debug: ^4.3.1 + minimatch: ^3.0.5 + checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.2 + resolution: "@humanwhocodes/object-schema@npm:2.0.2" + checksum: 2fc11503361b5fb4f14714c700c02a3f4c7c93e9acd6b87a29f62c522d90470f364d6161b03d1cc618b979f2ae02aed1106fd29d302695d8927e2fc8165ba8ee + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.5 + resolution: "@jridgewell/source-map@npm:0.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.21 + resolution: "@jridgewell/trace-mapping@npm:0.3.21" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: e91d3943c6d84687503ba033600d42b2a81d9eaf32758fee06449cd1415c59b944af08841e99f030b71f83bb5f814969e96fc8aa29e469eb3ea1b46597d13cff + languageName: node + linkType: hard + +"@jupyter/ydoc@npm:^1.1.1": + version: 1.1.1 + resolution: "@jupyter/ydoc@npm:1.1.1" + dependencies: + "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 + "@lumino/coreutils": ^1.11.0 || ^2.0.0 + "@lumino/disposable": ^1.10.0 || ^2.0.0 + "@lumino/signaling": ^1.10.0 || ^2.0.0 + y-protocols: ^1.0.5 + yjs: ^13.5.40 + checksum: a239b1dd57cfc9ba36c06ac5032a1b6388849ae01a1d0db0d45094f71fdadf4d473b4bf8becbef0cfcdc85cae505361fbec0822b02da5aa48e06b66f742dd7a0 + languageName: node + linkType: hard + +"@jupyterlab/application@npm:^4.0.0": + version: 4.0.10 + resolution: "@jupyterlab/application@npm:4.0.10" + dependencies: + "@fortawesome/fontawesome-free": ^5.12.0 + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/docregistry": ^4.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/statedb": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/application": ^2.2.1 + "@lumino/commands": ^2.1.3 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + checksum: 30d826316c56580f3143470a1c296ee905d68c43f8e3ac550245bad64a7ec43674c70b5d8e30ded57d178b9a30cc6d234534b304374510ecfe0550f10d4bda6d + languageName: node + linkType: hard + +"@jupyterlab/apputils@npm:^4.0.0, @jupyterlab/apputils@npm:^4.1.10": + version: 4.1.10 + resolution: "@jupyterlab/apputils@npm:4.1.10" + dependencies: + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/settingregistry": ^4.0.10 + "@jupyterlab/statedb": ^4.0.10 + "@jupyterlab/statusbar": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/commands": ^2.1.3 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/messaging": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + "@lumino/widgets": ^2.3.0 + "@types/react": ^18.0.26 + react: ^18.2.0 + sanitize-html: ~2.7.3 + checksum: e1bc8884a2bcd5426dfe1dbc4336b8acda6be56964dd76ecda363e31ab6c5feca081199612ab79a590a9b5954630349df96a6803feee7ea08a29f688034853fe + languageName: node + linkType: hard + +"@jupyterlab/attachments@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/attachments@npm:4.0.10" + dependencies: + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@lumino/disposable": ^2.1.2 + "@lumino/signaling": ^2.1.2 + checksum: 1d23a0e7176fd98aefc175e9f57cf7b729930504492ef79124ede84b39d7e810cedb90b4a974bbde7abf3e249b173079ba94e868c76ffaa4ed141e0cd480b4fd + languageName: node + linkType: hard + +"@jupyterlab/builder@npm:^4.0.0": + version: 4.0.10 + resolution: "@jupyterlab/builder@npm:4.0.10" + dependencies: + "@lumino/algorithm": ^2.0.1 + "@lumino/application": ^2.2.1 + "@lumino/commands": ^2.1.3 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/dragdrop": ^2.1.4 + "@lumino/messaging": ^2.0.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + "@lumino/widgets": ^2.3.0 + ajv: ^8.12.0 + commander: ^9.4.1 + css-loader: ^6.7.1 + duplicate-package-checker-webpack-plugin: ^3.0.0 + fs-extra: ^10.1.0 + glob: ~7.1.6 + license-webpack-plugin: ^2.3.14 + mini-css-extract-plugin: ^2.7.0 + mini-svg-data-uri: ^1.4.4 + path-browserify: ^1.0.0 + process: ^0.11.10 + source-map-loader: ~1.0.2 + style-loader: ~3.3.1 + supports-color: ^7.2.0 + terser-webpack-plugin: ^5.3.7 + webpack: ^5.76.1 + webpack-cli: ^5.0.1 + webpack-merge: ^5.8.0 + worker-loader: ^3.0.2 + bin: + build-labextension: lib/build-labextension.js + checksum: 6c69fc85716183656e06606ec7a12cd48066fb54928b75d2b62ab4e1952bfe4b97a64e500dbd7148e1514fc6fe595c7e76bb9ff230513ed8e5bd1ac88ee1cd61 + languageName: node + linkType: hard + +"@jupyterlab/cells@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/cells@npm:4.0.10" + dependencies: + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.6 + "@jupyter/ydoc": ^1.1.1 + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/attachments": ^4.0.10 + "@jupyterlab/codeeditor": ^4.0.10 + "@jupyterlab/codemirror": ^4.0.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/documentsearch": ^4.0.10 + "@jupyterlab/filebrowser": ^4.0.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/outputarea": ^4.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/toc": ^6.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/dragdrop": ^2.1.4 + "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 3cd6ee63e7a9fa2afa0d3e6213550f296ba27960826648c744e40ed29774c6d45aba31d44b39e2c5c7a1b17f4a7e96914955b0c49b95b302a096c428685ece6b + languageName: node + linkType: hard + +"@jupyterlab/codeeditor@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/codeeditor@npm:4.0.10" + dependencies: + "@codemirror/state": ^6.2.0 + "@jupyter/ydoc": ^1.1.1 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/statusbar": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/dragdrop": ^2.1.4 + "@lumino/messaging": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 14d547c30d3b850511d459a56e01fd40c9bbc9403f234f1b0061d48a493f16c7ac7314e6111628a9023584ee9b112f7459b11ce54d58b7f670a9391efa20550d + languageName: node + linkType: hard + +"@jupyterlab/codemirror@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/codemirror@npm:4.0.10" + dependencies: + "@codemirror/autocomplete": ^6.5.1 + "@codemirror/commands": ^6.2.3 + "@codemirror/lang-cpp": ^6.0.2 + "@codemirror/lang-css": ^6.1.1 + "@codemirror/lang-html": ^6.4.3 + "@codemirror/lang-java": ^6.0.1 + "@codemirror/lang-javascript": ^6.1.7 + "@codemirror/lang-json": ^6.0.1 + "@codemirror/lang-markdown": ^6.1.1 + "@codemirror/lang-php": ^6.0.1 + "@codemirror/lang-python": ^6.1.3 + "@codemirror/lang-rust": ^6.0.1 + "@codemirror/lang-sql": ^6.4.1 + "@codemirror/lang-wast": ^6.0.1 + "@codemirror/lang-xml": ^6.0.2 + "@codemirror/language": ^6.6.0 + "@codemirror/legacy-modes": ^6.3.2 + "@codemirror/search": ^6.3.0 + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.6 + "@jupyter/ydoc": ^1.1.1 + "@jupyterlab/codeeditor": ^4.0.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/documentsearch": ^4.0.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@lezer/common": ^1.0.2 + "@lezer/generator": ^1.2.2 + "@lezer/highlight": ^1.1.4 + "@lezer/markdown": ^1.0.2 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/signaling": ^2.1.2 + yjs: ^13.5.40 + checksum: 127bdca8e8b6bebb19df5e61bbc1715295633905961bee3516ac65c158c1ed776e549a5f1e0a3615a45aff2614022d0dd1fc170f595498af4e3fc693a6acfc30 + languageName: node + linkType: hard + +"@jupyterlab/coreutils@npm:^6.0.10": + version: 6.0.10 + resolution: "@jupyterlab/coreutils@npm:6.0.10" + dependencies: + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/signaling": ^2.1.2 + minimist: ~1.2.0 + path-browserify: ^1.0.0 + url-parse: ~1.5.4 + checksum: d01645468268465841447a977927097d68b7f6fac771a3d48e358508a1c792dc433aaebcca7755331dce043e1cc002da7fa1ad070dfd7e689dda66c9f25626ee + languageName: node + linkType: hard + +"@jupyterlab/docmanager@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/docmanager@npm:4.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/docregistry": ^4.0.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/statusbar": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 8be669130f29f9245c75e6b03f2bf788da17e1026b1117e0bbd8fe84afca5a9fddfa27fa879231979db1a2bf62c3e9b50eb38586cc155a3e64e1c1dd2e528c9b + languageName: node + linkType: hard + +"@jupyterlab/docregistry@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/docregistry@npm:4.0.10" + dependencies: + "@jupyter/ydoc": ^1.1.1 + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/codeeditor": ^4.0.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + checksum: 0863d8b3c97b8790280805cb781f7448e6a26f6f7e5e75d597d1add480be988bbaa72a6792d2417bc648800d4af30d96af8437ef5c6d9906819e36010d523a3c + languageName: node + linkType: hard + +"@jupyterlab/documentsearch@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/documentsearch@npm:4.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 8ff2c96c9460abf0f6245842637c698ae04b32e5ab64d9f868975158be929d1762b59a0bf85782631cddf3ea0e87b1d446b991ab534dab263000826b0c66f070 + languageName: node + linkType: hard + +"@jupyterlab/filebrowser@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/filebrowser@npm:4.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/docmanager": ^4.0.10 + "@jupyterlab/docregistry": ^4.0.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/statedb": ^4.0.10 + "@jupyterlab/statusbar": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/dragdrop": ^2.1.4 + "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: f19884d40b0b1761e023c939cae1f11112b3b021f75df4806d97d0434e8b25c651bb054a66f563faa99e46c4b2b820b54e6a0e48bffa49d0a0e7bce145c34852 + languageName: node + linkType: hard + +"@jupyterlab/lsp@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/lsp@npm:4.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/codeeditor": ^4.0.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/docregistry": ^4.0.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/translation": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/signaling": ^2.1.2 + lodash.mergewith: ^4.6.1 + vscode-jsonrpc: ^6.0.0 + vscode-languageserver-protocol: ^3.17.0 + vscode-ws-jsonrpc: ~1.0.2 + checksum: e7085bb885a04b9ccf63f6c90acd8ea5dd9e6acee7a1da3860942972dd643773780f28d895a7c11a6b0f024aa00c16c4896b19c567be5a011888467d1f45ef8a + languageName: node + linkType: hard + +"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/nbformat@npm:4.0.10" + dependencies: + "@lumino/coreutils": ^2.1.2 + checksum: fb2eca9389df4a48b1fa7e552200e218a2e9901f21e2735769522c0cc5824b98934b90a7b75e415dc5a9cb5c9a9ff205b6e8316c6f6eccf5716cfa7086b511cf + languageName: node + linkType: hard + +"@jupyterlab/notebook@npm:^4.0.0": + version: 4.0.10 + resolution: "@jupyterlab/notebook@npm:4.0.10" + dependencies: + "@jupyter/ydoc": ^1.1.1 + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/cells": ^4.0.10 + "@jupyterlab/codeeditor": ^4.0.10 + "@jupyterlab/codemirror": ^4.0.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/docregistry": ^4.0.10 + "@jupyterlab/documentsearch": ^4.0.10 + "@jupyterlab/lsp": ^4.0.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/settingregistry": ^4.0.10 + "@jupyterlab/statusbar": ^4.0.10 + "@jupyterlab/toc": ^6.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/dragdrop": ^2.1.4 + "@lumino/messaging": ^2.0.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 19e18594167455cd145662fb4631834ad9d9bc997242d9140a9c9d5332e7a58f1af94d19ac90e5d640e2b798546c8fe6381d6cf56868523a07ea83044b26f3d3 + languageName: node + linkType: hard + +"@jupyterlab/observables@npm:^5.0.10": + version: 5.0.10 + resolution: "@jupyterlab/observables@npm:5.0.10" + dependencies: + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/signaling": ^2.1.2 + checksum: b554bc5d72ecb8780fa92f40369fd94e2a8261a85a5eeb4a5251dc5ec4aa9b6ae5aa9d66eae1c4bc4cfad0e5f144abfa007eec9b49a5ccd6a6c8722615c3d90d + languageName: node + linkType: hard + +"@jupyterlab/outputarea@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/outputarea@npm:4.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/translation": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + checksum: ee110f600d03d394b403ed58ff51b866cc541dffca8253e39bbcdb8938331fb94082136e5d9c8e183744c7bb716b4e80d4ab36c4790879b568b1bc6fa7fe7e9b + languageName: node + linkType: hard + +"@jupyterlab/rendermime-interfaces@npm:^3.8.10": + version: 3.8.10 + resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.10" + dependencies: + "@lumino/coreutils": ^1.11.0 || ^2.1.2 + "@lumino/widgets": ^1.37.2 || ^2.3.0 + checksum: 46775a03440ac26c661f9b050153a445c8fc3490a39ad776e74dffbbb75e6227ad257f3d4452f4bd435f9cb6db2572ebd8f9794cc12669b17479195c0e709f96 + languageName: node + linkType: hard + +"@jupyterlab/rendermime@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/rendermime@npm:4.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/translation": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + lodash.escape: ^4.0.1 + checksum: 2e298e7f64a1eca8a8e0742112a251de21c73bc167ddffbd2d15e38c4e70ccd4b98d6e636c7cce8191aeb51c4a00338f18729b23a7917a4b58e721db13ad8110 + languageName: node + linkType: hard + +"@jupyterlab/services@npm:^7.0.10": + version: 7.0.10 + resolution: "@jupyterlab/services@npm:7.0.10" + dependencies: + "@jupyter/ydoc": ^1.1.1 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/settingregistry": ^4.0.10 + "@jupyterlab/statedb": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/polling": ^2.1.2 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + ws: ^8.11.0 + checksum: 702f2c9e010ab737bb39bb04c1fc0eab32ef5bc86056aebdb9a64002e04dba123bd8fd0400913ddaef470d23e44ea9f741aa0467a068e2be2a279123e3d1e2a5 + languageName: node + linkType: hard + +"@jupyterlab/settingregistry@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/settingregistry@npm:4.0.10" + dependencies: + "@jupyterlab/nbformat": ^4.0.10 + "@jupyterlab/statedb": ^4.0.10 + "@lumino/commands": ^2.1.3 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/signaling": ^2.1.2 + "@rjsf/utils": ^5.1.0 + ajv: ^8.12.0 + json5: ^2.2.3 + peerDependencies: + react: ">=16" + checksum: 6521f1d01f258eb0d9c735bc00c9680e5caf3276c4e7a0fcf12006ef7aa155409e75ceda333695b7301699e00cd29a4a4d72ffced062147315144e0c59fd5971 + languageName: node + linkType: hard + +"@jupyterlab/statedb@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/statedb@npm:4.0.10" + dependencies: + "@lumino/commands": ^2.1.3 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + checksum: 4032966b981c775f53b28137cde3b7c215444e898e9570b2f814c2fb1ee1d8f023702287a61d7d4267fffb71e9d8bdc2e79d165f0238a59ec0fea717540f0324 + languageName: node + linkType: hard + +"@jupyterlab/statusbar@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/statusbar@npm:4.0.10" + dependencies: + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 7c1a352bbe1142967014f24149a7ee161c18a7023852a74d5a959aa99e1bee8dc1540f9cfd5f225f7d4bafce91fd6f7577facc4ad891a2b25d2f8aa9285fa692 + languageName: node + linkType: hard + +"@jupyterlab/toc@npm:^6.0.10": + version: 6.0.10 + resolution: "@jupyterlab/toc@npm:6.0.10" + dependencies: + "@jupyterlab/apputils": ^4.1.10 + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/docregistry": ^4.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime": ^4.0.10 + "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/ui-components": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.0 + react: ^18.2.0 + checksum: 7079610e69a916f6e579a5936f56835ebc824f276f33df17a709c3fde4edbdfc3e7e4abd9ba0b74e169764500053ccbeb2a5cfd8b008e470baa8d25e751aaaa1 + languageName: node + linkType: hard + +"@jupyterlab/translation@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/translation@npm:4.0.10" + dependencies: + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/services": ^7.0.10 + "@jupyterlab/statedb": ^4.0.10 + "@lumino/coreutils": ^2.1.2 + checksum: bc959546627d58523fad02944697a5464481794f533fd5a8b1968d2fcdac64f3dbe82ea380017245ea3b65dc4c24136c39823b2a8627bcea1397c2e6a1343368 + languageName: node + linkType: hard + +"@jupyterlab/ui-components@npm:^4.0.10": + version: 4.0.10 + resolution: "@jupyterlab/ui-components@npm:4.0.10" + dependencies: + "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/observables": ^5.0.10 + "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/translation": ^4.0.10 + "@lumino/algorithm": ^2.0.1 + "@lumino/commands": ^2.1.3 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + "@lumino/widgets": ^2.3.0 + "@rjsf/core": ^5.1.0 + "@rjsf/utils": ^5.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + typestyle: ^2.0.4 + peerDependencies: + react: ^18.2.0 + checksum: 4cff8e7f5fc6ad0c7e2041ced85dcd38d32f1570c4b4c613e25a0804f430e905a207b9d0c91f9e5674bb9bd9fb9ea7271855e82be5f523dabef01e0d63c1a499 + languageName: node + linkType: hard + +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.0.2, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.0": + version: 1.2.0 + resolution: "@lezer/common@npm:1.2.0" + checksum: dc6f53f831515f2a25ee93a2c5c032ced527013b4edf148568941dde7d01b5a17ccf7fec11bf3d1c19bf0944a8aae4acebef08b9ba76275da0a64d0533cb5266 + languageName: node + linkType: hard + +"@lezer/cpp@npm:^1.0.0": + version: 1.1.2 + resolution: "@lezer/cpp@npm:1.1.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: a319cd46fd32affc07c9432e9b2b9954becf7766be0361176c525d03474bb794cc051aad9932f48c9df33833eee1d6bfdccab12e571f2b137b4ca765c60c75de + languageName: node + linkType: hard + +"@lezer/css@npm:^1.0.0, @lezer/css@npm:^1.1.0": + version: 1.1.7 + resolution: "@lezer/css@npm:1.1.7" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 7760d294fd0b1ac6db319c4990517c1ed9027d6757de537553624238056df6e1ef1b6a571a023a4bce3d7a2b891036d9f85f76f2109f503bea94837f90c64bc2 + languageName: node + linkType: hard + +"@lezer/generator@npm:^1.2.2": + version: 1.6.0 + resolution: "@lezer/generator@npm:1.6.0" + dependencies: + "@lezer/common": ^1.1.0 + "@lezer/lr": ^1.3.0 + bin: + lezer-generator: src/lezer-generator.cjs + checksum: dfbf19d0533922272ac00c4b7884e1df88e2a35dd758e4544ceb5d784aa38d5751add03ca87f35d14cc39416e0dbc06ccaf2a211a6ae982e00daaaffe9c9320c + languageName: node + linkType: hard + +"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3, @lezer/highlight@npm:^1.1.4": + version: 1.2.0 + resolution: "@lezer/highlight@npm:1.2.0" + dependencies: + "@lezer/common": ^1.0.0 + checksum: 5b9dfe741f95db13f6124cb9556a43011cb8041ecf490be98d44a86b04d926a66e912bcd3a766f6a3d79e064410f1a2f60ab240b50b645a12c56987bf4870086 + languageName: node + linkType: hard + +"@lezer/html@npm:^1.3.0": + version: 1.3.8 + resolution: "@lezer/html@npm:1.3.8" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 06bce804487435ea6ccb39595176bb65d68691f082b0b68fb7d22d90d4de9798a8202f16e9aefe22865db15257a37f6fca93275d660715eea98f7578579e7135 + languageName: node + linkType: hard + +"@lezer/java@npm:^1.0.0": + version: 1.1.1 + resolution: "@lezer/java@npm:1.1.1" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 8a071aca6b5e1ed1d22bffed22bbd29f21b102b7337a7ea5c956eb259e6ff20eee2d6e85b7dadff69859cb6615d6b1a3f0ba109673e87ce5a1f6cabdeee626fd + languageName: node + linkType: hard + +"@lezer/javascript@npm:^1.0.0": + version: 1.4.12 + resolution: "@lezer/javascript@npm:1.4.12" + dependencies: + "@lezer/highlight": ^1.1.3 + "@lezer/lr": ^1.3.0 + checksum: 431e01107e5b1dde5294bd57baf4d76ecea570697faefb0c54f2bbbe2b4757fa12c5552306d54f8a1db79349d4fa0f79408a1e8cea4ecddbe1731c37c9a8e09e + languageName: node + linkType: hard + +"@lezer/json@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/json@npm:1.0.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: f899d13765d95599c9199fc3404cb57969031dc40ce07de30f4e648979153966581f0bee02e2f8f70463b0a5322206a97c2fe8d5d14f218888c72a6dcedf90ef + languageName: node + linkType: hard + +"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.1.0, @lezer/lr@npm:^1.3.0": + version: 1.3.14 + resolution: "@lezer/lr@npm:1.3.14" + dependencies: + "@lezer/common": ^1.0.0 + checksum: 07be41edcb6c332a3567436d2c626131544181c4d680811baf23f6157db3dce4ebfef325cbd0b88dc8b128b83fbe6363c5dcf3e0a4ff369ddfae05d9f207daee + languageName: node + linkType: hard + +"@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.0.2": + version: 1.2.0 + resolution: "@lezer/markdown@npm:1.2.0" + dependencies: + "@lezer/common": ^1.0.0 + "@lezer/highlight": ^1.0.0 + checksum: e6355272ad98c97b339dd42d8d9b78fa4f48fdcc5c9c408720936cacb7d2bcd47b0cedf8e0997ef93539c2b03a65326fc59372e54f0b24acd98630e06869a350 + languageName: node + linkType: hard + +"@lezer/php@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/php@npm:1.0.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.1.0 + checksum: c85ef18571d37826b687dd141a0fe110f5814adaf9d1a391e7e482020d7f81df189ca89ec0dd141c1433d48eff4c6e53648b46f008dea8ad2dc574f35f1d4d79 + languageName: node + linkType: hard + +"@lezer/python@npm:^1.1.4": + version: 1.1.10 + resolution: "@lezer/python@npm:1.1.10" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: d59088c5cc4d8c768b221ad527d22996ab0160f2136fc44303b2ae4b6cd6cc01cc9dbdffd5cf004f33bae5f4ce6944db7bf08e011e6f79ecd6197e0756c4a904 + languageName: node + linkType: hard + +"@lezer/rust@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/rust@npm:1.0.2" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: fc5e97852b42beeb44a0ebe316dc64e3cc49ff481c22e3e67d6003fc4a5c257fcd94959cfcc76cd154fa172db9b3b4b28de5c09f10550d6e5f14869ddc274e5b + languageName: node + linkType: hard + +"@lezer/xml@npm:^1.0.0": + version: 1.0.4 + resolution: "@lezer/xml@npm:1.0.4" + dependencies: + "@lezer/common": ^1.2.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 68a82085bff6c1525f4ef03cd9f9dac0132b3e03fe574e0289700dd4475056e40e8744cde15cf5ad6d3760d0d584ff85ce707e26a7c938d0c5fe2e325c1c336e + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/algorithm@npm:2.0.1" + checksum: cbf7fcf6ee6b785ea502cdfddc53d61f9d353dcb9659343511d5cd4b4030be2ff2ca4c08daec42f84417ab0318a3d9972a17319fa5231693e109ab112dcf8000 + languageName: node + linkType: hard + +"@lumino/application@npm:^2.2.1": + version: 2.3.0 + resolution: "@lumino/application@npm:2.3.0" + dependencies: + "@lumino/commands": ^2.2.0 + "@lumino/coreutils": ^2.1.2 + "@lumino/widgets": ^2.3.1 + checksum: 9d1eb5bc972ed158bf219604a53bbac1262059bc5b0123d3e041974486b9cbb8288abeeec916f3b62f62d7c32e716cccf8b73e4832ae927e4f9dd4e4b0cd37ed + languageName: node + linkType: hard + +"@lumino/collections@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/collections@npm:2.0.1" + dependencies: + "@lumino/algorithm": ^2.0.1 + checksum: 8a29b7973a388a33c5beda0819dcd2dc2aad51a8406dcfd4581b055a9f77a39dc5800f7a8b4ae3c0bb97ae7b56a7a869e2560ffb7a920a28e93b477ba05907d6 + languageName: node + linkType: hard + +"@lumino/commands@npm:^2.1.3, @lumino/commands@npm:^2.2.0": + version: 2.2.0 + resolution: "@lumino/commands@npm:2.2.0" + dependencies: + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/keyboard": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + checksum: 093e9715491e5cef24bc80665d64841417b400f2fa595f9b60832a3b6340c405c94a6aa276911944a2c46d79a6229f3cc087b73f50852bba25ece805abd0fae9 + languageName: node + linkType: hard + +"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.2, @lumino/coreutils@npm:^2.1.2": + version: 2.1.2 + resolution: "@lumino/coreutils@npm:2.1.2" + checksum: 7865317ac0676b448d108eb57ab5d8b2a17c101995c0f7a7106662d9fe6c859570104525f83ee3cda12ae2e326803372206d6f4c1f415a5b59e4158a7b81066f + languageName: node + linkType: hard + +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^2.1.2": + version: 2.1.2 + resolution: "@lumino/disposable@npm:2.1.2" + dependencies: + "@lumino/signaling": ^2.1.2 + checksum: ac2fb2bf18d0b2939fda454f3db248a0ff6e8a77b401e586d1caa9293b3318f808b93a117c9c3ac27cd17aab545aea83b49108d099b9b2f5503ae2a012fbc6e2 + languageName: node + linkType: hard + +"@lumino/domutils@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/domutils@npm:2.0.1" + checksum: 61fa0ab226869dfbb763fc426790cf5a43b7d6f4cea1364c6dd56d61c44bff05eea188d33ff847449608ef58ed343161bee15c19b96f35410e4ee35815dc611a + languageName: node + linkType: hard + +"@lumino/dragdrop@npm:^2.1.4": + version: 2.1.4 + resolution: "@lumino/dragdrop@npm:2.1.4" + dependencies: + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + checksum: 43d82484b13b38b612e7dfb424a840ed6a38d0db778af10655c4ba235c67b5b12db1683929b35a36ab2845f77466066dfd1ee25c1c273e8e175677eba9dc560d + languageName: node + linkType: hard + +"@lumino/keyboard@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/keyboard@npm:2.0.1" + checksum: cf33f13427a418efd7cc91061233321e860d5404f3d86397781028309bef86c8ad2d88276ffe335c1db0fe619bd9d1e60641c81f881696957a58703ee4652c3e + languageName: node + linkType: hard + +"@lumino/messaging@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/messaging@npm:2.0.1" + dependencies: + "@lumino/algorithm": ^2.0.1 + "@lumino/collections": ^2.0.1 + checksum: 964c4651c374b17452b4252b7d71500b32d2ecd87c192fc5bcf5d3bd1070661d78d07edcac8eca7d1d6fd50aa25992505485e1296d6dd995691b8e349b652045 + languageName: node + linkType: hard + +"@lumino/polling@npm:^2.1.2": + version: 2.1.2 + resolution: "@lumino/polling@npm:2.1.2" + dependencies: + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/signaling": ^2.1.2 + checksum: fa9b401e6dbeb8f31d7e3ba485e8ef1e0c92b3f2da086239c0ed49931026f5d3528709193c93e031e35ac624fb4bbbfcdcbaa0e25eb797f36e2952e5cd91e9e3 + languageName: node + linkType: hard + +"@lumino/properties@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/properties@npm:2.0.1" + checksum: c50173a935148cc4148fdaea119df1d323ee004ae16ab666800388d27e9730345629662d85f25591683329b39f0cdae60ee8c94e8943b4d0ef7d7370a38128d6 + languageName: node + linkType: hard + +"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.2": + version: 2.1.2 + resolution: "@lumino/signaling@npm:2.1.2" + dependencies: + "@lumino/algorithm": ^2.0.1 + "@lumino/coreutils": ^2.1.2 + checksum: ad7d7153db57980da899c43e412e6130316ef30b231a70250e7af49058db16cadb018c1417a2ea8083d83c48623cfe6b705fa82bf10216b1a8949aed9f4aca4e + languageName: node + linkType: hard + +"@lumino/virtualdom@npm:^2.0.1": + version: 2.0.1 + resolution: "@lumino/virtualdom@npm:2.0.1" + dependencies: + "@lumino/algorithm": ^2.0.1 + checksum: cf59b6f15b430e13e9e657b7a0619b9056cd9ea7b2a87f407391d071c501b77403c302b6a66dca510382045e75b2e3fe551630bb391f1c6b33678057d4bec164 + languageName: node + linkType: hard + +"@lumino/widgets@npm:^1.37.2 || ^2.3.0, @lumino/widgets@npm:^2.3.0, @lumino/widgets@npm:^2.3.1": + version: 2.3.1 + resolution: "@lumino/widgets@npm:2.3.1" + dependencies: + "@lumino/algorithm": ^2.0.1 + "@lumino/commands": ^2.2.0 + "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 + "@lumino/domutils": ^2.0.1 + "@lumino/dragdrop": ^2.1.4 + "@lumino/keyboard": ^2.0.1 + "@lumino/messaging": ^2.0.1 + "@lumino/properties": ^2.0.1 + "@lumino/signaling": ^2.1.2 + "@lumino/virtualdom": ^2.0.1 + checksum: ba7b8f8839c1cd2a41dbda13281094eb6981a270cccf4f25a0cf83686dcc526a2d8044a20204317630bb7dd4a04d65361408c7623a921549c781afca84b91c67 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@pkgr/core@npm:^0.1.0": + version: 0.1.0 + resolution: "@pkgr/core@npm:0.1.0" + checksum: eeff0e0e517b1ed10eb4c1a8971413a8349bbfdab727dbe7d4085fd94eab95f0c3beb51b9245fef30562849d2a7a119e07ca48c343c8c4ec4e64ee289f50fe5e + languageName: node + linkType: hard + +"@rjsf/core@npm:^5.1.0": + version: 5.16.1 + resolution: "@rjsf/core@npm:5.16.1" + dependencies: + lodash: ^4.17.21 + lodash-es: ^4.17.21 + markdown-to-jsx: ^7.4.0 + nanoid: ^3.3.7 + prop-types: ^15.8.1 + peerDependencies: + "@rjsf/utils": ^5.16.x + react: ^16.14.0 || >=17 + checksum: 2f88dc6af9dda8ec5c8cbac63f3f9e776a11fe363ce938aa7b5c7a3baaa84a7a2f3796ebf55b361a8cb65267a1715ab880a4743636fb88e06b0240d07f0e4c7b + languageName: node + linkType: hard + +"@rjsf/utils@npm:^5.1.0": + version: 5.16.1 + resolution: "@rjsf/utils@npm:5.16.1" + dependencies: + json-schema-merge-allof: ^0.8.1 + jsonpointer: ^5.0.1 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + react-is: ^18.2.0 + peerDependencies: + react: ^16.14.0 || >=17 + checksum: 0c69527de4ab6f9d6ec4d1a5e05a31a0a38062d40abe2a2da7bc2324b20b08b0e90c188977ac4408f3b004c758c28097444746f3215e21e184c11cad7e9278c1 + languageName: node + linkType: hard + +"@types/create-react-class@npm:*": + version: 15.6.7 + resolution: "@types/create-react-class@npm:15.6.7" + dependencies: + "@types/react": "*" + checksum: 072c1fe0472217fe80b94965a8c23dd2f53b701c56bcf1e16da4d422aeb3fcba65972768f4b8ac90a5ca1ef8721730fb78fb8da080b9a8b004b6df667acc7ec7 + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "*" + "@types/estree": "*" + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.56.2 + resolution: "@types/eslint@npm:8.56.2" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: 38e054971596f5c0413f66a62dc26b10e0a21ac46ceacb06fbf8cfb838d20820787209b17218b3916e4c23d990ff77cfdb482d655cac0e0d2b837d430fcc5db8 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.2": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.11.0 + resolution: "@types/node@npm:20.11.0" + dependencies: + undici-types: ~5.26.4 + checksum: 1bd6890db7e0404d11c33d28f46f19f73256f0ba35d19f0ef2a0faba09f366f188915fb9338eebebcc472075c1c4941e17c7002786aa69afa44980737846b200 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.11 + resolution: "@types/prop-types@npm:15.7.11" + checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + languageName: node + linkType: hard + +"@types/react-addons-linked-state-mixin@npm:^0.14.22": + version: 0.14.27 + resolution: "@types/react-addons-linked-state-mixin@npm:0.14.27" + dependencies: + "@types/create-react-class": "*" + "@types/react": "*" + checksum: a78007698a236335a50c74ddd27669028213ff363219f97a6ea1f000ddb8714c83838002ea07c33024f964112a229e447127b457fa3f9b3db352dd41d6b8d328 + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:^18.0.26": + version: 18.2.47 + resolution: "@types/react@npm:18.2.47" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: 49608f07f73374e535b21f99fee28e6cfd5801d887c6ed88c41b4dc701dbcee9f0c4d289d9af7b2b23114f76dbf203ffe2c9191bfb4958cf18dae5a25daedbd0 + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.16.8 + resolution: "@types/scheduler@npm:0.16.8" + checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d + languageName: node + linkType: hard + +"@types/semver@npm:^7.5.0": + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: 563a0120ec0efcc326567db2ed920d5d98346f3638b6324ea6b50222b96f02a8add3c51a916b6897b51523aad8ac227d21d3dcf8913559f1bfc6c15b14d23037 + languageName: node + linkType: hard + +"@types/source-list-map@npm:*": + version: 0.1.6 + resolution: "@types/source-list-map@npm:0.1.6" + checksum: 9cd294c121f1562062de5d241fe4d10780b1131b01c57434845fe50968e9dcf67ede444591c2b1ad6d3f9b6bc646ac02cc8f51a3577c795f9c64cf4573dcc6b1 + languageName: node + linkType: hard + +"@types/webpack-sources@npm:^0.1.5": + version: 0.1.12 + resolution: "@types/webpack-sources@npm:0.1.12" + dependencies: + "@types/node": "*" + "@types/source-list-map": "*" + source-map: ^0.6.1 + checksum: 75342659a9889478969f7bb7360b998aa084ba11ab523c172ded6a807dac43ab2a9e1212078ef8bbf0f33e4fadd2c8a91b75d38184d8030d96a32fe819c9bb57 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.1.0": + version: 6.18.1 + resolution: "@typescript-eslint/eslint-plugin@npm:6.18.1" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.18.1 + "@typescript-eslint/type-utils": 6.18.1 + "@typescript-eslint/utils": 6.18.1 + "@typescript-eslint/visitor-keys": 6.18.1 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 933ede339bfac8377f94b211253bce40ace272a01466c290b38e681ec4752128ce63f827bbe6cc70cc0383d01655c8a22b25c640841fe90dfa4e57f73baaf2a9 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.1.0": + version: 6.18.1 + resolution: "@typescript-eslint/parser@npm:6.18.1" + dependencies: + "@typescript-eslint/scope-manager": 6.18.1 + "@typescript-eslint/types": 6.18.1 + "@typescript-eslint/typescript-estree": 6.18.1 + "@typescript-eslint/visitor-keys": 6.18.1 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: f123310976a73d9f08470dbad917c9e7b038e9e1362924a225a29d35fac1a2726d447952ca77b914d47f50791d235bb66f5171c7a4a0536e9c170fb20e73a2e4 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/scope-manager@npm:6.18.1" + dependencies: + "@typescript-eslint/types": 6.18.1 + "@typescript-eslint/visitor-keys": 6.18.1 + checksum: d6708f9f2658ab68f9f4628b93c4131fb82c362383b4d5d671491082ff610258f2fc9e293739618dc76ed6d2c5909f000a54b9b905e58a5172e6e2f731666245 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/type-utils@npm:6.18.1" + dependencies: + "@typescript-eslint/typescript-estree": 6.18.1 + "@typescript-eslint/utils": 6.18.1 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 44d7e14460f8a22a0c5c58ff7004cb40061e722dfcec3ac4ee15d40dafe68c61e555a79e81af8ffa0ca845fb3caf3ed5376853b9a94e2f3c823ac5e8267230c8 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/types@npm:6.18.1" + checksum: f1713785c4dd49e6aae4186042679d205312a1c6cbfcdad133abf5c61f71c115e04c6643aa6a8aacd732e6b64030d71bbc92762164b7f231d98fc2e31c3f8ed8 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/typescript-estree@npm:6.18.1" + dependencies: + "@typescript-eslint/types": 6.18.1 + "@typescript-eslint/visitor-keys": 6.18.1 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: fc5fb8abea9a6c3b774f62989b9a463569d141c32f6f2febef11d4161acaff946b204226234077b1126294fcf86a83c5fc9227f34ea3ba4cc9d39ca843dfae97 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/utils@npm:6.18.1" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.18.1 + "@typescript-eslint/types": 6.18.1 + "@typescript-eslint/typescript-estree": 6.18.1 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: b7265b0cae099feb98e233dd518b54408fde01b9703535c9e9b84c24e9af6fff0fd9a61f0f7d7b24fb738151ad25a7f57210e83a5a2700cac38ee627f5b856d4 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/visitor-keys@npm:6.18.1" + dependencies: + "@typescript-eslint/types": 6.18.1 + eslint-visitor-keys: ^3.4.1 + checksum: 4befc450fd459e9dc368c3da7066a4948946e8b24383bf0fbaacd059cbe69ff0f71cac4f6d5d1f99a523c1fb20d39bef907e522d2c8e8315a8ce4ce678a58540 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/ast@npm:1.11.6" + dependencies: + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" + checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@xtuc/long": 4.2.2 + checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" + dependencies: + "@xtuc/ieee754": ^1.2.0 + checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" + dependencies: + "@xtuc/long": 4.2.2 + checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-opt": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + "@webassemblyjs/wast-printer": 1.11.6 + checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wast-printer@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@xtuc/long": 4.2.2 + checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec + languageName: node + linkType: hard + +"abab@npm:^2.0.3, abab@npm:^2.0.5": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: ^3.1.3 + peerDependencies: + ajv: ^8.8.2 + checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.12.0, ajv@npm:^8.9.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + is-array-buffer: ^3.0.1 + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.2": + version: 1.0.2 + resolution: "arraybuffer.prototype.slice@npm:1.0.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + is-array-buffer: ^3.0.2 + is-shared-array-buffer: ^1.0.2 + checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"balanced-match@npm:^2.0.0": + version: 2.0.0 + resolution: "balanced-match@npm:2.0.0" + checksum: 9a5caad6a292c5df164cc6d0c38e0eedf9a1413f42e5fece733640949d74d0052cfa9587c1a1681f772147fb79be495121325a649526957fd75b3a216d1fbc68 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.14.5": + version: 4.22.2 + resolution: "browserslist@npm:4.22.2" + dependencies: + caniuse-lite: ^1.0.30001565 + electron-to-chromium: ^1.4.601 + node-releases: ^2.0.14 + update-browserslist-db: ^1.0.13 + bin: + browserslist: cli.js + checksum: 33ddfcd9145220099a7a1ac533cecfe5b7548ffeb29b313e1b57be6459000a1f8fa67e781cf4abee97268ac594d44134fcc4a6b2b4750ceddc9796e3a22076d9 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" + dependencies: + function-bind: ^1.1.2 + get-intrinsic: ^1.2.1 + set-function-length: ^1.1.1 + checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase-keys@npm:^7.0.0": + version: 7.0.2 + resolution: "camelcase-keys@npm:7.0.2" + dependencies: + camelcase: ^6.3.0 + map-obj: ^4.1.0 + quick-lru: ^5.1.1 + type-fest: ^1.2.1 + checksum: b5821cc48dd00e8398a30c5d6547f06837ab44de123f1b3a603d0a03399722b2fc67a485a7e47106eb02ef543c3b50c5ebaabc1242cde4b63a267c3258d2365b + languageName: node + linkType: hard + +"camelcase@npm:^6.3.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001565": + version: 1.0.30001576 + resolution: "caniuse-lite@npm:1.0.30001576" + checksum: b8b332675fe703d5e57b02df5f100345f2a3796c537a42422f5bfc82d3256b8bad3f4e2788553656d2650006d13a4b5db99725e2a9462cc0c8035ba494ba1857 + languageName: node + linkType: hard + +"chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: ^2.0.4 + kind-of: ^6.0.2 + shallow-clone: ^3.0.0 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"colord@npm:^2.9.3": + version: 2.9.3 + resolution: "colord@npm:2.9.3" + checksum: 95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 + languageName: node + linkType: hard + +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"commander@npm:^9.4.1": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + +"compute-gcd@npm:^1.2.1": + version: 1.2.1 + resolution: "compute-gcd@npm:1.2.1" + dependencies: + validate.io-array: ^1.0.3 + validate.io-function: ^1.0.2 + validate.io-integer-array: ^1.0.0 + checksum: 51cf33b75f7c8db5142fcb99a9d84a40260993fed8e02a7ab443834186c3ab99b3fd20b30ad9075a6a9d959d69df6da74dd3be8a59c78d9f2fe780ebda8242e1 + languageName: node + linkType: hard + +"compute-lcm@npm:^1.1.2": + version: 1.1.2 + resolution: "compute-lcm@npm:1.1.2" + dependencies: + compute-gcd: ^1.2.1 + validate.io-array: ^1.0.3 + validate.io-function: ^1.0.2 + validate.io-integer-array: ^1.0.0 + checksum: d499ab57dcb48e8d0fd233b99844a06d1cc56115602c920c586e998ebba60293731f5b6976e8a1e83ae6cbfe86716f62d9432e8d94913fed8bd8352f447dc917 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.2.0": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 + languageName: node + linkType: hard + +"crelt@npm:^1.0.5": + version: 1.0.6 + resolution: "crelt@npm:1.0.6" + checksum: dad842093371ad702afbc0531bfca2b0a8dd920b23a42f26e66dabbed9aad9acd5b9030496359545ef3937c3aced0fd4ac39f7a2d280a23ddf9eb7fdcb94a69f + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.5": + version: 6.0.5 + resolution: "cross-spawn@npm:6.0.5" + dependencies: + nice-try: ^1.0.4 + path-key: ^2.0.1 + semver: ^5.5.0 + shebang-command: ^1.2.0 + which: ^1.2.9 + checksum: f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"css-functions-list@npm:^3.2.1": + version: 3.2.1 + resolution: "css-functions-list@npm:3.2.1" + checksum: 57d7deb3b05e84d95b88ba9b3244cf60d33b40652b3357f084c805b24a9febda5987ade44ef25a56be41e73249a7dcc157abd704d8a0e998b2c1c2e2d5de6461 + languageName: node + linkType: hard + +"css-loader@npm:^6.7.1": + version: 6.9.0 + resolution: "css-loader@npm:6.9.0" + dependencies: + icss-utils: ^5.1.0 + postcss: ^8.4.31 + postcss-modules-extract-imports: ^3.0.0 + postcss-modules-local-by-default: ^4.0.3 + postcss-modules-scope: ^3.1.0 + postcss-modules-values: ^4.0.0 + postcss-value-parser: ^4.2.0 + semver: ^7.5.4 + peerDependencies: + webpack: ^5.0.0 + checksum: 71f20ee5eb5a4a9373ab41a5c17df411cb4f6f2de037297a2b0c2150681578f4979f319f4307a61e23c231dd6546e657ae95cba5a0698ad13ca43f91d4d2a0bc + languageName: node + linkType: hard + +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: 2.0.30 + source-map-js: ^1.0.1 + checksum: 493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 + languageName: node + linkType: hard + +"csstype@npm:3.0.10": + version: 3.0.10 + resolution: "csstype@npm:3.0.10" + checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 + languageName: node + linkType: hard + +"data-urls@npm:^2.0.0": + version: 2.0.0 + resolution: "data-urls@npm:2.0.0" + dependencies: + abab: ^2.0.3 + whatwg-mimetype: ^2.3.0 + whatwg-url: ^8.0.0 + checksum: 97caf828aac25e25e04ba6869db0f99c75e6859bb5b424ada28d3e7841941ebf08ddff3c1b1bb4585986bd507a5d54c2a716853ea6cb98af877400e637393e71 + languageName: node + linkType: hard + +"debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + +"decamelize@npm:^5.0.0": + version: 5.0.1 + resolution: "decamelize@npm:5.0.1" + checksum: 7c3b1ed4b3e60e7fbc00a35fb248298527c1cdfe603e41dfcf05e6c4a8cb9efbee60630deb677ed428908fb4e74e322966c687a094d1478ddc9c3a74e9dc7140 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.2.0 + entities: ^2.0.0 + checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: ^2.2.0 + checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa + languageName: node + linkType: hard + +"domutils@npm:^2.5.2": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: ^1.0.1 + domelementtype: ^2.2.0 + domhandler: ^4.2.0 + checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 + languageName: node + linkType: hard + +"duplicate-package-checker-webpack-plugin@npm:^3.0.0": + version: 3.0.0 + resolution: "duplicate-package-checker-webpack-plugin@npm:3.0.0" + dependencies: + chalk: ^2.3.0 + find-root: ^1.0.0 + lodash: ^4.17.4 + semver: ^5.4.1 + checksum: d77be45cb72d79a429c64d8f8f7603fea681d182fb795459a3d4afa608faad9a923378a7e80c6855f465263e1983140b6fc3682bd0213228b8cd7906ab4b934d + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.601": + version: 1.4.630 + resolution: "electron-to-chromium@npm:1.4.630" + checksum: 9bf16b06b245d6937845bbef17c0babdf8e01845c8aa31eb2d7dc3a88cd34291d2dec0d8e329450a5b8dfcf5d3dc96c56aa1c8b224d942e3b1d508e9e3cb9788 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.15.0": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 + languageName: node + linkType: hard + +"envinfo@npm:^7.7.3": + version: 7.11.0 + resolution: "envinfo@npm:7.11.0" + bin: + envinfo: dist/cli.js + checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-abstract@npm:^1.22.1": + version: 1.22.3 + resolution: "es-abstract@npm:1.22.3" + dependencies: + array-buffer-byte-length: ^1.0.0 + arraybuffer.prototype.slice: ^1.0.2 + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.5 + es-set-tostringtag: ^2.0.1 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.6 + get-intrinsic: ^1.2.2 + get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + internal-slot: ^1.0.5 + is-array-buffer: ^3.0.2 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-typed-array: ^1.1.12 + is-weakref: ^1.0.2 + object-inspect: ^1.13.1 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.5.1 + safe-array-concat: ^1.0.1 + safe-regex-test: ^1.0.0 + string.prototype.trim: ^1.2.8 + string.prototype.trimend: ^1.0.7 + string.prototype.trimstart: ^1.0.7 + typed-array-buffer: ^1.0.0 + typed-array-byte-length: ^1.0.0 + typed-array-byte-offset: ^1.0.0 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.13 + checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.4.1 + resolution: "es-module-lexer@npm:1.4.1" + checksum: a11b5a256d4e8e9c7d94c2fd87415ccd1591617b6edd847e064503f8eaece2d25e2e9078a02c5ce3ed5e83bb748f5b4820efbe78072c8beb07ac619c2edec35d + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" + dependencies: + get-intrinsic: ^1.2.2 + has-tostringtag: ^1.0.0 + hasown: ^2.0.0 + checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.8.0": + version: 8.10.0 + resolution: "eslint-config-prettier@npm:8.10.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^5.0.0": + version: 5.1.3 + resolution: "eslint-plugin-prettier@npm:5.1.3" + dependencies: + prettier-linter-helpers: ^1.0.0 + synckit: ^0.8.6 + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + checksum: eb2a7d46a1887e1b93788ee8f8eb81e0b6b2a6f5a66a62bc6f375b033fc4e7ca16448da99380be800042786e76cf5c0df9c87a51a2c9b960ed47acbd7c0b9381 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.36.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.4 + "@eslint/js": 8.56.0 + "@humanwhocodes/config-array": ^0.11.13 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + "@ungap/structured-clone": ^1.2.0 + ajv: ^6.12.4 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.3 + espree: ^9.6.1 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + graphemer: ^1.4.0 + ignore: ^5.2.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.3 + strip-ansi: ^6.0.1 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: 883436d1e809b4a25d9eb03d42f584b84c408dbac28b0019f6ea07b5177940bf3cca86208f749a6a1e0039b63e085ee47aca1236c30721e91f0deef5cc5a5136 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: d22d371b994fdc8cce9ff510d7b8dc4da70ac327bcba20df607dd5b9cae9f908f4d1028f5fe467650f058d1e7270235ae0b8230809a262b4df587a3b3aa216c3 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.1": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12, fastest-levenshtein@npm:^1.0.16": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.16.0 + resolution: "fastq@npm:1.16.0" + dependencies: + reusify: ^1.0.4 + checksum: 1d40ed1f100ae625e5720484e8602b7ad07649370f1cbc3e34a6b9630a0bfed6946bab0322d8a368a1e3cde87bb9bbb8d3bc2ae01a0c1f022fac1d07c04e4feb + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"file-entry-cache@npm:^7.0.0": + version: 7.0.2 + resolution: "file-entry-cache@npm:7.0.2" + dependencies: + flat-cache: ^3.2.0 + checksum: 283c674fc26bed1c44e74cf25c2640c813e222ea30a2536404b53511ca311d4a2502ee8145a01aecd12b9a910eb4162364776be27a9683e8447332054e9d712f + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-root@npm:^1.0.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + languageName: node + linkType: hard + +"find-up@npm:^4.0.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"free-style@npm:3.1.0": + version: 3.1.0 + resolution: "free-style@npm:3.1.0" + checksum: 949258ae315deda48cac93ecd5f9a80f36e8a027e19ce2103598dc8d5ab60e963bbad5444b2a4990ddb746798dd188896f430285cf484afbf2141f7d75a191d8 + languageName: node + linkType: hard + +"fs-extra@npm:^10.1.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + functions-have-names: ^1.2.3 + checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" + dependencies: + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 + languageName: node + linkType: hard + +"glob@npm:^10.3.7": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:~7.1.6": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + languageName: node + linkType: hard + +"global-modules@npm:^2.0.0": + version: 2.0.0 + resolution: "global-modules@npm:2.0.0" + dependencies: + global-prefix: ^3.0.0 + checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 + languageName: node + linkType: hard + +"global-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "global-prefix@npm:3.0.0" + dependencies: + ini: ^1.3.5 + kind-of: ^6.0.2 + which: ^1.3.1 + checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: ^0.20.2 + checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"globjoin@npm:^0.1.4": + version: 0.1.4 + resolution: "globjoin@npm:0.1.4" + checksum: 0a47d88d566122d9e42da946453ee38b398e0021515ac6a95d13f980ba8c1e42954e05ee26cfcbffce1ac1ee094d0524b16ce1dd874ca52408d6db5c6d39985b + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.2 + checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: ^1.0.2 + checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: ^6.0.0 + checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + languageName: node + linkType: hard + +"html-tags@npm:^3.3.1": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce + languageName: node + linkType: hard + +"htmlparser2@npm:^6.0.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.0.0 + domutils: ^2.5.2 + entities: ^2.0.0 + checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"import-lazy@npm:^4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ini@npm:^1.3.5": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.5": + version: 1.0.6 + resolution: "internal-slot@npm:1.0.6" + dependencies: + get-intrinsic: ^1.2.2 + hasown: ^2.0.0 + side-channel: ^1.0.4 + checksum: 7872454888047553ce97a3fa1da7cc054a28ec5400a9c2e9f4dbe4fe7c1d041cb8e8301467614b80d4246d50377aad2fb58860b294ed74d6700cc346b6f89549 + languageName: node + linkType: hard + +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + is-typed-array: ^1.1.10 + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" + dependencies: + which-typed-array: ^1.1.11 + checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + languageName: node + linkType: hard + +"isomorphic.js@npm:^0.2.4": + version: 0.2.5 + resolution: "isomorphic.js@npm:0.2.5" + checksum: d8d1b083f05f3c337a06628b982ac3ce6db953bbef14a9de8ad49131250c3592f864b73c12030fdc9ef138ce97b76ef55c7d96a849561ac215b1b4b9d301c8e9 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-schema-compare@npm:^0.2.2": + version: 0.2.2 + resolution: "json-schema-compare@npm:0.2.2" + dependencies: + lodash: ^4.17.4 + checksum: dd6f2173857c8e3b77d6ebdfa05bd505bba5b08709ab46b532722f5d1c33b5fee1fc8f3c97d0c0d011db25f9f3b0baf7ab783bb5f55c32abd9f1201760e43c2c + languageName: node + linkType: hard + +"json-schema-merge-allof@npm:^0.8.1": + version: 0.8.1 + resolution: "json-schema-merge-allof@npm:0.8.1" + dependencies: + compute-lcm: ^1.1.2 + json-schema-compare: ^0.2.2 + lodash: ^4.17.20 + checksum: 82700f6ac77351959138d6b153d77375a8c29cf48d907241b85c8292dd77aabd8cb816400f2b0d17062c4ccc8893832ec4f664ab9c814927ef502e7a595ea873 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json5@npm:^2.1.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + languageName: node + linkType: hard + +"jsonpointer@npm:^5.0.1": + version: 5.0.1 + resolution: "jsonpointer@npm:5.0.1" + checksum: 0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c + languageName: node + linkType: hard + +"jupyterlite-capytale@workspace:.": + version: 0.0.0-use.local + resolution: "jupyterlite-capytale@workspace:." + dependencies: + "@jupyterlab/application": ^4.0.0 + "@jupyterlab/apputils": ^4.0.0 + "@jupyterlab/builder": ^4.0.0 + "@jupyterlab/notebook": ^4.0.0 + "@types/json-schema": ^7.0.11 + "@types/react": ^18.0.26 + "@types/react-addons-linked-state-mixin": ^0.14.22 + "@typescript-eslint/eslint-plugin": ^6.1.0 + "@typescript-eslint/parser": ^6.1.0 + css-loader: ^6.7.1 + eslint: ^8.36.0 + eslint-config-prettier: ^8.8.0 + eslint-plugin-prettier: ^5.0.0 + npm-run-all: ^4.1.5 + prettier: ^3.0.0 + rimraf: ^5.0.1 + source-map-loader: ^1.0.2 + style-loader: ^3.3.1 + stylelint: ^15.10.1 + stylelint-config-recommended: ^13.0.0 + stylelint-config-standard: ^34.0.0 + stylelint-csstree-validator: ^3.0.0 + stylelint-prettier: ^4.0.0 + typescript: ~5.0.2 + yjs: ^13.5.0 + languageName: unknown + linkType: soft + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + languageName: node + linkType: hard + +"known-css-properties@npm:^0.29.0": + version: 0.29.0 + resolution: "known-css-properties@npm:0.29.0" + checksum: daa6562e907f856cbfd58a00c42f532c9bba283388984da6a3bffb494e56612e5f23c52f30b0d9885f0ea07ad5d88bfa0470ee65017a6ce6c565289a1afd78af + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"lib0@npm:^0.2.85, lib0@npm:^0.2.86": + version: 0.2.88 + resolution: "lib0@npm:0.2.88" + dependencies: + isomorphic.js: ^0.2.4 + bin: + 0gentesthtml: bin/gentesthtml.js + 0serve: bin/0serve.js + checksum: 1ac13d6781f4d29aa317ad9fb9b6c41e8bed52b096a369f54d10d9b8651ceb4a0a63b06c01c2e1c7319d3bb74668afb6cac3735161b32031f185cec024bbba37 + languageName: node + linkType: hard + +"license-webpack-plugin@npm:^2.3.14": + version: 2.3.21 + resolution: "license-webpack-plugin@npm:2.3.21" + dependencies: + "@types/webpack-sources": ^0.1.5 + webpack-sources: ^1.2.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 6208bd2060d200fbffbcc89702c929d50c5a4a3f2158b046cf813b3f7f728bbbe4611b9fea2d67843bb5e7d64ad9122cc368a19ac73f5c4ad41765e6283bdc0c + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.2 + parse-json: ^4.0.0 + pify: ^3.0.0 + strip-bom: ^3.0.0 + checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.0": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: ^5.2.2 + emojis-list: ^3.0.0 + json5: ^2.1.2 + checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 + languageName: node + linkType: hard + +"lodash.escape@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.escape@npm:4.0.1" + checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.mergewith@npm:^4.6.1": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: ^3.0.0 || ^4.0.0 + bin: + loose-envify: cli.js + checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab + languageName: node + linkType: hard + +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + languageName: node + linkType: hard + +"map-obj@npm:^4.1.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + languageName: node + linkType: hard + +"markdown-to-jsx@npm:^7.4.0": + version: 7.4.0 + resolution: "markdown-to-jsx@npm:7.4.0" + peerDependencies: + react: ">= 0.14.0" + checksum: 59959d14d7927ed8a97e42d39771e2b445b90fa098477fb6ab040f044d230517dc4a95ba38a4f924cfc965a96b32211d93def150a6184f0e51d2cefdc8cb415d + languageName: node + linkType: hard + +"mathml-tag-names@npm:^2.1.3": + version: 2.1.3 + resolution: "mathml-tag-names@npm:2.1.3" + checksum: 1201a25a137d6b9e328facd67912058b8b45b19a6c4cc62641c9476195da28a275ca6e0eca070af5378b905c2b11abc1114676ba703411db0b9ce007de921ad0 + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa + languageName: node + linkType: hard + +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 + languageName: node + linkType: hard + +"meow@npm:^10.1.5": + version: 10.1.5 + resolution: "meow@npm:10.1.5" + dependencies: + "@types/minimist": ^1.2.2 + camelcase-keys: ^7.0.0 + decamelize: ^5.0.0 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.2 + read-pkg-up: ^8.0.0 + redent: ^4.0.0 + trim-newlines: ^4.0.2 + type-fest: ^1.2.2 + yargs-parser: ^20.2.9 + checksum: dd5f0caa4af18517813547dc66741dcbf52c4c23def5062578d39b11189fd9457aee5c1f2263a5cd6592a465023df8357e8ac876b685b64dbcf545e3f66c23a7 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.27": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"min-indent@npm:^1.0.1": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + +"mini-css-extract-plugin@npm:^2.7.0": + version: 2.7.7 + resolution: "mini-css-extract-plugin@npm:2.7.7" + dependencies: + schema-utils: ^4.0.0 + peerDependencies: + webpack: ^5.0.0 + checksum: 04af0e7d8c1a4ff31c70ac2d0895837dae3d51cce3bfd90e3c1d90d50eef7de21778361a3064531df046d775d80b3bf056324dddea93831c7def2047c5aa8718 + languageName: node + linkType: hard + +"mini-svg-data-uri@npm:^1.4.4": + version: 1.4.4 + resolution: "mini-svg-data-uri@npm:1.4.4" + bin: + mini-svg-data-uri: cli.js + checksum: 997f1fbd8d59a70f03761e18626d335197a3479cb9d1ff75678e4b64b864d32a0b8fc18115eabde035e5299b8b4a354a78e57dd6ac10f9d604162a6170898d09 + languageName: node + linkType: hard + +"minimatch@npm:9.0.3, minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: ^1.0.1 + is-plain-obj: ^1.1.0 + kind-of: ^6.0.3 + checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + languageName: node + linkType: hard + +"minimist@npm:~1.2.0": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff + languageName: node + linkType: hard + +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: ^2.1.4 + resolve: ^1.10.0 + semver: 2 || 3 || 4 || 5 + validate-npm-package-license: ^3.0.1 + checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + languageName: node + linkType: hard + +"normalize-package-data@npm:^3.0.2": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: ^4.0.1 + is-core-module: ^2.5.0 + semver: ^7.3.4 + validate-npm-package-license: ^3.0.1 + checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-all@npm:^4.1.5": + version: 4.1.5 + resolution: "npm-run-all@npm:4.1.5" + dependencies: + ansi-styles: ^3.2.1 + chalk: ^2.4.1 + cross-spawn: ^6.0.5 + memorystream: ^0.3.1 + minimatch: ^3.0.4 + pidtree: ^0.3.0 + read-pkg: ^3.0.0 + shell-quote: ^1.6.1 + string.prototype.padend: ^3.0.0 + bin: + npm-run-all: bin/npm-run-all/index.js + run-p: bin/run-p/index.js + run-s: bin/run-s/index.js + checksum: 373b72c6a36564da13c1642c1fd9bb4dcc756bce7a3648f883772f02661095319820834ff813762d2fee403e9b40c1cd27c8685807c107440f10eb19c006d4a0 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: ^1.0.5 + define-properties: ^1.2.1 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + dependencies: + "@aashutoshrathi/word-wrap": ^1.2.3 + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: ^1.3.1 + json-parse-better-errors: ^1.0.1 + checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 + languageName: node + linkType: hard + +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"parse-srcset@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-srcset@npm:1.0.2" + checksum: 3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf + languageName: node + linkType: hard + +"path-browserify@npm:^1.0.0": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: ^3.0.0 + checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pidtree@npm:^0.3.0": + version: 0.3.1 + resolution: "pidtree@npm:0.3.1" + bin: + pidtree: bin/pidtree.js + checksum: eb49025099f1af89a4696f7673351421f13420f3397b963c901fe23a1c9c2ff50f4750321970d4472c0ffbb065e4a6c3c27f75e226cc62284b19e21d32ce7012 + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-modules-extract-imports@npm:3.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 4b65f2f1382d89c4bc3c0a1bdc5942f52f3cb19c110c57bd591ffab3a5fee03fcf831604168205b0c1b631a3dce2255c70b61aaae3ef39d69cd7eb450c2552d2 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.3": + version: 4.0.3 + resolution: "postcss-modules-local-by-default@npm:4.0.3" + dependencies: + icss-utils: ^5.0.0 + postcss-selector-parser: ^6.0.2 + postcss-value-parser: ^4.1.0 + peerDependencies: + postcss: ^8.1.0 + checksum: 2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-scope@npm:3.1.0" + dependencies: + postcss-selector-parser: ^6.0.4 + peerDependencies: + postcss: ^8.1.0 + checksum: 919d02e2e31956fa3dae2036d4f3259c9b8c5361bd58ee55867edededbee03507df88e98f418b5e553e47f3888daba9ea9ef0b18a82c41cf96cdb74df15322c7 + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: ^5.0.0 + peerDependencies: + postcss: ^8.1.0 + checksum: f7f2cdf14a575b60e919ad5ea52fed48da46fe80db2733318d71d523fc87db66c835814940d7d05b5746b0426e44661c707f09bdb83592c16aea06e859409db6 + languageName: node + linkType: hard + +"postcss-resolve-nested-selector@npm:^0.1.1": + version: 0.1.1 + resolution: "postcss-resolve-nested-selector@npm:0.1.1" + checksum: b08fb76ab092a09ee01328bad620a01dcb445ac5eb02dd0ed9ed75217c2f779ecb3bf99a361c46e695689309c08c09f1a1ad7354c8d58c2c2c40d364657fcb08 + languageName: node + linkType: hard + +"postcss-safe-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-safe-parser@npm:6.0.0" + peerDependencies: + postcss: ^8.3.3 + checksum: 06c733eaad83a3954367e7ee02ddfe3796e7a44d4299ccf9239f40964a4daac153c7d77613f32964b5a86c0c6c2f6167738f31d578b73b17cb69d0c4446f0ebe + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": + version: 6.0.15 + resolution: "postcss-selector-parser@npm:6.0.15" + dependencies: + cssesc: ^3.0.0 + util-deprecate: ^1.0.2 + checksum: 57decb94152111004f15e27b9c61131eb50ee10a3288e7fcf424cebbb4aba82c2817517ae718f8b5d704ee9e02a638d4a2acff8f47685c295a33ecee4fd31055 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f + languageName: node + linkType: hard + +"postcss@npm:^8.3.11, postcss@npm:^8.4.28, postcss@npm:^8.4.31": + version: 8.4.33 + resolution: "postcss@npm:8.4.33" + dependencies: + nanoid: ^3.3.7 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 6f98b2af4b76632a3de20c4f47bf0e984a1ce1a531cf11adcb0b1d63a6cbda0aae4165e578b66c32ca4879038e3eaad386a6be725a8fb4429c78e3c1ab858fe9 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: ^1.1.2 + checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + languageName: node + linkType: hard + +"prettier@npm:^3.0.0": + version: 3.2.1 + resolution: "prettier@npm:3.2.1" + bin: + prettier: bin/prettier.cjs + checksum: 01a5fcf1db4e8172365473e540a328304e501a20bf9b4577e359e431e480d602bcf082d51020aba24bd70ceda528632c6ff8039cedb2d430aeb4af2ca7652817 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: ^1.4.0 + object-assign: ^4.1.1 + react-is: ^16.13.1 + checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 + languageName: node + linkType: hard + +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: ^5.1.0 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + languageName: node + linkType: hard + +"react-dom@npm:^18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.0 + peerDependencies: + react: ^18.2.0 + checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f + languageName: node + linkType: hard + +"react-is@npm:^18.2.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + +"react@npm:^18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + languageName: node + linkType: hard + +"read-pkg-up@npm:^8.0.0": + version: 8.0.0 + resolution: "read-pkg-up@npm:8.0.0" + dependencies: + find-up: ^5.0.0 + read-pkg: ^6.0.0 + type-fest: ^1.0.1 + checksum: fe4c80401656b40b408884457fffb5a8015c03b1018cfd8e48f8d82a5e9023e24963603aeb2755608d964593e046c15b34d29b07d35af9c7aa478be81805209c + languageName: node + linkType: hard + +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: ^4.0.0 + normalize-package-data: ^2.3.2 + path-type: ^3.0.0 + checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 + languageName: node + linkType: hard + +"read-pkg@npm:^6.0.0": + version: 6.0.0 + resolution: "read-pkg@npm:6.0.0" + dependencies: + "@types/normalize-package-data": ^2.4.0 + normalize-package-data: ^3.0.2 + parse-json: ^5.2.0 + type-fest: ^1.0.1 + checksum: 0cebdff381128e923815c643074a87011070e5fc352bee575d327d6485da3317fab6d802a7b03deeb0be7be8d3ad1640397b3d5d2f044452caf4e8d1736bf94f + languageName: node + linkType: hard + +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: ^1.20.0 + checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 + languageName: node + linkType: hard + +"redent@npm:^4.0.0": + version: 4.0.0 + resolution: "redent@npm:4.0.0" + dependencies: + indent-string: ^5.0.0 + strip-indent: ^4.0.0 + checksum: 6944e7b1d8f3fd28c2515f5c605b9f7f0ea0f4edddf41890bbbdd4d9ee35abb7540c3b278f03ff827bd278bb6ff4a5bd8692ca406b748c5c1c3ce7355e9fbf8f + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.1": + version: 1.5.1 + resolution: "regexp.prototype.flags@npm:1.5.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + set-function-name: ^2.0.0 + checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.20.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"rimraf@npm:^5.0.1": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" + dependencies: + glob: ^10.3.7 + bin: + rimraf: dist/esm/bin.mjs + checksum: d66eef829b2e23b16445f34e73d75c7b7cf4cbc8834b04720def1c8f298eb0753c3d76df77325fad79d0a2c60470525d95f89c2475283ad985fd7441c32732d1 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-array-concat@npm:1.0.1" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.1.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.2 + resolution: "safe-regex-test@npm:1.0.2" + dependencies: + call-bind: ^1.0.5 + get-intrinsic: ^1.2.2 + is-regex: ^1.1.4 + checksum: 4af5ce05a2daa4f6d4bfd5a3c64fc33d6b886f6592122e93c0efad52f7147b9b605e5ffc03c269a1e3d1f8db2a23bc636628a961c9fd65bafdc09503330673fd + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"sanitize-html@npm:~2.7.3": + version: 2.7.3 + resolution: "sanitize-html@npm:2.7.3" + dependencies: + deepmerge: ^4.2.2 + escape-string-regexp: ^4.0.0 + htmlparser2: ^6.0.0 + is-plain-object: ^5.0.0 + parse-srcset: ^1.0.2 + postcss: ^8.3.11 + checksum: 2399d1fdbbc3a263fb413c1fe1971b3dc2b51abc6cc5cb49490624539d1c57a8fe31e2b21408c118e2a957f4e673e3169b1f9a5807654408f17b130a9d78aed7 + languageName: node + linkType: hard + +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" + dependencies: + loose-envify: ^1.1.0 + checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + languageName: node + linkType: hard + +"schema-utils@npm:^2.7.0": + version: 2.7.1 + resolution: "schema-utils@npm:2.7.1" + dependencies: + "@types/json-schema": ^7.0.5 + ajv: ^6.12.4 + ajv-keywords: ^3.5.2 + checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b + languageName: node + linkType: hard + +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": ^7.0.9 + ajv: ^8.9.0 + ajv-formats: ^2.1.1 + ajv-keywords: ^5.1.0 + checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 + languageName: node + linkType: hard + +"semver@npm:^7.3.4, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: ^2.1.0 + checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 + languageName: node + linkType: hard + +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: ^1.1.1 + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.0": + version: 2.0.1 + resolution: "set-function-name@npm:2.0.1" + dependencies: + define-data-property: ^1.0.1 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.0 + checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: ^6.0.2 + checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: ^1.0.0 + checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shell-quote@npm:^1.6.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + +"source-list-map@npm:^2.0.0": + version: 2.0.1 + resolution: "source-list-map@npm:2.0.1" + checksum: 806efc6f75e7cd31e4815e7a3aaf75a45c704871ea4075cb2eb49882c6fca28998f44fc5ac91adb6de03b2882ee6fb02f951fdc85e6a22b338c32bfe19557938 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + +"source-map-loader@npm:^1.0.2": + version: 1.1.3 + resolution: "source-map-loader@npm:1.1.3" + dependencies: + abab: ^2.0.5 + iconv-lite: ^0.6.2 + loader-utils: ^2.0.0 + schema-utils: ^3.0.0 + source-map: ^0.6.1 + whatwg-mimetype: ^2.3.0 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 0ca16a1458f206e12925f242ce52913b5f35de657d2ec17fd60ab3de7fa85b72b6707951b7a18899bdf05679d679a8b9edeb660c557aafa66453886d6907e3ec + languageName: node + linkType: hard + +"source-map-loader@npm:~1.0.2": + version: 1.0.2 + resolution: "source-map-loader@npm:1.0.2" + dependencies: + data-urls: ^2.0.0 + iconv-lite: ^0.6.2 + loader-utils: ^2.0.0 + schema-utils: ^2.7.0 + source-map: ^0.6.1 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 0360b536e904f8fea452d0e122b9199661765229dc62a4b8093cc9d14e985f2ddd146355ede6d11acdd0b9bf4639b364e2526afcf9d3218ed45af63aa5eb053f + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: ^3.0.0 + spdx-license-ids: ^3.0.0 + checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.16 + resolution: "spdx-license-ids@npm:3.0.16" + checksum: 5cdaa85aaa24bd02f9353a2e357b4df0a4f205cb35655f3fd0a5674a4fb77081f28ffd425379214bc3be2c2b7593ce1215df6bcc75884aeee0a9811207feabe2 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string.prototype.padend@npm:^3.0.0": + version: 3.1.5 + resolution: "string.prototype.padend@npm:3.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: fc915e0b6ae1dce07a9f5088429d84fda2c1c0ac9a05bc14a602f173cc2fdef32e4893dfba5656f8f955450c9c16deebdb8d303d27613a367bc6d8508a94cd5e + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-indent@npm:4.0.0" + dependencies: + min-indent: ^1.0.1 + checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"style-loader@npm:^3.3.1, style-loader@npm:~3.3.1": + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" + peerDependencies: + webpack: ^5.0.0 + checksum: caac3f2fe2c3c89e49b7a2a9329e1cfa515ecf5f36b9c4885f9b218019fda207a9029939b2c35821dec177a264a007e7c391ccdd3ff7401881ce6287b9c8f38b + languageName: node + linkType: hard + +"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": + version: 4.1.0 + resolution: "style-mod@npm:4.1.0" + checksum: 8402b14ca11113a3640d46b3cf7ba49f05452df7846bc5185a3535d9b6a64a3019e7fb636b59ccbb7816aeb0725b24723e77a85b05612a9360e419958e13b4e6 + languageName: node + linkType: hard + +"style-search@npm:^0.1.0": + version: 0.1.0 + resolution: "style-search@npm:0.1.0" + checksum: 3cfefe335033aad6d47da0725cb48f5db91a73935954c77eab77d9e415e6668cdb406da4a4f7ef9f1aca77853cf5ba7952c45e869caa5bd6439691d88098d468 + languageName: node + linkType: hard + +"stylelint-config-recommended@npm:^13.0.0": + version: 13.0.0 + resolution: "stylelint-config-recommended@npm:13.0.0" + peerDependencies: + stylelint: ^15.10.0 + checksum: a56eb6d1a7c7f3a7a172b54bc34218859ba22a5a06816fb4d0964f66cb83cf372062f2c97830e994ad68243548e15fc49abf28887c3261ab1b471b3aa69f8e82 + languageName: node + linkType: hard + +"stylelint-config-standard@npm:^34.0.0": + version: 34.0.0 + resolution: "stylelint-config-standard@npm:34.0.0" + dependencies: + stylelint-config-recommended: ^13.0.0 + peerDependencies: + stylelint: ^15.10.0 + checksum: 536249800c04b48a9c354067765f042713982e8222be17bb897a27d26546e50adfb87e6f1e4541807d720de3554345da99ab470e13e8d7ab0ab326c73ae3df61 + languageName: node + linkType: hard + +"stylelint-csstree-validator@npm:^3.0.0": + version: 3.0.0 + resolution: "stylelint-csstree-validator@npm:3.0.0" + dependencies: + css-tree: ^2.3.1 + peerDependencies: + stylelint: ">=7.0.0 <16.0.0" + checksum: e518c8c17714022946b7637c23a6816fd2ccdd6052a19c5a138b3f7ce9b913ead9c612ac4401e102f14800a19967dbfd4b588b44cbf3f3c6a5984bef7bda4017 + languageName: node + linkType: hard + +"stylelint-prettier@npm:^4.0.0": + version: 4.1.0 + resolution: "stylelint-prettier@npm:4.1.0" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + prettier: ">=3.0.0" + stylelint: ">=15.8.0" + checksum: bbeb7e0dd49099c43297e88a61385b39f4b5810c8bfcc972d5b2706b6a7e14a8eefd5f9e623841cf3127111a8859eb624a3e7cc1bc5197c83c55c6c9a616a4d2 + languageName: node + linkType: hard + +"stylelint@npm:^15.10.1": + version: 15.11.0 + resolution: "stylelint@npm:15.11.0" + dependencies: + "@csstools/css-parser-algorithms": ^2.3.1 + "@csstools/css-tokenizer": ^2.2.0 + "@csstools/media-query-list-parser": ^2.1.4 + "@csstools/selector-specificity": ^3.0.0 + balanced-match: ^2.0.0 + colord: ^2.9.3 + cosmiconfig: ^8.2.0 + css-functions-list: ^3.2.1 + css-tree: ^2.3.1 + debug: ^4.3.4 + fast-glob: ^3.3.1 + fastest-levenshtein: ^1.0.16 + file-entry-cache: ^7.0.0 + global-modules: ^2.0.0 + globby: ^11.1.0 + globjoin: ^0.1.4 + html-tags: ^3.3.1 + ignore: ^5.2.4 + import-lazy: ^4.0.0 + imurmurhash: ^0.1.4 + is-plain-object: ^5.0.0 + known-css-properties: ^0.29.0 + mathml-tag-names: ^2.1.3 + meow: ^10.1.5 + micromatch: ^4.0.5 + normalize-path: ^3.0.0 + picocolors: ^1.0.0 + postcss: ^8.4.28 + postcss-resolve-nested-selector: ^0.1.1 + postcss-safe-parser: ^6.0.0 + postcss-selector-parser: ^6.0.13 + postcss-value-parser: ^4.2.0 + resolve-from: ^5.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + style-search: ^0.1.0 + supports-hyperlinks: ^3.0.0 + svg-tags: ^1.0.0 + table: ^6.8.1 + write-file-atomic: ^5.0.1 + bin: + stylelint: bin/stylelint.mjs + checksum: 9835f8a3e3976a3b81a35569d08f5f4a9c3b5cff415f1345a505870afc0c3231acff27f119d937c5bb11fdbc98d554af564c2a648a52604280a59a11974fcbfc + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-hyperlinks@npm:^3.0.0": + version: 3.0.0 + resolution: "supports-hyperlinks@npm:3.0.0" + dependencies: + has-flag: ^4.0.0 + supports-color: ^7.0.0 + checksum: 41021305de5255b10d821bf93c7a781f783e1693d0faec293d7fc7ccf17011b90bde84b0295fa92ba75c6c390351fe84fdd18848cad4bf656e464a958243c3e7 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"svg-tags@npm:^1.0.0": + version: 1.0.0 + resolution: "svg-tags@npm:1.0.0" + checksum: 407e5ef87cfa2fb81c61d738081c2decd022ce13b922d035b214b49810630bf5d1409255a4beb3a940b77b32f6957806deff16f1bf0ce1ab11c7a184115a0b7f + languageName: node + linkType: hard + +"synckit@npm:^0.8.6": + version: 0.8.8 + resolution: "synckit@npm:0.8.8" + dependencies: + "@pkgr/core": ^0.1.0 + tslib: ^2.6.2 + checksum: 9ed5d33abb785f5f24e2531efd53b2782ca77abf7912f734d170134552b99001915531be5a50297aa45c5701b5c9041e8762e6cd7a38e41e2461c1e7fccdedf8 + languageName: node + linkType: hard + +"table@npm:^6.8.1": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + languageName: node + linkType: hard + +"tapable@npm:^2.1.1, tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.7": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": ^0.3.20 + jest-worker: ^27.4.5 + schema-utils: ^3.1.1 + serialize-javascript: ^6.0.1 + terser: ^5.26.0 + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: bd6e7596cf815f3353e2a53e79cbdec959a1b0276f5e5d4e63e9d7c3c5bb5306df567729da287d1c7b39d79093e56863c569c42c6c24cc34c76aa313bd2cbcea + languageName: node + linkType: hard + +"terser@npm:^5.26.0": + version: 5.26.0 + resolution: "terser@npm:5.26.0" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.8.2 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: 02a9bb896f04df828025af8f0eced36c315d25d310b6c2418e7dad2bed19ddeb34a9cea9b34e7c24789830fa51e1b6a9be26679980987a9c817a7e6d9cd4154b + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"tr46@npm:^2.1.0": + version: 2.1.0 + resolution: "tr46@npm:2.1.0" + dependencies: + punycode: ^2.1.1 + checksum: ffe6049b9dca3ae329b059aada7f515b0f0064c611b39b51ff6b53897e954650f6f63d9319c6c008d36ead477c7b55e5f64c9dc60588ddc91ff720d64eb710b3 + languageName: node + linkType: hard + +"trim-newlines@npm:^4.0.2": + version: 4.1.1 + resolution: "trim-newlines@npm:4.1.1" + checksum: 5b09f8e329e8f33c1111ef26906332ba7ba7248cde3e26fc054bb3d69f2858bf5feedca9559c572ff91f33e52977c28e0d41c387df6a02a633cbb8c2d8238627 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + languageName: node + linkType: hard + +"tslib@npm:^2.6.2": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"type-fest@npm:^1.0.1, type-fest@npm:^1.2.1, type-fest@npm:^1.2.2": + version: 1.4.0 + resolution: "type-fest@npm:1.4.0" + checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + is-typed-array: ^1.1.10 + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + +"typescript@npm:~5.0.2": + version: 5.0.4 + resolution: "typescript@npm:5.0.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 + languageName: node + linkType: hard + +"typescript@patch:typescript@~5.0.2#~builtin": + version: 5.0.4 + resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=85af82" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: bb309d320c59a26565fb3793dba550576ab861018ff3fd1b7fccabbe46ae4a35546bc45f342c0a0b6f265c801ccdf64ffd68f548f117ceb7f0eac4b805cd52a9 + languageName: node + linkType: hard + +"typestyle@npm:^2.0.4": + version: 2.4.0 + resolution: "typestyle@npm:2.4.0" + dependencies: + csstype: 3.0.10 + free-style: 3.1.0 + checksum: 8b4f02c24f67b594f98507b15a753dabd4db5eb0af007e1d310527c64030e11e9464b25b5a6bc65fb5eec9a4459a8336050121ecc29063ac87b8b47a6d698893 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"url-parse@npm:~1.5.4": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.2": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: ^3.0.0 + spdx-expression-parse: ^3.0.0 + checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + languageName: node + linkType: hard + +"validate.io-array@npm:^1.0.3": + version: 1.0.6 + resolution: "validate.io-array@npm:1.0.6" + checksum: 54eca83ebc702e3e46499f9d9e77287a95ae25c4e727cd2fafee29c7333b3a36cca0c5d8f090b9406262786de80750fba85e7e7ef41e20bf8cc67d5570de449b + languageName: node + linkType: hard + +"validate.io-function@npm:^1.0.2": + version: 1.0.2 + resolution: "validate.io-function@npm:1.0.2" + checksum: e4cce2479a20cb7c42e8630c777fb107059c27bc32925f769e3a73ca5fd62b4892d897b3c80227e14d5fcd1c5b7d05544e0579d63e59f14034c0052cda7f7c44 + languageName: node + linkType: hard + +"validate.io-integer-array@npm:^1.0.0": + version: 1.0.0 + resolution: "validate.io-integer-array@npm:1.0.0" + dependencies: + validate.io-array: ^1.0.3 + validate.io-integer: ^1.0.4 + checksum: 5f6d7fab8df7d2bf546a05e830201768464605539c75a2c2417b632b4411a00df84b462f81eac75e1be95303e7e0ac92f244c137424739f4e15cd21c2eb52c7f + languageName: node + linkType: hard + +"validate.io-integer@npm:^1.0.4": + version: 1.0.5 + resolution: "validate.io-integer@npm:1.0.5" + dependencies: + validate.io-number: ^1.0.3 + checksum: 88b3f8bb5a5277a95305d64abbfc437079220ce4f57a148cc6113e7ccec03dd86b10a69d413982602aa90a62b8d516148a78716f550dcd3aff863ac1c2a7a5e6 + languageName: node + linkType: hard + +"validate.io-number@npm:^1.0.3": + version: 1.0.3 + resolution: "validate.io-number@npm:1.0.3" + checksum: 42418aeb6c969efa745475154fe576809b02eccd0961aad0421b090d6e7a12d23a3e28b0d5dddd2c6347c1a6bdccb82bba5048c716131cd20207244d50e07282 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:8.2.0, vscode-jsonrpc@npm:^8.0.2": + version: 8.2.0 + resolution: "vscode-jsonrpc@npm:8.2.0" + checksum: f302a01e59272adc1ae6494581fa31c15499f9278df76366e3b97b2236c7c53ebfc71efbace9041cfd2caa7f91675b9e56f2407871a1b3c7f760a2e2ee61484a + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:^6.0.0": + version: 6.0.0 + resolution: "vscode-jsonrpc@npm:6.0.0" + checksum: 3a67a56f287e8c449f2d9752eedf91e704dc7b9a326f47fb56ac07667631deb45ca52192e9bccb2ab108764e48409d70fa64b930d46fc3822f75270b111c5f53 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:^3.17.0": + version: 3.17.5 + resolution: "vscode-languageserver-protocol@npm:3.17.5" + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + checksum: dfb42d276df5dfea728267885b99872ecff62f6c20448b8539fae71bb196b420f5351c5aca7c1047bf8fb1f89fa94a961dce2bc5bf7e726198f4be0bb86a1e71 + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-types@npm:3.17.5" + checksum: 79b420e7576398d396579ca3a461c9ed70e78db4403cd28bbdf4d3ed2b66a2b4114031172e51fad49f0baa60a2180132d7cb2ea35aa3157d7af3c325528210ac + languageName: node + linkType: hard + +"vscode-ws-jsonrpc@npm:~1.0.2": + version: 1.0.2 + resolution: "vscode-ws-jsonrpc@npm:1.0.2" + dependencies: + vscode-jsonrpc: ^8.0.2 + checksum: eb2fdb5c96f124326505f06564dfc6584318b748fd6e39b4c0ba16a0d383d13ba0e9433596abdb841428dfc2a5501994c3206723d1cb38c6af5fcac1faf4be26 + languageName: node + linkType: hard + +"w3c-keyname@npm:^2.2.4": + version: 2.2.8 + resolution: "w3c-keyname@npm:2.2.8" + checksum: 95bafa4c04fa2f685a86ca1000069c1ec43ace1f8776c10f226a73296caeddd83f893db885c2c220ebeb6c52d424e3b54d7c0c1e963bbf204038ff1a944fbb07 + languageName: node + linkType: hard + +"watchpack@npm:^2.4.0": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" + dependencies: + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.1.2 + checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 + languageName: node + linkType: hard + +"webidl-conversions@npm:^6.1.0": + version: 6.1.0 + resolution: "webidl-conversions@npm:6.1.0" + checksum: 1f526507aa491f972a0c1409d07f8444e1d28778dfa269a9971f2e157182f3d496dc33296e4ed45b157fdb3bf535bb90c90bf10c50dcf1dd6caacb2a34cc84fb + languageName: node + linkType: hard + +"webpack-cli@npm:^5.0.1": + version: 5.1.4 + resolution: "webpack-cli@npm:5.1.4" + dependencies: + "@discoveryjs/json-ext": ^0.5.0 + "@webpack-cli/configtest": ^2.1.1 + "@webpack-cli/info": ^2.0.2 + "@webpack-cli/serve": ^2.0.5 + colorette: ^2.0.14 + commander: ^10.0.1 + cross-spawn: ^7.0.3 + envinfo: ^7.7.3 + fastest-levenshtein: ^1.0.12 + import-local: ^3.0.2 + interpret: ^3.1.1 + rechoir: ^0.8.0 + webpack-merge: ^5.7.3 + peerDependencies: + webpack: 5.x.x + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: bin/cli.js + checksum: 3a4ad0d0342a6815c850ee4633cc2a8a5dae04f918e7847f180bf24ab400803cf8a8943707ffbed03eb20fe6ce647f996f60a2aade87b0b4a9954da3da172ce0 + languageName: node + linkType: hard + +"webpack-merge@npm:^5.7.3, webpack-merge@npm:^5.8.0": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: ^4.0.1 + flat: ^5.0.2 + wildcard: ^2.0.0 + checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f + languageName: node + linkType: hard + +"webpack-sources@npm:^1.2.0": + version: 1.4.3 + resolution: "webpack-sources@npm:1.4.3" + dependencies: + source-list-map: ^2.0.0 + source-map: ~0.6.1 + checksum: 37463dad8d08114930f4bc4882a9602941f07c9f0efa9b6bc78738cd936275b990a596d801ef450d022bb005b109b9f451dd087db2f3c9baf53e8e22cf388f79 + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 + languageName: node + linkType: hard + +"webpack@npm:^5.76.1": + version: 5.89.0 + resolution: "webpack@npm:5.89.0" + dependencies: + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 + acorn: ^8.7.1 + acorn-import-assertions: ^1.9.0 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.15.0 + es-module-lexer: ^1.2.1 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.2.0 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.3.7 + watchpack: ^2.4.0 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 43fe0dbc30e168a685ef5a86759d5016a705f6563b39a240aa00826a80637d4a3deeb8062e709d6a4b05c63e796278244c84b04174704dc4a37bedb0f565c5ed + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^2.3.0": + version: 2.3.0 + resolution: "whatwg-mimetype@npm:2.3.0" + checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 + languageName: node + linkType: hard + +"whatwg-url@npm:^8.0.0": + version: 8.7.0 + resolution: "whatwg-url@npm:8.7.0" + dependencies: + lodash: ^4.7.0 + tr46: ^2.1.0 + webidl-conversions: ^6.1.0 + checksum: a87abcc6cefcece5311eb642858c8fdb234e51ec74196bfacf8def2edae1bfbffdf6acb251646ed6301f8cee44262642d8769c707256125a91387e33f405dd1e + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "which-typed-array@npm:1.1.13" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.4 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: 3828a0d5d72c800e369d447e54c7620742a4cc0c9baf1b5e8c17e9b6ff90d8d861a3a6dd4800f1953dbf80e5e5cec954a289e5b4a223e3bee4aeb1f8c5f33309 + languageName: node + linkType: hard + +"which@npm:^1.2.9, which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: ^2.0.0 + bin: + which: ./bin/which + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wildcard@npm:^2.0.0": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c + languageName: node + linkType: hard + +"worker-loader@npm:^3.0.2": + version: 3.0.8 + resolution: "worker-loader@npm:3.0.8" + dependencies: + loader-utils: ^2.0.0 + schema-utils: ^3.0.0 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 84f4a7eeb2a1d8b9704425837e017c91eedfae67ac89e0b866a2dcf283323c1dcabe0258196278b7d5fd0041392da895c8a0c59ddf3a94f1b2e003df68ddfec3 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^4.0.1 + checksum: 8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9 + languageName: node + linkType: hard + +"ws@npm:^8.11.0": + version: 8.16.0 + resolution: "ws@npm:8.16.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b + languageName: node + linkType: hard + +"y-protocols@npm:^1.0.5": + version: 1.0.6 + resolution: "y-protocols@npm:1.0.6" + dependencies: + lib0: ^0.2.85 + peerDependencies: + yjs: ^13.0.0 + checksum: 4b57c8811befcf2e45c3d47830005f8a33e626c734f78a42fe8a4fa3caad2233ba85a7c8bceefbd52ffc40130d3f3faee664fd0d1c324ff1fa8817a056ccdc1c + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.9": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + languageName: node + linkType: hard + +"yjs@npm:^13.5.0, yjs@npm:^13.5.40": + version: 13.6.10 + resolution: "yjs@npm:13.6.10" + dependencies: + lib0: ^0.2.86 + checksum: 027adf7fb6739debc44fa1a74f5e87248e026c582b65872c0a1b26aca0110f7a04605f77a38643ea562b9165d6c84e7a9311407e01a07870ebdafce008fc7ba4 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard